当SDF文件和设备看似相同的版本(2)时,我应该调用“SqlCeEngine.Upgrade()”吗?

时间:2014-05-05 22:03:00

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

这是问题here

的后续内容

ctacke说有关于SQL Server CE相关"问题"我/我正在:

" 问题(如错误文本所示)是SDF文件是由SQL Compact版本创建的,该版本与应用程序引用的SQL Compact版本不匹配。我不会专注于报告的版本号,只是知道它存在不匹配的事实。 如果您不知道SDF的版本,可以通过从SDF文件中读取几个字节来查找它。 SQL Compact数据库文件不是100%可传输的。你绝对不能从较新的版本中获取SDF并使用较旧的运行时加载它。 如果数据库是使用3.1创建的,则可以通过调用SqlCeEngine.Upgrade()将其升级到3.5。"

I know now有问题的.SDF文件是版本2.0

我应该使用" SqlCeEngine.Upgrade()"在我的代码中某处的技术?

基于C ++设置实用程序代码,两台设备(3090和3190,但我现在正在测试3190)应安装SQLCE 2:

cabModule installMC3090[] = {{_T("ceremote.sa1100.CAB"),_T("Microsoft Remote Display Control"),IDR_CEREMDISP,true},
            {_T("netcf.all.wce4.armv4.cab"),_T("Microsoft .NET Compact Framework"),IDR_NETCF,false},
            {_T("OpenNETCF.SDF.WCE4.ARMV4.CAB"),_T("OpenNETCF SDF v1.4"),(DWORD)0,true},
            {_T("sql.wce4.armv4.CAB"),_T("Microsoft SQL Client"),IDR_SQLCLIENT,false},
            {_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},
            {_T("symbol.all.arm.cab"),_T("Symbol Managed Class Libraries"),IDR_SYMBOL,false},
            {_T("System_SR_enu.cab"),_T("Microsoft .NET CF 1.0 ENU-String Resource"),IDR_NETRESOURCES,false},
            {_T("HHS_WCE4.ARMV4.CAB"),_T("SSCS HHS"),IDR_HHS,false},
            {_T("END"),_T("END"),(DWORD)0,false}
};

//MC3190 includes .NET 3.5 in the default configuration
cabModule installMC3190[] = {{_T("ceremote.sa1100.CAB"),_T("Microsoft Remote Display Control"),IDR_CEREMDISP,true},
            {_T("OpenNETCF.SDF.WCE4.ARMV4.CAB"),_T("OpenNETCF SDF v1.4"),(DWORD)0,true},
            {_T("sql.wce4.armv4.CAB"),_T("Microsoft SQL Client"),IDR_SQLCLIENT,false},
            {_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},
            {_T("symbol.all.arm.cab"),_T("Symbol Managed Class Libraries"),IDR_SYMBOL,false},
            {_T("NETCFv35.Messages.EN.cab"),_T("Microsoft .NET CF 3.5 EN-String Resource"),IDR_NETRESOURCES,true},
            {_T("HHS_WCE4.ARMV4.CAB"),_T("SSCS HHS"),IDR_HHS,false},
            {_T("END"),_T("END"),(DWORD)0,false}
};

....虽然我找不到任何" SQLCE"设备上任何地方的文件...

更新

我在实例化SqlCeEngine之后添加了对Upgrade()的调用:

engine = new SqlCeEngine(conStr);
engine.Upgrade(conStr); // <= this is new

......这可能是一件好事,因为现在错误的消息是另一个消息:

位置:DBConnection.DBConnection

异常:为源数据库指定的密码不正确[数据源= \我的文档\ HHSDB.SDF]

内部异常:[空白]

TypeFullName :System.Data.SqlServerCe.SqlCeException

StackTrace :ProcessResults,修复......

将其与Update 4 here中的内容进行比较(现在它是一个密码问题;之前它似乎是一个Sql Ce版本不匹配问题)。

