一尘不染

无法使SQL Server Compact 3.5 / 4与ASP.NET MVC 2一起使用

c#

我正在使用Visual Studio 2008 Pro。

我可能在这里遗漏了一些非常明显的东西,但是我一直在尝试使Sql Server Compact 4的CTP在我的asp.net
mvc应用程序中工作。我几乎找不到关于如何设置它或正在运行的示例应用程序的说明。我的目标是私人安装,因此我可以将其包含在我的Web应用程序中,而不必在域托管中进行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版。

伙计们,我真的可以在这里使用一些指导。我搜索了堆栈溢出,帮助文档,在线书籍和Google搜索。对于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>标记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 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相同,但在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。

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

正确配置

根据Erik的指示(如果我更仔细地遵循它们),设置应为

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

直接从bin文件夹引用System.Data.SqlServerCE.dll以获取代码。我的愚蠢想法是需要包含“私人”文件夹,但事实并非如此。除非使用的是.net
4.0解决方案,否则请勿将System.Data.SqlServerCE.Entity.dll放入bin文件夹。我认为dll不支持w / 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


阅读 719

收藏
2020-05-19

共1个答案

一尘不染

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

更新:从桌面文件夹中使用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()));
            }
        }
    }
2020-05-19