SqlCeConnection以什么格式期望其连接字符串arg?

我有一个失败的SqlCeConnection.Open()调用。 我得到的exception消息非常通用:“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 = ”前言是否不必要/有问题? 回溯需要加倍还是分配给逐字字符串? 要么…???

有关更多信息,请参阅此闪烁交换 :

UPDATE

Grant Winney的回答看起来很有希望,但今天尝试一下,我发现它不能在我的(Windows CE / CF)情况下编译。 我跟随“SpecialFolder”的可能性是:

 ApplicationsData Favorites Personal Programs StartMenu Startup 

这些都不符合“MyDocuments”吗?

更新2

对ctacke评论的回应如下:

这是SqlCeexception嵌入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 ==;”

相关的post/post就在这里

更新3

bizarro自定义exception处理程序确实尝试显示exception细节,如下所示:

 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,"","")); } } 

更新4

现在我们可能会到达某个地方。 我注释掉了调用GetFormTitle()的自定义exception处理程序中的现有行,并将其替换为:

 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)); 

这就是我现在看到的:

location :DBConnection.DBConnection:

例外 :不兼容的数据库版本。 如果这是兼容文件,请运行修复。 对于其他情况,请参阅文档。 [DB version = 0,Requested version = 0,File name = My Documents \ HHSDB.SDF];

内部exception :TypeFullName:System.Data.SqlServerCe.SqlCeException;

StackTrace :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是什么?!?

更新5

这已成为一个新问题,我在这里发布了

更新6

那个到另一个,就在这里

如错误文本所示,问题是SDF文件是由SQL Compact版本创建的,该版本与应用程序引用的SQL Compact版本不匹配。 我不会专注于报告的版本号,只是它知道它存在不匹配的事实。

如果您不知道SDF的版本,可以通过从SDF文件中读取几个字节来查找它 。

SQL Compact数据库文件不是100%可传输的。 你绝对不能从较新的版本中获取SDF并使用较旧的运行时加载它。

如果数据库是使用3.1创建的,则可以通过调用SqlCeEngine.Upgrade()将其升级到3.5。

您无法以编程方式从1.0或2.0升级到任何较新版本。 必须使用较旧的SQL Compact库与数据库进行交互,或者必须重新创建针对较新运行时的数据库。

如果数据库是在PC上创建的,则第一次使用将强制完全重新索引,因为索引在设备上的格式不同。 如果数据库中有大量数据,通常最好确保部署到设备的内容实际上是在设备上最后打开的,以防止用户必须等待重新索引。

由于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.MyDocumentsSpecialFolder.Personal

来自MSDN :

个人。 用作文档公共存储库的目录。 该成员相当于MyDocuments。