故事的其余部分"在下面的所有血淋淋的细节中被告知,但是为了切入追逐,它归结为:
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?
这些是设备上的一些文件:
显然,根据文件名,这些版本是3.5,我在JetBrains&#39;中打开了它们。 dotPeek试图证实这一点,但是这个问题一落千丈 - 我得到了,#34;(不支持)&#34;对于那些DLL。
在Reflector中尝试同样的事情给了我更多信息:&#34;&#39; C:\ Bla \ sqlceca35.dll&#39;不是.NET模块。&#34;
答案 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才能这样做。
在您的具体情况下,这意味着您应该执行以下操作:
您不需要拨打Upgrade()
,除非您想将其设为3.5数据库,此时您无法再回来,而且每次运行时都会尝试升级,无论如何,我怀疑你想要什么。该方法通常用于实用程序或一次性使用。
在PC上有多少其他版本的程序集并不重要,事实上,您也可以在设备上使用多个版本。重要的是,您在项目引用中所拥有的内容,即应用程序所链接的内容,与实际执行时应用程序在设备上加载的DLL相同。
一般来说,我会做两件事来确保这一点: