无法让sql server compact 3.5 / 4与ASP .NET MVC 2一起工作

我正在使用Visual Studio 2008 Pro。

我可能在这里丢失了一些非常明显的东西,但是我一直在试图让CTP for Sql Server compact 4在我的asp.net mvc应用程序中工作。 我可以find如何设置这个或一个工作示例应用程序的指令旁边。 我的目标是一个私人安装,所以我可以将其包含在我的networking应用程序,而不必做我的域名托pipe的SQL服务器设置。 这只是我拍摄的风,试图弄清楚这一点。 我不打算主办一个市场或任何与此。

所以,我已经将所有安装在基本4.0方向的dll(c:\ Program Files \ Sql Server compact \ v4.0)复制到我的应用程序中的lib文件夹中。 我已经设置副本输出方向选项“复制,如果更新”。 然后,我引用System.Data.SqlServerCE DLL并将“复制本地”设置为True。

我通过Sql Studio Express创build了一个sdf文件。 一个重要的注意事项是,我没有看到创build该文件的CE 4.0版本的选项,所以它是使用CE 3.5创build的。 我创build了几个表,向这些表中添加几行,将* .sdf文件复制到我的App_Data目录。 值得一提的是,从VS 2008开始,这个文件永远不会出现在我的项目中,但它确实存在于App_Data目录的物理位置。 我不确定这是为什么。

接下来,我只是尝试通过以下方式与我的sdf文件进行基本连接:

SqlCeConnection conn = new SqlCeConnection("DataSource=rpg.sdf"); 

这会产生下面的错误:

 Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details. 

我从这里开始,我只是试着让Sql CE 3.5工作。 我将本地安装的Sql CE 3.5升级到sp2。 我复制dll在基地址(c:\ Program Files \ Sql Server compact \ v3.5),包括从我的项目引用中删除和读取System.Data.SqlServerCE dll的版本。

这里好奇的是当我右键单击并查看引用的SqlServerCE DLL的属性时,它总是说它是版本4.0.0.1。

伙计们,我真的可以在这里用一些方向。 我已经search堆栈溢出,帮助文档,在线书籍,和谷歌search。 我真的没有发现任何东西从CE 3.5或4.0的顶部,并告诉我什么dll要添加,放在哪里,如何引用它们,如何将.sdf文件添加到我的项目,连接到它,并从中查询。 我遇到了一些IBuySpy门户样本应用程序的提及,本应该使用Sql CE 3.5,但实际上无法在msdn下载迷宫中find它。 理想情况下,我想为CE 4.0设置一个专用部署。

我是耳朵。 build议,点,不pipe将高度赞赏。 谢谢!

是的,我看到了KB。 它没有帮助

在这里看到: http : //support.microsoft.com/kb/974247

来自CORFLAG的结果

好吧,试过,这些是我的结果:C:\ Development \ Mvc2MessingAround \ Mvc2MessingAround \ bin \ Lib> corflags System.Data。 SqlServerCe.dll Microsoft(R).NET Framework CorFlags转换工具。 版本3.5.21022.8版权所有(c)Microsoft Corporation。 版权所有。

 Version : v2.0.50727 CLR Header: 2.5 PE : PE32 CorFlags : 9 ILONLY : 1 32BIT : 0 Signed : 1 

我会发誓我安装了两个版本的Sql CE(3.5 / 4)的x86版本。 安装程序可能有困惑不知何故,因为我的处理器是64位的能力,但我正在运行的Windows XP SP 3 32位。 结果似乎表明这是64位。 是这样吗?

增加的细节

迄今为止,已经在2台机器上尝试了下面的configuration。 两者都是带有64位处理器的Windows xp sp3 32位。 两者的开发环境都是VS 2008 Pro。 机器2上的结果来自Sql CE 4 Ctp的全新安装。

configuration#1

 myapp\bin\ System.Data.SqlServerCe.dll myapp\bin\private amd64 x86 myapp\bin\private\x86 sqlceca40.dll sqlcecompact40.dll sqlceer40EN.dll sqlceme40.dll sqlceqp40.dll sqlcese40.dll myapp\bin\private\amd64 sqlceca40.dll sqlcecompact40.dll sqlceer40EN.dll sqlceme40.dll sqlceqp40.dll sqlcese40.dll 

错误:

 An exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.DLL but was not handled in user code Additional information: Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details. 

码:

 SqlCeConnection conn = new SqlCeConnection(); 

configuration2

与#1相同,但在myapp \ bin方向使用System.Data.SqlServerCE.Entity.dll。

点击上面的代码之前的页面错误。 这是消息:

无法加载文件或程序集“System.Data.SqlServerCe.Entity”或其某个依赖项。 此程序集由比当前加载的运行时更新的运行时构build,无法加载。

