16

当我尝试执行以下代码时,程序无限期挂起。我不知道为什么,似乎还有其他关于这个问题的未回答的话题。虽然,如果无法访问 IP\网站,那么它会按预期工作。

    private void DoStuff()
    {
        string connectionString = "Data Source=www.google.com;Connection Timeout=5";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open(); //Hangs here indefinitely
            Console.WriteLine("Test");
        }
    }

例如,如果我将连接字符串设置为

connectionString = "Data Source=www.nonexistentsite.com;Connection Timeout=5";

那么它会抛出一个异常。如何让它为活动站点抛出异常?...显然,谷歌也只是出于测试目的。

编辑 :

如果我尝试连接到无法访问的服务器名称或 IP 地址,我收到此异常...

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

更新 :

让程序运行一段时间后,它通常会在 3-5 分钟后最终超时,并给我上面发布的错误。我怎样才能让它更快地超时?

4

2 回答 2

6

Data Source如果您为您的此类设置了 FQDN(完全限定域名)example.com并且 DNS 服务器长时间无法解析此 FQDN,那么很明显您的请求将挂起。确保运行应用程序的计算机可以访问 SQL 服务器并在没有任何问题的情况下解决它。此外,您可能希望确保没有可能阻止请求的防火墙。

导致这些症状的另一个可能原因是您已用尽 ADO.NET 的连接池。如果您有许多并行运行的慢速 SQL 查询,每个查询都与数据库建立物理连接,则可能会发生这种情况。此池上的可用连接数有限制,当达到此限制时,下一次调用connection.Open()可能会等待可用连接返回到池中。

备注:您可能还需要在连接字符串中指定您希望如何针对 SQL 服务器进行身份验证。查看connectionstrings.com更多示例。

所有这一切都是说您在问题中发布的 C# 代码绝对没有错。它看起来更像是一个与网络相关的问题,您可以提请您的网络管理员注意。

于 2013-05-08T20:14:42.830 回答
1

要让连接在指定的时间后退出而不成功,您可以使用Connection Timeout连接字符串中的参数。您指定的数字以秒为单位,例如,Connection Timeout=240等于 240 秒\60 秒 = 4 分钟。

示例连接字符串:

<add name="MyConnectionString"
connectionString="
Data Source=MyServer\MSSQL2017;
Initial Catalog=MyDatabase;
Integrated Security=True;
Connection Timeout=10;"/>

在上面的连接字符串中,Open()命令会在 10 秒后超时。

于 2018-09-26T23:20:47.797 回答