【发布时间】:2015-06-13 18:05:44
【问题描述】:
我有桌面软件。在登录时,我测试是否可以通过打开连接来访问数据库。如果不能,则抛出异常。如果可以,那么一切都很好,我关闭连接并进入主窗口。到这里一切正常。在主窗口中,我有一个线程通过调用下面的 isDbConnectionOk 方法在 1 到 1 分钟内检查连接:
sqlConnString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + ConfigurationManager.AppSettings["DatabasePath"] + ";Integrated Security=True";
sqlConn = new SqlConnection(sqlConnString);
private bool isDbConnectionOk(string errorMessage)
{
using (var l_oConnection = new SqlConnection(sqlConn.ConnectionString))
{
try
{
l_oConnection.Open();
return true;
}
catch (SqlException)
{
if (!String.IsNullOrEmpty(errorMessage))
{
this.ShowMessageAsync("Waring", errorMessage);
}
return false;
}
}
}
我通过插入带有数据库的 U 盘并连接到它来对此进行测试。当我在第一次检查后进入主窗口时,我拔下棒并等待线程再次检查。尽管没有要连接的数据库,但连接打开时没有任何问题。有人可以解释一下吗?它到底是如何缓存它或正在发生什么?如果数据库路径无效或无法访问,并且在主窗口中没有数据库存在时,它仍然能够打开连接,登录部分为什么会引发错误?
【问题讨论】:
-
也许您可以尝试访问数据库来检查连接(询问表名或其他内容)。它可能会懒惰地评估事物而不检查连接,直到它必须实际做某事。
-
是的,但这比尝试打开它要昂贵得多,此外,当我进行检查时,它在登录部分工作得很好。为什么不也用于主窗口....
-
您在登录时会进行哪些检查?如果您更改 sqlConnString 并保留 USB,它会打开连接吗?
-
同样的检查,试图打开连接。我通过在没有usb并且无法打开时尝试打开来测试它,然后当我插入usb时它可以连接到db。另外,是的,我可以从硬盘驱动器中选择数据库的副本,它也可以按预期打开它,所以这里没有问题 :)
-
好吧,如果你用查询检查数据库访问,至少你可以消除它实际上以某种方式连接到有效数据库的想法(也许在你的硬盘上)。对 C# 不太了解,所以这就是我所拥有的 :)
标签: c# sql wpf database visual-studio-2013