LINQ to SQL,检查连接字符串的连接是否有效

时间:2014-05-07 17:00:09

标签: c# sql linq linq-to-sql

我正在使用LINQ to SQL(dbml),我想在进一步检查之前检查连接字符串的连接是否有效..例如,如果连接字符串中的IP不正确(或数据库)程序崩溃了,想要检查一下。我试过这个:

if (DataContext.DatabaseExists())
  MessageBox.Show("Connection Exists");

如果连接有效,则可以正常工作,但如果连接无效,则会在if语句处冻结。我还可以尝试或做什么?

<add name="NflDataEntities" connectionString="metadata=res://*/NflData.csdl|res://*/NflData.ssdl|res://*/NflData.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=10.10.***.***;initial catalog=NflData;persist security info=True;user id=*****;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;"
      providerName="System.Data.EntityClient" />

3 个答案:

答案 0 :(得分:2)

这是设计的。它“冻结”,因为它正在扫描网络寻找数据库服务器。如果找不到,则返回false,但这可能需要一些时间。

还有其他验证服务器的选项,例如this one here。您需要使用SqlConnectionStringBuilder来解析连接字符串并获取DataSource。有了这些信息,您就可以运行该命令并获取其响应。您需要重定向标准输出,然后解析输出。简而言之,并不是一个非常好的选择。

答案 1 :(得分:1)

问题可能是对DB的请求有超时,必须在返回之前关闭。尝试暂时将连接字符串中的超时设置为非常短的时间(一两秒),这可能会加快它的速度。

答案 2 :(得分:1)

您可以在显示系统正在运行的消息时运行异步方法,以便在等待Sql响应时UI不会冻结:

ShowMessage("Loading"); // Running on UI thread
        Task.Factory.StartNew(() =>
        {
            try
            {
                return DataContext.DatabaseExists();
            }
            catch (SqlException)
            {
                return false;
            }
        }).ContinueWith(isValid =>
        {
            if (isValid.Result)
                ShowMessage("Success");
            else
                ShowMessage("Failure");
        });