首先,我想让每个人都知道我已经搜索了我的特定问题,但似乎找不到导致我问题的原因。
我有一个在网络机器上运行的 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 服务器,它的响应时间小于 10 毫秒。此外,在使用 SQL Server Management Studio 时,我也遇到了同样的行为(我刚刚在写完这个问题后尝试过这个,因为这个想法刚刚闪过我的脑海)。我认为这必须是网络问题而不是代码问题,因为在使用 SQL Server Management Studio 时也需要两次尝试。我意识到我可以对连接失败实施错误检查,然后重新尝试连接(无论如何我应该这样做)但这对我来说似乎不是特别“干净”,因为它没有解决根本问题。这里有没有人有这个问题的经验?
编辑 虽然一年多后这个问题已经被查看了超过 4000 次,但我发现虽然我 /thought/ 防火墙端口已打开,但实际上并没有。我错误地认为您需要在 Windows 中将防火墙打开到 SQL Server 使用的端口号,在我的情况下,我将其设置为允许 TCP 端口 1433 上的连接,防火墙在尝试建立初始连接时会导致问题。
我发现设置它的正确方法是设置 Windows 防火墙以允许 SQL Server 实例可执行文件通过。为此,您需要在 Windows 防火墙中添加一个程序,浏览到您的 sql 实例所在的文件夹C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLINSTANCE\MSSQL\Binn
,然后将 sqlservr.exe 文件添加到防火墙规则中。