我需要在我的项目中引用哪个SqlServerCe DLL版本来匹配sqlce.wce4.armv4.CAB中的内容?

时间:2014-05-06 21:55:29

标签: sql-server-ce compact-framework windows-ce versioning handheld

故事的其余部分"在下面的所有血淋淋的细节中被告知,但是为了切入追逐,它归结为:

SQLCE 2.0(包含在sqlce.wce4.armv4.CAB中)似乎安装在我的应用运行的设备上;源项目引用SqlServerCe,其运行时版本为v2.0.50727,版本为3.5.1.0

这是匹配还是不匹配?如果是后者,我需要在我的项目中引用哪个版本的SqlServerCe.dll?

故事情节的其余部分

我的Windows CE应用程序在尝试打开SQL CE(.SDF)文件时失败;虽然一个潜在的早期问题显然是连接(没有双关语意)与版本控制(调用SqlCeEngine.Upgrade()让我通过它),错误的msg现在表明密码问题。见this

但是我无处可看到桌面上的密码设置 - 也没有指定SQLCE版本的位置。

我们有一个安装实用程序,可以在手持设备上安装此应用程序以及必要的辅助文件。在试图弄清楚两个应用程序(应用程序正确的安装应用程序)在版本控制和密码方面做了什么时,我搜索了#34; SDF"和" SQLCE"在两个代码库中,这是我找到的*:

唯一引用" SDF"在Setup Utility中是:

{_T("OpenNETCF.SDF.WCE4.ARMV4.CAB"),_T("OpenNETCF SDF v1.4"),(DWORD)0,true},

唯一引用" SDF"在应用程序本身不创建一个SqlCe(" SDF")数据库。如果确实存在这样的引用,它们会查找已经存在的特定SDF文件,如下所示:

filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "HHSDB.SDF");

然后实例化并升级引擎数据库引擎并有条件地创建数据库(在我的例子中,文件存在,因此不调用CreateDatabase()):

engine = new SqlCeEngine(conStr);
engine.Upgrade(conStr); // <= Recommended by ctacke

if (File.Exists(filename))
{
    MessageBox.Show(string.Format("file {0} exists", filename)); // TODO: Comment out or remove
}
else
{
    engine.CreateDatabase(); 
}

唯一引用&#34; SQLCE&#34;在Setup Utility中有:

0)

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by HHSetupCon.rc
//
. . .
#define IDR_NETCF                       103
#define IDR_SQLCLIENT                   104
#define IDR_SQLCEDEV                    105
#define IDR_SQLCE                       106
. . .

1)

IDR_SQLCLIENT           BIN                     "J:\\sql.wce4.armv4.zip"
IDR_SQLCEDEV            BIN                     "J:\\sqlce.dev.wce4.armv4.zip"
IDR_SQLCE               BIN                     "J:\\sqlce.wce4.armv4.zip"

2)

{_T("sqlce.dev.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0 Dev"),IDR_SQLCEDEV,false},
{_T("sqlce.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0"),IDR_SQLCE,false},

参考&#34; SQLCE&#34;在应用程序本身中创建或查询SDF表,例如:

// This creates a table (a *table*, not the database itself)
public static void CreateSettingsTable()
{
    try
    {
        string sqlddl =
            "create table platypus_settings (setting_id int identity (1,1) Primary key,  setting_name nvarchar(40) not null, setting_value nvarchar(63))";
        DBConnection.GetInstance().DBCommand(sqlddl, false);
    }
    catch (SqlCeException sqlcex)
    {
        SSCS.ExceptionHandler(sqlcex, "DBUtils.CreateSettingsTable");
    }
    catch (Exception ex)
    {
        SSCS.ExceptionHandler(ex, "DBUtils.CreateSettingsTable");
    }
}

注意:DBConnection是一个自定义类,其中包含一些SqlCe *成员:

SqlCeConnection objCon = null;
SqlCeEngine engine;
public SqlCeTransaction SqlTrans;

...所以,util和app本身似乎都没有创建SqlCe 数据库(HHSDB.SDF) - 应用程序只是找到.SDF文件,然后从中读取/写入它

当应用程序创建一个表(如上面的CreateSettingsTable())和类似的活动时,它似乎会使用SqlCe DLL来执行此操作,并且因为ctacke说该DLL的版本(设备)必须与项目的源代码相关联,实际应该是设备上的一个,但因为我不任何SqlCe DLL在设备上,无法验证设备上的版本和项目构建环境是否匹配...

