我正在使用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="data source=10.10.***.***;initial catalog=NflData;persist security info=True;user id=*****;password=****;MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
答案 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");
});