c# - SQL Server 连接超时 C#

标签 c# .net sql-server-2008 timeout sqlconnection

首先,我想让大家知道我已经搜索了我的特定问题,但似乎无法找到导致我的问题的原因。

我有一个在网络机器上运行的 SQL Server 2008 实例和一个我编写的连接到它的客户端。

为了连接,我有一小段代码建立到 sql server 2008 实例的连接并返回一个数据表,其中填充了我对服务器运行的任何查询的结果,所有这些都是非常标准的东西。无论如何,问题是,每当我打开我的程序并调用此方法时,在第一次调用我的方法时,无论我在连接字符串中设置的连接超时值如何,它都需要大约 15 秒然后超时.奇怪的是,我对该方法进行的第二次或第三次调用将毫无问题地工作。

我已按照本文所述在服务器机器上为 SQL Server 打开端口:How to Open firewall ports for SQL Server并验证它是否已正确配置。任何人都可以看到我的代码中的特定问题吗?

    string _connectionString = "Server=" + @Properties.Settings.Default.sqlServer + "; Initial Catalog=" + @Properties.Settings.Default.sqlInitialCatalog +
        ";User Id=" + @Properties.Settings.Default.sqlUsername + ";Password=" + @Properties.Settings.Default.sqlPassword + "; Connection Timeout=1";

    private DataTable ExecuteSqlStatement(string command)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            try
            {
                conn.Open();
                using (SqlDataAdapter adaptor = new SqlDataAdapter(command, conn))
                {
                    DataTable table = new DataTable();
                    adaptor.Fill(table);
                    return table;
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
        }
    }

我捕获的 SqlException 是:“超时已过期。在操作完成之前超时时间已过,或者服务器没有响应。”

这发生在 conn.Open();我包含的代码片段中的行。如果有人有任何想法那就太好了!

附录 如果我对服务器执行 ping 操作,则响应时间为 <10 毫秒。此外,我在使用 SQL Server Management studio 时遇到了相同的行为(我刚刚在写完这个问题后尝试过这个,因为这个想法刚刚闪过我的脑海)。我认为这必须是网络问题而不是代码问题,因为在使用 SQL Server Management Studio 时它也需要两次尝试。我意识到我可以对连接失败进行错误检查,然后重新尝试连接(无论如何我应该这样做)但这对我来说似乎不是特别“干净”,因为它没有解决潜在的问题。这里有人对这个问题有任何经验吗?

编辑 虽然一年多后这个问题已经被查看了 4000 多次,但我发现虽然我/认为/防火墙端口是打开的,但实际上并没有。我错误地假设您需要在 Windows 中将防火墙打开到 SQL Server 使用的端口号,在我的例子中,我将它设置为允许在 TCP 端口 1433 上进行连接,防火墙在尝试建立初始连接时引起了问题。

我发现设置它的正确方法是将 Windows 防火墙设置为允许 SQL Server 实例可执行文件通过。为此,您需要在 Windows 防火墙中添加一个程序,浏览到您的 sql 实例所在的文件夹,例如 C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLINSTANCE\MSSQL\Binn然后将 sqlservr.exe 文件添加到防火墙规则中。

最佳答案

您正在将连接超时值设置为 1 秒。从连接字符串中删除它,然后重试。

或者问题可能与您正在使用的 SQL 选择有关。会不会拖的时间长了。如果是这样,第二次和第三次调用将检索缓存的值,从而运行得更快。

关于c# - SQL Server 连接超时 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13799517/

相关文章:

c# - C++ 和 C# COM Interop,导入 TLB 错误 C1083

c# - 更新绑定(bind)到运行长进程的依赖对象的 WPF ProgressBar

sql-server - 将 SQL Server 命名实例更改为默认实例

c# - MediatR NotificationHandler 即发即忘

c# - 如何修复 {document}.Id 不支持错误

.net - HashSet<T>.Contains 如何比 List<T>.Contains 快?

c# - 将 IQueryable 映射到 .NET 中 OData 的域模型

c# - 创建一个程序(C#)来捕获我想要的 Html 链接并将结果导出到 Excel 文档

sql - Select 语句以查找某些字段上的重复项

sql-server - 游标中的 sys.databases 跳过数据库