2014-05-07 88 views
2

我正在使用LINQ to SQL(dbml),并且想要在继续​​之前检查连接字符串的连接是否有效..例如,if连接字符串中的IP不正确(或数据库关闭),程序崩溃并希望对此进行检查。我试过这个:LINQ to SQL,检查连接字符串的连接是否有效

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" /> 

回答

2

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

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

+0

OIç..我会尽力让它坐并看看它是否返回false ..所以没有办法解决这个问题吗? – user1189352

+0

你是对的,它最终会失败 – user1189352

+1

你可能想尝试使用'context.CommandTimeout = 10'来导致失败更快地返回。显然这个属性移动了不同的EF版本,请参阅http://stackoverflow.com/questions/6232633/entity-framework-timeouts各种选项。 – Steve

1

问题可能是对数据库的请求有一个超时,必须在它返回之前打勾。尝试将连接字符串中的超时临时设置为很短的时间(一秒或两秒),并且可能会加快速度。

+0

好吧,让我看看我是否可以尝试在连接字符串中发现现在 – user1189352

+0

我编辑了OP来显示连接字符串,但是我没有看到任何地方我可以设置超时? – user1189352

+1

我相信默认超时是30秒,如果没有指定。尝试使用'SqlConnectionStringBuilder'来创建你的临时字符串,并在那里设置超时时间。 –

1

,同时表明该系统工作,因此UI,同时等待SQL响应不会冻结的消息可以运行异步方法:

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

不错,我会试一下,谢谢 – user1189352