无法让 sql server compact 3.5 / 4 与 ASP .NET MVC 2 一起使用
Posted
技术标签:
【中文标题】无法让 sql server compact 3.5 / 4 与 ASP .NET MVC 2 一起使用【英文标题】:Can't get sql server compact 3.5 / 4 to work with ASP .NET MVC 2 【发布时间】:2011-03-14 11:52:19 【问题描述】:我使用的是 Visual Studio 2008 Pro。
我可能在这里遗漏了一些非常明显的东西,但我一直在尝试让 Sql Server compact 4 的 CTP 在我的 asp.net mvc 应用程序中工作。我几乎找不到关于如何设置它或工作示例应用程序的说明。我的目标是私人安装,所以我可以将它包含在我的网络应用程序中,而无需在我的域托管上进行 sql server 设置。这真的只是我随心所欲地试图解决这个问题。我不打算举办市场或任何与此相关的活动。
因此,我已将安装在基本 4.0 方向 (c:\Program Files\Sql Server compact\v4.0) 的所有 dll 复制到我的应用程序的 lib 文件夹中。我已将复制到输出方向选项设置为“如果较新则复制”。然后我引用 System.Data.SqlServerCE dll 并将“复制本地”设置为 True。
我通过 Sql Studio Express 创建了一个 sdf 文件。重要的一点是,我没有看到创建此文件的 CE 4.0 版本的选项,因此它是使用 CE 3.5 创建的。我创建了几个表,向这些表中添加了几行,将 *.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。
伙计们,我真的可以在这里使用一些方向。我搜索了堆栈溢出、帮助文档、在线书籍和谷歌搜索。我真的没有找到任何东西可以从 CE 3.5 或 4.0 的最顶层获取并告诉我要添加什么 dll,将它们放在哪里,如何引用它们,如何将 .sdf 文件添加到我的项目中,连接到它,并从中查询。我确实遇到了一些关于应该使用 Sql CE 3.5 的 IBuySpy 门户示例应用程序的提及,但实际上无法导航到 msdn 下载迷宫来获取它。理想情况下,我想为 CE 4.0 设置私有部署。
我全神贯注。建议,点,任何将不胜感激。谢谢!
是的,我看到了 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) 微软公司。保留所有权利。
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 台机器上尝试过以下配置。两者都是带有 64 位处理器的 Windows xp sp3 32 位。两者的开发环境都是VS 2008 Pro。机器 2 上的结果是在全新安装 Sql CE 4 Ctp 之后出现的。
配置#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();
配置 2
与 #1 相同,但在 myapp\bin 方向使用 System.Data.SqlServerCE.Entity.dll。
点击上述代码之前的页面错误。这是消息:
无法加载文件或程序集“System.Data.SqlServerCe.Entity”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。
说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.BadImageFormatException:无法加载文件或程序集“System.Data.SqlServerCe.Entity”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。
我检查了 VS 2008 Pro 中的项目设置,并将 .Net 3.5 框架设置为目标。
配置 3
与 #1 相同,除了 System.Data.SqlServerCE.dll 是从 myapp\bin\private 文件夹中引用的。
结果与 CONFIGURATION #1 相同(错误消息 100% 相同,并且错误发生在同一行代码中)。
正确的配置
按照 Erik 的指示(如果我更仔细地遵循它们),设置应该是
myapp\bin
x86
amd64
System.Data.SqlServerCE.dll
直接从 bin 文件夹中引用 System.Data.SqlServerCE.dll 以获取代码。我愚蠢地认为需要包含 Private 文件夹,但事实并非如此。不要将 System.Data.SqlServerCE.Entity.dll 放在 bin 文件夹中,除非您使用的是 .net 4.0 解决方案。我认为 dll 不适用于 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
【问题讨论】:
System.Data.SqlServerCe.dll 是任何 CPU... 使用配置 3,没有 Entity.dll 文件。错误的文件夹结构!将以下目录内容(包括 x86 和 amd64 文件夹)复制到 ASP.NET 应用程序的 bin 文件夹: C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private 中不应有“Private”文件夹你的 asp.net bin 文件夹。在您的 bin 文件夹下,有一个 x86 和 amd64 文件夹,每个文件夹都有正确的文件。 VS 2010 和 ASP.NET MVC 3 Beta 也会发生这种情况 如果您了解自己的架构,您只需要 x86 或 amd64。如果那更干净,您也可以在输出文件夹本身中拥有所有 dll(通过在 x86 文件夹中移动 dll 并删除文件夹)。 您好,该配置在 Windows 7/8/10 中完美运行,但在 Windows XP 中则不行。对此案有任何想法,我将不胜感激。 【参考方案1】:我构建了一个 asp.net web api 并将其托管在 azure 上,并遇到了 sql server compact 的一些问题,我通过以下方式修复它: 首先删除所有 system.data.sqlserverce.dll 和任何 dll 使用它然后 安装了这两个包:
Install-Package SqlServerCompact
然后重建
Install-Package EntityFramework.SqlServerCompact -Version 4.3.6
然后重建
在我完成之后,它对我来说效果很好 + 安装任何依赖于 system.data.sqlserverce.dll 的 NuGet 包,它们都很好用 我希望这会帮助一些人 reference
【讨论】:
【参考方案2】:如果您使用 NuGet 安装 SQL CE 提供程序,最简单的解决方案是添加一个构建后步骤以从 NuGet 包 NativeBinaries 文件夹中复制这些内容
【讨论】:
这个答案听起来有道理,但我不明白。能否请您添加一个必要的后期构建步骤的示例? 使用***.com/questions/491468/…中描述的技术将DLL从packages文件夹复制到bin文件夹【参考方案3】:SQL CE 3.5 不适用于 ASP.NET,您必须使用 4.0 CTP。
从here下载。
安装运行时。
将以下目录内容(包括 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 文件夹中。
添加连接字符串:
<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()));
【讨论】:
按照你的建议做了所有的事情。我仍然得到相同的“无法加载与版本 8402 的 ADO.NET 提供程序相对应的 SQL Server Compact 的本机组件。安装正确版本的 SQL Server Compact。有关更多详细信息,请参阅知识库文章 974247。每当我尝试创建新的 SqlCEConnection 对象时出错。我已经清理了我的临时文件,退出了 VS 2008,清理了项目,重建了等等。想法? 抱歉,使用 VS 2010 和 .NET 4.0 进行了测试 - 也许这是必需的?试试免费的 VS 2010 Web Dev Express... 如果我的主机还没有提供 .net 4.0,那真的很臭。我当然认为他们会为此针对 3.5 sp1 框架,但他们可能没有。 刚刚用 VS 2008 测试过,在我的机器上运行良好。唯一的区别是不要将 System.Data.SqlServerCe.Entity.dll 复制到 bin 文件夹中。我正在运行 Win 7 x64。 请按照我的步骤一步一步来。没有“lib”文件夹,只是 SQLCE 文件夹到 bin 文件夹的文件副本。当然你不能用 4.0 的 3.5 文件,使用 WebMatrix 或sqlcecmd.codeplex.com 创建一个 4.0 文件。【参考方案4】:对我来说关键是意识到私有目录(C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private)中 System.Data.SqlServerCe.Entity.dll 的版本是 4.0.0.1,其中 Desktop 目录 (C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.Entity) 下的版本为 4.0.0.0。 Private目录下System.Data.SqlServerCe.dll的版本是4.0.0.0。
我认为微软在没有对 SqlServer.dll 进行相应更新的情况下分发更新的 SqlServerCe.Entity.dll 是一个错误。
【讨论】:
Private目录下System.Data.SqlServerCe.dll的汇编版本为4.0.0.1! 我支持 Erik。如果您想使用私有 CE 实例进行部署,您需要将您的项目与私有目录中的 System.Data.SqlServerCe.dll 版本 4.0.0.1 链接起来。这是为了避免在更新 SQLCE 时出现问题【参考方案5】:如果您使用的连接字符串使用 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 中
【讨论】:
谢谢!这解决了我一直在努力解决的问题。但为什么它会起作用? System.Data.SqlServerCe.dll 在我的系统上的版本号为 4.0.8435.1,而您的 bindingRedirect 目标为 4.0.0.0-4.0.0.1。那么为什么 bindingRedirect 甚至会影响这种情况呢?我很高兴它有效,我只是不明白为什么。你能帮我解决这个问题吗? 仅供参考@ScottBussinger:我认为您可以跳过<runtime>
元素,并在<DbProviderFactories>
上使用4.0.0.0。如果在后者上使用 4.0.0.1,则实际上需要添加绑定。【参考方案6】:
好的,这是一个猜测,因为您正在寻找它们。
在您复制到引用目录的程序集上运行 corflags.exe。您要为哪种类型的机器制造?如果您在 64 位机器上并且正在编译到 x64 或 anyCpu,请确保 corflags 告诉您您的引用不是仅 32 位的引用。也许它“退回”到您的 GAC 中的错误版本或其他东西。如果它告诉您引用的程序集仅为 32 位,请将您的项目编译为 32 位项目或查找 64 位版本的 DLL?
【讨论】:
以上是关于无法让 sql server compact 3.5 / 4 与 ASP .NET MVC 2 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
SQL CE 部署 - AppHarbor - 无法加载 SQL Server Compact 的本机组件
SQL Server Compact 错误:无法加载 DLL 'sqlceme35.dll'。指定的模块无法找到
MS Sync/SQL Server Compact 代码在最新版本 SQL Compact 3.5 中失败
sql server compact edition 数据编辑器