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

3

我正在使用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个回答

2
这是一种设计。它“冻结”,因为它正在扫描网络寻找数据库服务器。如果没有找到,则返回false,但这可能需要一些时间。
还有其他验证服务器的选项,例如这里。您需要使用SqlConnectionStringBuilder解析连接字符串并获取DataSource。有了这些信息,您可以运行该命令并获取其响应。但您需要重定向标准输出,然后解析输出。总之,这不是一个非常好的选择。

哦,我明白了。我会尝试让它静置一段时间,看看是否返回 false。那么这个问题没有解决的办法吗? - user1189352
1
你可能想尝试 context.CommandTimeout = 10 来使失败更快地返回。显然,这个属性在不同的 EF 版本中有所移动,请参见 https://dev59.com/p2025IYBdhLWcg3wEhnr 以获取各种选项。 - Steve
@Steve 尝试将超时时间更改为1,但不幸的是这并没有使检查变得更快。感谢您的建议。 - user1189352
让我收回之前的话,它确实比30秒更快了,只是比我想象中的慢一些,但我想这就是它能达到的极限了。谢谢。 - user1189352

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

1
问题可能是由于数据库请求有一个超时计时器,在返回结果之前必须倒计时。尝试将连接字符串中的超时时间暂时设置为非常短的时间(一两秒钟),这可能会加速它。

好的,让我看看能否立即在连接字符串中找到它。 - user1189352
我编辑了原帖以显示连接字符串,但我没有看到任何地方可以设置超时时间? - user1189352
1
我相信如果没有指定超时时间,那么默认的超时时间为30秒。尝试使用SqlConnectionStringBuilder来创建你的临时字符串,并在那里设置超时时间。 - Nathan A
1
@user1189352 看一下这个:https://dev59.com/p2025IYBdhLWcg3wEhnr - Steve
那个链接讨论了在连接字符串中指定超时的一些错误。可能已经修复,也可能没有,我不知道。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接