0

这是对这里的一个问题的跟进

ctacke 说关于我曾经/正在遇到的与 SQL Server CE 相关的“问题”:

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

我现在知道有问题的 .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

...这可能是一件好事,因为现在 err msg 是不同的,也就是说:

位置:DBConnection.DBConnection

例外:为源数据库指定的密码不正确 [Data Source = \My Documents\HHSDB.SDF]

内部异常:[空白]

类型全名:System.Data.SqlServerCe.SqlCeException

StackTrace:处理结果,修复...

将其与此处更新 4 中的情况进行比较(现在是密码问题;以前似乎是 Sql Ce 版本不匹配问题)。

好的,所以旧代码(以前有效)似乎没有添加密码。密码通常是如何“附加”的(我什至不知道密码应该是什么)?有没有办法让它不期待密码?

这是 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

这是否足以解决我的问题,只需将“ Persist Security Info=False; ”附加到连接字符串,a la:

Data Source=MyData.sdf;Persist Security Info=False;

? IOW,是否附加了一种说法,“忘记密码,我不依赖它们”?

我还注意到上面的示例(来自此处)在“Source”和“=”之间以及“=”和 SDF 文件的路径之间没有空格。这不重要吗(我怀疑- IOW,任何一种方式都应该有效)?

不过,也许更重要的是,我的连接字符串以重击(“Data Source = \My Documents”)开头,而这个不是。重要的?

根据同一个站点,如果我确实需要密码,我认为它会是这样的:

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(设置实用程序中的注释说,“ MC3190 在默认配置中包含 .NET 3.5 ”):

*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

(为什么这些“升级驾驶室”没有简单地添加到各自的安装列表中,我不知道 - 是否有“升级”选项?)

更新 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 的评论:

"您所引用的 SQL CE 版本必须与设备上的版本相匹配。我无法告诉您应该是什么,只是它们必须相同,并且它们应该与创建的次要版本相匹配数据库文件

我在设备上根本看不到 SqlServerCe.dll;有一个名为“Computer\Clay's Device\\Program Files\Microsoft SQL Server Compact Edition\v3.5”的文件夹,其中包含以下 DLL:

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

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

设备上还有一个文件夹“Computer\Clay's Device\\Windows\SQLCE 2.0”,其中包含日期为 2002 年 8 月 16 日和 2002 年 8 月 28 日的文件:

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

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

所以手持设备上根本没有 SqlServerCe.dll,所以版本之间不可能发生冲突——除非 SqlServerCe.dll 存在于某处但不可见?

更新 7

作为更新 5 的后续行动并为了完整起见(前两个 DLL 文件可能“无趣”):

我在整个硬盘驱动器中搜索了三个文件:

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)

System.Data.SqlServerCe.dll被发现,除了上面提到的(C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v3.5\Devices),在:

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(与上面相同,但在 Program Files 文件夹中没有“(x86)”):

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
4

0 回答 0