【问题标题】:LINQ to SQL, check if connection to connection string is validLINQ to SQL,检查连接字符串是否有效
【发布时间】:2014-05-07 17:00:08
【问题描述】:

我正在使用 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" />

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • o i c.. 我会试着让它坐下来看看它是否返回 false.. 所以没有办法解决这个问题吗?
    • 您可能想尝试context.CommandTimeout = 10 以使故障更快地返回。显然,此属性随不同的 EF 版本移动,请参阅stackoverflow.com/questions/6232633/entity-framework-timeouts 了解各种选项。
    • @Steve 尝试将超时更改为 1,但不幸的是,这并没有使检查速度更快。谢谢你的建议
    • 让我收回它,它确实让它快了 30 秒,不幸的是,它比我想要的慢,但我想这就是它可以达到的程度。谢谢
    【解决方案2】:

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

    【讨论】:

    • 好的,让我看看我现在是否可以尝试在连接字符串中找到它
    • 我编辑了 OP 以显示连接字符串,但我没有看到任何可以设置超时的地方?
    • 如果没有指定,我相信默认超时是 30 秒。尝试使用SqlConnectionStringBuilder 创建临时字符串,并在此处设置超时。
    • 该链接讨论了一些在连接字符串中指定超时的错误。可能是固定的,IDK。
    【解决方案3】:

    您可以在显示系统正在运行的消息时运行异步方法,这样 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");
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多