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

jas*_*son 22 c# asp.net sql-server-2005 sql-server-ce asp.net-mvc-2

我正在使用Visual Studio 2008 Pro.

我可能在这里遗漏了一些非常明显的东西,但我一直在努力让Sql Server compact 4的CTP在我的asp.net mvc应用程序中运行.我可以找到没有关于如何设置它或一个工作示例应用程序的说明.我的目标是私有安装,所以我可以将它包含在我的网络应用程序中,而无需在我的域托管上进行sql server设置.这真的只是我拍摄微风并试图解决这个问题.我不打算举办市场或其他任何事情.

所以,我已经将基本4.0方向安装的所有dll(c:\ Program Files\Sql Server compact\v4.0)复制到我的应用程序中的lib文件夹中.我已将副本设置为输出方向选项为'Copy if Newer'.然后,我引用System.Data.SqlServerCE dll并将"Copy Local"设置为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");
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

我想从这里开始,我只是尝试让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文件添加到我的项目中,连接到它,并从中查询.我确实遇到过一些IBuySpy门户示例应用程序的提及应该使用Sql CE 3.5,但实际上无法导航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)Microsoft Corporation.版权所有.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1
Run Code Online (Sandbox Code Playgroud)

我会发誓我安装了两个版本的Sql CE(3.5/4)的x86版本.安装程序可能会以某种方式感到困惑,因为我的处理器是64位能力,但我正在运行Windows xp sp 3 32位.结果似乎表明它是64位.是这样的吗?

添加细节

迄今为止,已在2台机器上尝试了以下配置.两者都是Windows xp sp3 32位,具有64位处理器.两者的开发环境都是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
Run Code Online (Sandbox Code Playgroud)

错误:

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.
Run Code Online (Sandbox Code Playgroud)

码:

SqlCeConnection conn = new SqlCeConnection();
Run Code Online (Sandbox Code Playgroud)

配置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相同,但从myapp\bin\private文件夹引用System.Data.SqlServerCE.dll除外.

结果与CONFIGURATION#1相同(错误消息100%相同,错误发生在同一行代码中).

正确的配置

根据Erik的说明(如果我更仔细地遵循它们),设置应该是

myapp\bin
    x86
    amd64
    System.Data.SqlServerCE.dll
Run Code Online (Sandbox Code Playgroud)

直接从bin文件夹中引用System.Data.SqlServerCE.dll以获取代码.我的愚蠢是认为需要包含Private文件夹,但事实并非如此.除非您使用.net 4.0解决方案,否则不要将System.Data.SqlServerCE.Entity.dll放在bin文件夹中.我不认为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

Eri*_*kEJ 31

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 
Run Code Online (Sandbox Code Playgroud)

添加对刚放入/ bin文件夹中的System.Data.SqlServerCe.dll文件的引用.

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

添加连接字符串:

<connectionStrings>
   <add name ="NorthWind"
   connectionString="data source=|DataDirectory|\Nw40.sdf" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

连接!:-)

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()));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Eri*_*sky 13

如果您使用的是使用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>
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!这解决了我一直在争吵的问题.但为什么它有效?System.Data.SqlServerCe.dll在我的系统上的版本号为4.0.8435.1,而bindingRedirect的目标是4.0.0.0-4.0.0.1.那么为什么bindingRedirect甚至会影响这种情况呢?我很高兴它有效,我只是不明白为什么.你能帮我清楚一下吗? (4认同)