【发布时间】:2014-05-02 23:43:59
【问题描述】:
我调用了失败的 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");
}
}
问题是传递给 SqlCeConnection 构造函数的连接字符串 arg 吗? “DataSource =”序言是否不必要/有问题? backwhacks 是否需要加倍或分配给逐字字符串?还是……???
更多信息请见this scintillating exchange:
更新
Grant Winney 的答案看起来很有希望,但今天尝试一下,我发现它在我的(Windows CE / CF)情况下无法编译。我遵循“SpecialFolder”的可能性是:
ApplicationsData
Favorites
Personal
Programs
StartMenu
Startup
这些都不对应“我的文档”吗?
更新 2
对以下 ctacke 评论的扩展回复:
这里是 SqlCe 异常嵌入 MessageBox.Show()“调试”字符串的地方:
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
更新 3
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,"",""));
}
}
更新 4
现在我们可能正在取得进展。我注释掉了自定义异常处理程序中调用 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:
异常:数据库版本不兼容。如果这是兼容文件,请运行修复。对于其他情况,请参阅文档。 [数据库版本=0,请求版本=0,文件名=我的文档\HHSDB.SDF];
内部异常:TypeFullName:System.Data.SqlServerCe.SqlCeException;
堆栈跟踪: 在 System.Data.SqlServerCe.SqlCeConnection.ProcessResults(Int 32 hr) 在 System.Data.SqlServerCe.SqlCeConnection.Open(boolean silent) 在 System.Data.SqlServerCe.SqlCeConn... [看不到更多... ]*"
这让我印象深刻: 数据库版本 = 0,请求的版本 = 0
但是……Hec Ramsey 是什么?!?
更新 5
这变成了一个新问题,我发布了here
更新 6
那一个到另一个,即here
【问题讨论】:
-
您遇到的实际异常是什么?如果带有设置的
CreateDatabase()调用成功,则表明它是一个有效的连接字符串,并且您还有其他问题。 -
这很奇怪:MessageBox.Show() 中嵌入了一个异常。具体来说是:“[我的废话] System.Data.SqlServerCe.SqlCeException; [我的废话的更多]”
-
SqlCeException 通常也包含一个 InnerException。您上面的错误文本表明您的消息框调用中有一个错误,这让我认为您收到的异常不是您上面发布的确切代码。
-
将代码放入异常处理程序中。让它输出异常。不要尝试在其他地方进行,因为那只是在小麦中添加谷壳。当您使用它时,请确保数据库文件未标记为只读且未设置密码。
-
您将使用密码创建它(例如,从 PC 复制时)。这是一个空的数据库吗?它是在哪里创建的?如果它是在桌面或其他设备上创建的,如果 SQL CE 版本不同,您可能会遇到问题。
标签: c# database-connection sql-server-ce connection-string windows-ce