具体来说:设备上没有sqlserverce.dll;是我应该寻找的其他文件吗?缺少这个DLL本身不是问题,否则我不会通过以下代码(我这样做):

engine = new SqlCeEngine(conStr);

项目中引用的System.Data.SqlServerCe DLL是Runtime Version&#34; v2.0.50727&#34;,Version&#34; 3.5.1.0&#34;

安装项目没有这样的引用,AFAICT(它是一个C ++项目)。但是,它确实有这个代码:

{_T("sqlce.dev.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0 Dev"),IDR_SQLCEDEV,false},
{_T("sqlce.wce4.armv4.CAB"),_T("Microsoft SQLCE 2.0"),IDR_SQLCE,false},

因此它安装了SQL CE版本2的cab文件...这里的版本2是否与#34;运行时版本&#34;或&#34;版本&#34;在应用程序的引用SqlServerCE DLL?

我认为这些cab应该扩展/包含SqlCe DLL [s]但是,正如我写的那样,在运行这个setup util之后我在设备上看不到任何东西(这似乎工作得很好) )。

所以,总结并重申:

SQLCE 2.0(包含在sqlce.wce4.armv4.CAB中)似乎安装在我的应用运行的设备上;源项目引用SqlServerCe,其运行时版本为v2.0.50727,版本为3.5.1.0

这是匹配还是不匹配?如果是后者,我需要在我的项目中引用哪个版本的SqlServerCe.dll?

  • &#34;入境口岸的小伙子说......&#34; - 抱歉,无法帮助自己(或者不想更喜欢它)

更新

这些是设备上的一些文件:

enter image description here

更新2

显然,根据文件名,这些版本是3.5,我在JetBrains&#39;中打开了它们。 dotPeek试图证实这一点,但是这个问题一落千丈 - 我得到了,#34;(不支持)&#34;对于那些DLL。

在Reflector中尝试同样的事情给了我更多信息:&#34;&#39; C:\ Bla \ sqlceca35.dll&#39;不是.NET模块。&#34;

1 个答案:

答案 0 :(得分:1)

是的,你的不匹配。

您有一个数据库文件,在内部表明它是SQL Compact 2.0文件。

您有一个版本为3.5.1的System.Data.SqlServerCe.dll程序集。 &#34;运行时版本&#34;表示它构建的CF运行时是什么,因此它是针对2.0运行时构建的 - 它并不意味着它本身就是2.0。这是一个混乱点 - 你一直命名两个版本,一个程序集只有一个版本。

这是我的怀疑,因为您正在致电Upgrade() doesn't even exist in SQL Compact 2.0

如果您想打开原始状态的原始数据库,并允许原始创建者仍然可以访问它(并且必须有创建它的代码或已经部署过的数据库 - 在CAB文件中构建,没有隐含的方式可能发生)然后我再次重申,你必须使用相同版本的SQL Compact才能这样做。

在您的具体情况下,这意味着您应该执行以下操作:

  1. 更改项目引用(这意味着在Studio中,在PC上)指向具有2.0.xxx程序集版本的System.Data.SqlServerCe.dll。
  2. 确保设备上有完全相同版本(2.0.xxx)编号的SQL Compact文件。这包括System.Data.SqlServerCe.dll以及所有sscexx.dll本机文件。大约有六打。
  3. 您不需要拨打Upgrade(),除非您想将其设为3.5数据库,此时您无法再回来,而且每次运行时都会尝试升级,无论如何,我怀疑你想要什么。该方法通常用于实用程序或一次性使用。

    在PC上有多少其他版本的程序集并不重要,事实上,您也可以在设备上使用多个版本。重要的是,您在项目引用中所拥有的内容,即应用程序所链接的内容,与实际执行时应用程序在设备上加载的DLL相同。

    一般来说,我会做两件事来确保这一点:

    1. 将所有SQL CE内容直接放入设备上的app文件夹中,而不是通过CAB分发,而是部署每个单独的文件,以确保发生这种情况。
    2. 直接参考您电脑上的文件。不要使用Studio&#34; magic&#34;查找.NET引用的方法,但直接浏览知道的System.Data.SqlServerCe.dll是正确的,并添加引用。