SQL Server连接超时C#

SQL Server连接超时C#

问题描述:

首先,我想告诉大家我已搜查我的具体问题,似乎无法找到什么导致我的问题。SQL Server连接超时C#

我有一个SQL Server 2008实例的网络机器上运行,我已经写了一个客户端连接到它。

连接我有一小段代码建立了与sql server 2008实例的连接,并返回一个填充了我对服务器运行的任何查询结果的DataTable,真的是所有非常标准的东西。无论如何,问题是,每当我打开我的程序并调用此方法时,首次调用我的方法时,无论我将连接超时值设置为连接字符串中的值,大约需要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; 
      } 
     } 
    } 

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

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

附录如果我ping服务器它是< 10ms响应时间。另外,当我使用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文件添加到防火墙规则中。

+0

如果您完全删除连接字符串中的连接超时参数,该怎么办? –

+0

你是否也改变了_command_ timeout? – Oded

+0

感谢您的建议。默认的超时时间不够明显,我不得不将其从15到60秒的默认未定义超时增加。这仍然是一个奇怪的问题,因为我使用的网络从客户端到服务器的延迟非常低(大约

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

或者问题可能是与选择您所使用的SQL。这会花费很长时间吗?如果是这样,第二次和第三次调用将检索缓存的值,从而运行得更快。

+0

Hrm,将连接超时增加到60个工作。这仍然是一个奇怪的问题,因为客户端和服务器之间的延迟几乎不存在。我能想到的唯一事情就是查找需要一段时间。 –

+1

@ Termin8tor你在这里看到的是连接池(http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.80).aspx)。在第一个连接上,大量的准备工作已经完成;此后,连接立即达到所有意图和目的。 – briantyler

+0

@牛的嘴巴 - 啊!解释它!感谢那些信息,这非常有用!现在只是读了一遍,听起来好像是什么导致了我所看到的行为。感谢您的洞察! –