说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的来源。

exception详细信息:System.BadImageFormatException:无法加载文件或程序集“System.Data.SqlServerCe.Entity”或它的某个依赖项。 此程序集由比当前加载的运行时更新的运行时构build,无法加载。

我已经检查了VS 2008 Pro中的项目设置,并将.Net 3.5框架设置为目标。

configuration3

与#1相同,但System.Data.SqlServerCE.dll是从myapp \ bin \ private文件夹中引用的。

结果与CONFIGURATION#1相同(错误消息是100%相同的,并且在同一行代码上发生错误)。

正确的configuration

按照埃里克的指示(如果我更仔细地跟踪他们),设置应该是

 myapp\bin x86 amd64 System.Data.SqlServerCE.dll 

直接从代码的bin文件夹中引用System.Data.SqlServerCE.dll。 我愚蠢的想着私人文件夹需要包括,但它没有。 除非使用.net 4.0解决scheme,否则不要将System.Data.SqlServerCE.Entity.dll放在bin文件夹中。 我不认为这个工作3.5 / 3.5。

有用的链接:

http://blogs.msdn.com/b/sqlservercompact/archive/2010/07/07/introducing-sql-server-compact-4-0-the-next-gen-embedded-database-from-microsoft.aspx

SQL CE 3.5不能与ASP.NET一起使用,您必须使用4.0 CTP。

从这里下载。

安装运行时。

将以下目录内容(包括x86和amd64文件夹)复制到ASP.NET应用程序的bin文件夹中:C:\ Program Files \ Microsoft SQL Server Compact Edition \ v4.0 \ Private

更新:使用Desktop文件夹中的System.Data.SqlServerCe.dll来避免中等信任问题

 myapp\bin\ System.Data.SqlServerCe.dll myapp\bin\x86 sqlceca40.dll sqlcecompact40.dll sqlceer40EN.dll sqlceme40.dll sqlceqp40.dll sqlcese40.dll myapp\bin\amd64 sqlceca40.dll sqlcecompact40.dll sqlceer40EN.dll sqlceme40.dll sqlceqp40.dll sqlcese40.dll 

添加一个引用到刚刚放在/ bin文件夹中的System.Data.SqlServerCe.dll文件。

将SQL Compact sdf文件放在App_Data文件夹中。

添加连接string:

 <connectionStrings> <add name ="NorthWind" connectionString="data source=|DataDirectory|\Nw40.sdf" /> </connectionStrings> 

连接! 🙂

 using System.Data.SqlServerCe; protected void Page_Load(object sender, EventArgs e) { using (SqlCeConnection conn = new SqlCeConnection()) { conn.ConnectionString = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; conn.Open(); using (SqlCeCommand cmd = new SqlCeCommand("SELECT TOP (1) [Category Name] FROM Categories", conn)) { string valueFromDb = (string)cmd.ExecuteScalar(); Response.Write(string.Format("{0} Time {1}", valueFromDb, DateTime.Now.ToLongTimeString())); } } } 

如果您使用的连接string使用了providerName,而您尚未安装SDK,那么您还需要将其添加到您的web.config(或app.config)

  <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/> <bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1"/> </dependentAssembly> </assemblyBinding> </runtime> <system.data> <DbProviderFactories> <remove invariant="System.Data.SqlServerCe.4.0"/> <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </DbProviderFactories> </system.data> 

注意:如果您安装了SDK,则需要“删除”,因为这会将此信息放入您的machine.config中

好的,这是一个猜测,因为你正在为他们钓鱼。

在复制到参考目录的程序集上运行corflags.exe 。 你在build什么types的机器? 如果您使用的是64位计算机,并且正在编译为x64或anyCpu,请确保corflags指出您的引用不是32位唯一引用。 也许这是“退步”在你的GAC或错误的版本。 如果它告诉你被引用的程序集只有32位,那么把你的项目编译成一个32位的项目或者find一个64位版本的DLL?

如果您使用NuGet安装SQL CE提供程序,最简单的解决scheme是添加一个生成后步骤从NuGet程序包NativeBinaries文件夹

对我来说,关键是意识到专用目录(C:\ Program Files \ Microsoft SQL Server Compact Edition \ v4.0 \ Private)中的System.Data.SqlServerCe.Entity.dll的版本是4.0.0.1,其中的版本在桌面目录下(C:\ Program Files \ Microsoft SQL Server精简版\ v4.0 \ Desktop \ System.Data.SqlServerCe.Entity)是4.0.0.0。 私人目录中的System.Data.SqlServerCe.dll版本是4.0.0.0。

我认为这是微软的一个错误,分发一个更新的SqlServerCe.Entity.dll没有相应的更新到SqlServer.dll。