C# 可以打开到不存在的数据库的连接,这怎么可能?

C# 可以打开到不存在的数据库的连接,这怎么可能?,c#,sql,wpf,database,visual-studio-2013,C#,Sql,Wpf,Database,Visual Studio 2013,我有桌面软件。在登录时,我测试是否可以通过打开连接访问数据库。如果不能,则抛出异常。如果可以,那么一切都很好,我关闭连接,进入主窗口。在这之前一切都是正常的。在主窗口中,我有一个线程,通过调用下面的isDbConnectionOk方法,在1到1分钟内检查连接: sqlConnString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + ConfigurationManager.AppSettings["DatabasePath"] +

我有桌面软件。在登录时,我测试是否可以通过打开连接访问数据库。如果不能,则抛出异常。如果可以,那么一切都很好,我关闭连接,进入主窗口。在这之前一切都是正常的。在主窗口中,我有一个线程,通过调用下面的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盘并连接到它来测试这一点。第一次检查后,当我在主窗口中时,我拔下棍子,等待线程再次检查。尽管没有要连接的数据库,但连接打开时没有任何问题。有人能解释一下吗?它究竟是如何缓存它的,或者发生了什么?为什么登录部分会在数据库路径无效或无法访问时抛出错误,并且在主窗口中,当没有数据库时,它仍然能够打开连接?

尝试:

用文件路径更改
D:\Sample.mdf

 private string _connectionString =
        @"Data Source =(LocalDB)\v11.0;AttachDBFileName=D:\Sample.mdf;" +
        "Integrated Security=true";

    private bool IsDbConnectionOk(out string errorMessage)
    {
        using (var connection = new SqlConnection(_connectionString))
        {
            try
            {
                connection.Open();
                if (connection.State != ConnectionState.Open)
                {
                    errorMessage = null;
                    return false;
                }
                errorMessage = null;
                return true;
            }
            catch (Exception exp)
            {
                errorMessage = exp.Message;
                return false;
            }
            finally
            {
                connection.Close();
            }
        }
    }

    private void BtnTestConnection_OnClick(object sender, RoutedEventArgs e)
    {
        string errormessage;
        var isOk = IsDbConnectionOk(out errormessage);
        if (isOk)
        {
            MessageBox.Show("Connection Is OK");
        }
        else
        {
            MessageBox.Show("Connection error : " + errormessage);
        }
    }

也许您可以将访问数据库的尝试添加到连接检查中(询问表名或其他信息)。它可能会懒散地评估一些事情,并且在必须实际执行某些操作之前不检查连接。是的,但这比尝试打开连接要昂贵得多,而且,当我进行检查时,它在登录部分工作得很好。为什么不把它也放在主窗口上呢……你在登录时做什么检查?如果您更改了sqlConnString并保留usb,它会打开连接吗?相同的检查,尝试打开连接。我通过在没有usb且无法打开时尝试打开来测试它,然后当我插入usb时,它可以连接到db。另外,是的,我可以从硬盘上选择数据库的副本,它也可以按预期打开它,所以这里没有问题:)好吧,如果你用查询检查数据库访问,至少你可以消除它实际上以某种方式连接到有效数据库的想法(可能在你的硬盘上)。我对C不太了解,所以我只知道:)试一下你的代码,同样的,即使usb断了,它也能打开连接。此外,除了捕获一个我尝试使用b4的一般异常外,我没有看到代码中有任何显著的变化。反正是Thanx。