首先,我想让大家知道我已经搜索了我的特定问题,但似乎找不到导致我的问题的原因。
我有一个SQL Server 2008实例在网络机器上运行,我写的一个客户端连接到它
为了进行连接,我有一小段代码,它建立了与sql server 2008实例的连接,并返回一个DataTable,其中填充了我对服务器运行的任何查询的结果,所有这些都是非常标准的东西。无论如何,问题是,每当我打开我的程序并调用这个方法时,在第一次调用我的方法时,无论我在连接字符串中设置了什么连接超时值,都需要大约15秒,然后超时。奇怪的是,我对该方法进行的第二次或第三次调用将毫无问题地工作。
我已经在服务器计算机上打开了SQL Server的端口,如本文所述:如何打开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服务器,它是<10ms响应时间。此外,我在使用SQL Server Management studio时也会有同样的行为(我刚刚在写完这个问题后尝试过,因为我突然想到了这个问题)。我认为这一定是网络问题,而不是代码问题,因为在使用SQLServerManagementStudio时也需要两次尝试。我意识到我可以对连接失败进行错误检查,然后重新尝试连接(我可能无论如何都应该这样做),但这对我来说似乎不是特别"干净",因为它没有解决根本问题。这里有人有这个问题的经验吗?
编辑尽管一年多后这个问题已经被浏览了4000多次,但我后来发现,尽管我/认为/防火墙端口是打开的,但实际上并没有。我错误地认为你需要在Windows中打开SQL Server使用的端口号的防火墙,在我的情况下,我将其设置为允许TCP端口1433上的连接,在尝试建立初始连接时,防火墙会导致问题。
我发现设置它的正确方法是将Windows防火墙设置为允许SQL Server实例通过执行。为此,您需要在Windows防火墙中添加程序,浏览到sql实例所在的文件夹(如C:Program Files (x86)Microsoft SQL ServerMSSQL10_50.SQLINSTANCEMSSQLBinn
),然后将sqlservr.exe文件添加到防火墙规则中。
您将连接超时值设置为1秒。将其从连接字符串中删除,然后重试。
或者问题可能与您正在使用的SQL select有关。可能要花很长时间。如果是这样,第二次和第三次调用将检索缓存的值,从而运行得更快。