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

oipij1gg  于 2022-12-15  发布在  .NET
关注(0)|答案(6)|浏览(260)

我使用的是Visual Studio 2008专业版。
我可能错过了一些非常明显的东西,但我一直试图让SQL Server compact 4的CTP在我的asp.net mvc应用程序中工作。我几乎找不到如何设置它的说明或工作示例应用程序。我的目标是一个私人安装,这样我就可以将它包含在我的web应用程序中,而不必在我的域主机上进行SQL Server设置。这只是我在闲扯,试图弄清楚这一点。我不打算举办一个市场或任何与此有关的东西。
因此,我已经将安装在base 4.0方向(c:\Program Files\Sql Server compact\v4.0)的所有dll复制到应用程序中的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");

这将产生以下错误:

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。我复制基位置(c:\Program Files\Sql Server compact\v3.5)处的dll,包括从项目引用中删除和重新写入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〉关联标志系统.数据. SqlServerCe.dll Microsoft(R).NET框架关联标志转换工具.版本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台计算机上尝试了以下配置。这两台计算机都是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

错误:

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相同,但系统.数据. SqlServerCE.实体. dll位于myapp\bin方向。
在点击上面的代码之前页面出错。消息如下:
未能加载文件或程序集“System.Data.SqlServerCe.Entity”或它的某个依赖项。此程序集是由比当前加载的运行库更新的运行库生成的,因此无法加载。
描述:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以了解有关错误以及代码中出现错误的位置的详细信息。
异常详细信息:系统错误图像格式异常:未能加载文件或程序集“System.Data.SqlServerCe.Entity”或它的某个依赖项。此程序集是由比当前加载的运行库更新的运行库生成的,因此无法加载。
我已经检查了VS 2008 Pro中的项目设置,目标设置为.Net3.5框架。

配置3

与#1相同,只是System.Data.SqlServerCE.dll是从myapp\bin\private文件夹引用的。
结果与配置#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。

有用链接:
Link

svgewumm

svgewumm1#

SQL CE 3.5不能与ASP.NET一起使用,您必须使用4.0 CTP。
here下载。
安装运行时。
将以下目录内容(包括x86和amd 64文件夹)复制到ASP.NET应用程序的bin文件夹:C:\程序文件\Microsoft SQL Server精简版\v4.0\专用

更新:使用桌面文件夹中的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()));
            }
        }
    }
jjjwad0x

jjjwad0x2#

如果您使用的连接字符串使用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中

mm9b1k5b

mm9b1k5b3#

好吧,我猜猜,既然你在钓他们。
在复制到references目录的程序集上运行corflags.exe。您构建的机器类型是什么?如果您在64位机器上编译到x64或anyCpu,确保corflags告诉你你的引用不是32位的引用。也许它正在“回退”到你的GAC中的一个错误的版本或者其他什么。如果它告诉您引用的程序集仅为32位,则将您的项目编译为32位项目,或者查找该DLL的64位版本。

yr9zkbsy

yr9zkbsy4#

如果使用NuGet安装SQL CE提供程序,最简单的解决方案是添加一个生成后步骤,以便从NuGet包NativeBinaries文件夹中复制这些提供程序

ecr0jaav

ecr0jaav5#

对我来说,关键是意识到专用目录(C:\程序文件\Microsoft SQL Server精简版\v4.0\Private)中的System.Data.SqlServerCe.Entity.dll的版本是4.0.0.1,而桌面目录(C:\程序文件\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更新是一个错误。

rvpgvaaj

rvpgvaaj6#

我构建了一个asp.net web API并将其托管在Azure上,遇到了一些sql server compact问题,我通过以下方法修复了它:首先删除所有system.data.sqlserverce.dll和使用它的任何dll,然后安装这些两个软件包:
Install-Package SqlServerCompact然后重建
Install-Package EntityFramework.SqlServerCompact -Version 4.3.6然后重建
在我这样做之后,它对我来说工作得很好+安装任何依赖于systemidataidsqlserverceiddll的NuGet包,它们都工作得很好,我希望这对一些reference有帮助

相关问题