我调用了失败的SqlCeConnection.Open()。我得到的异常消息非常通用:“System.Data.SqlserverCe.SqlCeException”(比漂亮的更通用)
相关代码是:
private DBConnection()
{
try
{
string conStr = "Data Source = " + filename;
string cmpStr = conStr + ".tmp";
if (File.Exists(filename+".tmp"))
File.Delete(filename+".tmp");
engine = new SqlCeEngine(conStr);
if (File.Exists(filename))
{
}
else
{
engine.CreateDatabase();
}
engine.Dispose();
objCon = new SqlCeConnection(conStr);
//MessageBox.Show(string.Format("conStr == {0}", conStr));
objCon.Open(); // <= This is where all Dallas breaks loose; conStr is "DataSource = \My Documents\NRPSDB.SDF" (which file *does* exist on the device)
}
catch(Exception ex)
{
NRPS.ExceptionHandler(ex, "DBConnection.DBConnection");
}
}
连接字符串arg传递给SqlCeConnection构造函数的问题是什么? “ DataSource = ”前导码是否不必要/有问题?回溯需要加倍还是分配给逐字字符串?或... ???
有关详细信息,请参阅this scintillating exchange:
Grant Winney的回答看起来很有希望,但今天尝试一下,我发现它在我的(Windows CE / CF)情况下无法编译。我跟随“SpecialFolder”的可能性是:
ApplicationsData
Favorites
Personal
Programs
StartMenu
Startup
这些都不符合“MyDocuments”吗?
扩大对ctacke评论的回应:
这是SqlCe异常嵌入MessageBox.Show()“debug”字符串的地方:
public static string GetFormTitle(string formName, string serialNo, string siteNo)
{
MessageBox.Show(string.Format("GetFormTitle() reached. formName == {0}; serialNo == {1}; siteNo == {2}", formName, serialNo, siteNo)); // TODO: Remove after testing
string titleBar = formName == "" ? "NRPS HHS" : formName;
我最终看到的是:
“到达GetFormTitle()。formName == NRPS:System.Data.SqlServerCe.SqlCeException; serialNo ==; siteNo ==;”
相关帖子/帖子是here
bizarro自定义异常处理程序确实尝试显示异常细节:
public static void ExceptionHandler(Exception ex, string location)
{
try
{
MessageBox.Show("Exception: " + ex.Message + "\n\nLocation: " + location, GetFormTitle("NRPS: " + ex.GetType().FullName,"",""));
}
catch(Exception exc)
{
MessageBox.Show("Exception Handler generated an exception!\n" + exc.Message + "\n\nCalling Location: " + location, GetFormTitle("NRPS: " + exc.GetType().FullName,"",""));
}
}
现在我们可能会到达某个地方。我注释掉了调用GetFormTitle()的自定义异常处理程序中的现有行,并将其替换为:
MessageBox.Show(string.Format("location: {0}; Exception: {1}; Inner Exception: {2}; TypeFullName: {3}; StackTrace: {4}" + location, ex.Message, ex.InnerException, ex.GetType().FullName, ex.StackTrace));
这就是我现在看到的:
“位置:DBConnection.DBConnection:
例外:不兼容的数据库版本。如果这是兼容文件,请运行修复。对于其他情况,请参阅文档。 [DB version = 0,Requested version = 0,File name = My Documents \ HHSDB.SDF];
内部异常:TypeFullName:System.Data.SqlServerCe.SqlCeException;
栈跟踪: System.Data.SqlServerCe.SqlCeConnection.ProcessResults(Int 32 hr)at System.Data.SqlServerCe.SqlCeConnection.Open(boolean silent)at System.Data.SqlServerCe.SqlCeConn ... [再看不到... ] *“
这让我印象深刻: DB版本= 0,请求版本= 0
但...... Hec Ramsey是什么?!?
这已成为一个新问题,我发布了here
那个是另一个,here
答案 0 :(得分:2)
问题,如错误文本所示,SDF文件是由SQL Compact版本创建的,该版本与应用程序引用的SQL Compact版本不匹配。我不会专注于报告的版本号,只是知道它存在不匹配的事实。
如果您不了解SDF的版本,可以随时look it up by reading a few bytes from the SDF file。
SQL Compact数据库文件不是100%可传输的。你绝对不能从较新的版本中获取SDF并使用较旧的运行时加载它。
如果数据库是使用3.1创建的,则可以通过调用SqlCeEngine.Upgrade()
将其升级到3.5。
您无法以编程方式从1.0或2.0升级到任何较新版本。您必须使用较旧的SQL Compact库与数据库进行交互,或者必须重新创建针对较新运行时的数据库。
如果数据库是在PC上创建的,第一次使用将强制完全重新索引,因为索引在设备上的格式不同。如果数据库中有大量数据,通常最好确保部署到设备的内容实际上是在设备上最后打开的,以防止用户必须等待重新索引。
答案 1 :(得分:1)
由于filename
包含相对路径"\My Documents\NRPSDB.SDF"
,因此您的程序可能正在寻找从您的应用程序运行目录开始的路径,这很可能是错误的地方。类似的东西:
... \ bin \ debug \ My Documents \ NRPSDB.SDF
尝试将其放入您的方法中,看看它是否能够找到该文件:
string conStr = string.Concat("Data Source = ",
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"NRPSDB.SDF"));
如果能够找到它,那么无论您何时调用该方法,都必须使用此方法,以便filename
包含正确的绝对路径。
关于您使用Win CE的更新,相当于SpecialFolder.MyDocuments
的{{1}}。
来自MSDN:
个人。用作文档公共存储库的目录。该成员相当于MyDocuments。