好的,遗留代码(以前有效)似乎没有添加密码。密码通常如何&#34;加上&#34; (不是我甚至知道密码应该是什么)?有没有办法让它不要指望密码?

这是DBConnection实例化代码,可能会对此有所了解:

public class DBConnection
{
    public string filename = HHSUtils.GetDataPath() + "HHSDB.SDF";
    SqlCeConnection objCon = null;
    SqlCeEngine engine;

    private DBConnection()
    {
    try
    {
    // Connection String
    //string conStr = "Data Source = " + filename; <== this is the legacy, but failing for some reason (see https://stackoverflow.com/questions/23438579/in-what-format-does-sqlceconnection-expect-its-connection-string-arg/23438672)
    //string conStr = string.Concat("Data Source = ", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "HHSDB.SDF"));
    filename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "HHSDB.SDF");
    string conStr = string.Concat("Data Source = ", filename);
    engine = new SqlCeEngine(conStr);
    engine.Upgrade(conStr); 

以前使用的GetDataPath(),它通过赋值给文件名来调用,但现在因为文件名被覆盖而没有用,只是:

public static string GetDataPath()
{
    return @"\My Documents\";
}

更新2

这足以解决我的问题,只需附加&#34; Persist Security Info = False; &#34; la:

连接字符串
Data Source=MyData.sdf;Persist Security Info=False;

? IOW,正在附加一种说法,&#34;忘记密码,我不依赖它们&#34;?

我还注意到上面的例子(来自here)在&#34; Source&#34;之间没有空格。和&#34; =&#34;和#34; =&#34;和SDF文件的路径。这是不重要的(因为我怀疑 - IOW,无论哪种方式都应该有效)?

也许更重要的是,我的连接字符串以打击开始(&#34;数据源= \我的文档&#34;)而这一点则不然。显著?

根据同一网站,如果我需要密码,我估计会是这样的:

Data Source=MyData.sdf;Encrypt Database=True;Password=myPassword;
File Mode=shared read;Persist Security Info=False;

...或... ???

更新3

Altho ctacke说驾驶室安装并不是真正相关的,为了完整性/为了后代,我正在添加一些关于设备设置如何不同的说明:

标有星号的cab文件与其他设备的安装不同

3090 通过设置实用程序安装了8个驾驶室:

HHS_WCE4.ARMV4.CAB
*netcf.all.wce4.armv4.cab
OpenNETCF.SDF.WCE4.ARMV4.CAB
sql.wce4.armv4.CAB
sqlce.dev.wce4.armv4.CAB
sqlce.wce4.armv4.CAB
symbol.all.arm.cab
*System_SR_enu.cab

3190 通过设置实用程序安装了8个cab(安装实用程序中的注释表示&#34; MC3190包含默认配置中的.NET 3.5 &# 34):

*ceremote.sa1100.CAB
HHS_WCE4.ARMV4.CAB
*NETCFv35.Messages.EN.cab
OpenNETCF.SDF.WCE4.ARMV4.CAB
sql.wce4.armv4.CAB
sqlce.dev.wce4.armv4.CAB
sqlce.wce4.armv4.CAB
symbol.all.arm.cab

所以

3090具有独特性:

netcf.all.wce4.armv4.cab
System_SR_enu.cab

3190具有独特性:

ceremote.sa1100.CAB
NETCFv35.Messages.EN.cab

两者升级到:

HHS_WCE4.ARMV4.CAB
symbol.all.arm.cab

(为什么这些&#34;升级出租车&#34;不是简单地添加到各自的安装列表中,我不知道 - 是否有&#34;升级&#34;选项?)

更新4

受到ctacke最新评论的启发(挑衅,刺激),我仔细查看了我在我的应用程序中的SQL CE参考资料,它看起来像是一种混合和混合的腐烂药水:

System.Data is runtime 2.0.0.0 and Version the same (2.0.0.0)
System.Data is from C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE\System.Data.dll

System.Data.SqlClient is runtime version v2.0.50727 and Version 3.0.3600.0 
System.Data.SqlClient is from C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\Client\System.Data.SqlClient.dll

System.Data.SqlServerCe is  runtime version v2.0.50727 and Version 3.5.1.0
System.Data.SqlServerCe is from C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\System.Data.SqlServerCe.dll

也许这个女巫酿造至少与我的问题有关。

更新5

所以,我想,肯定这是弗兰肯斯坦和德古拉之间的一些交叉,我已经到了这里。这些相关文件必须全部存在于同一位置。所以我看了所有这些并发现了这个:

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\WindowsCE
System.Data.dll == 2/14/2007 
System.Data.SqlClient.dll == [not there]
System.Data.SqlServerCe.dll == [not there]

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices\Client
System.Data.dll == [not there]
System.Data.SqlClient.dll == 7/3/2007
System.Data.SqlServerCe.dll == [not there]

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices
System.Data.dll == [not there]
System.Data.SqlClient.dll == [not there]
System.Data.SqlServerCe.dll == 2/12/2010

说不是这样!这真的是事情的立场 - 我必须从这里得到这个文件,从那里得到那个等等吗?

更新6

回应ctacke的评论:

&#34; 您引用的SQL CE版本必须与设备上的版本匹配到版本。我不能告诉你它应该是什么,只是它们必须是相同的,它们应该匹配到创建数据库文件的次要版本&#34;

我在设备上看不到任何SqlServerCe.dll;有一个名为&#34; Computer \ Clay的Device \\ Program Files \ Microsoft SQL Server Compact Edition \ v3.5&#34;具有以下DLL:

sqlceca35.dll
sqlcecompact35.dll
sqlceer35EN.dll
sqlceme35.dll
sqlceoledb35.dll
sqlceqp35.dll
sqlcese35.dll

(全部创建于2010年2月12日)

devie上还有一个文件夹,&#34;计算机\粘土设备\\ Windows \ SQLCE 2.0&#34;其中包含日期为8/16/2002和8/28/2002的文件:

ssce20.dll
ssceca.dll
ssceerror20en.dll
ssceerror20jp.dll

我假设最后两个用于显示错误消息,我假设最后一个用于日语,我认为我们没有任何日本客户(当然也没有日语的本地化版本的应用程序) ),这让人感到莫名其妙。

因此手持设备上根本没有SqlServerCe.dll,因此版本之间不会发生冲突 - 除非SqlServerCe.dll存在于某个地方但不可见?

更新7

作为更新5的后续内容和完整性&#39;缘故(前两个DLL文件可能是&#34;无趣&#34;):

我在整个硬盘上搜索了三个文件:

除了上面提到的以外,还发现了

System.Data.dll

C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\WindowsCE
Creation Date = 11/24/2002; Size = 403KB

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v2.0\Debugger\BCL
Creation Date = 2/14/2007; Size = 696KB

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\Debugger\BCL
Creation Date = 10/10/2007; Size = 710KB

C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE
Creation Date = 10/10/2007; Size = 124KB
除了上面提到的地方之外,在几个地方找到了

System.Data.SqlClient.dll ,但它们的大小都相同,除了:

C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\WindowsCE
where it is 148KB (creation date of 9/24/2002)
除了上面提到的地方(C:\ Program Files(x86)\ Microsoft SQL Server Compact Edition \ v3.5 \ Devices)之外,还发现了

System.Data.SqlServerCe.dll : / p>

C:\Program Files (x86)\Microsoft Visual Studio .NET 2003\CompactFrameworkSDv1.0.50000\WindowsCE
9/24/2002; 124KB

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.1
12/22/2006; 236KB

同样在:

C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Desktop
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Private
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop
C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private

-and in(与上面相同但在没有&#34;(x86)&#34;的Program Files文件夹中):

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Desktop
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Private
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop
C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private

0 个答案:

没有答案