首先,我想告訴大家我已搜查我的具體問題,似乎無法找到什麼導致我的問題。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文件添加到防火牆規則中。
如果您完全刪除連接字符串中的連接超時參數,該怎麼辦? –
你是否也改變了_command_ timeout? – Oded
感謝您的建議。默認的超時時間不夠明顯,我不得不將其從15到60秒的默認未定義超時增加。這仍然是一個奇怪的問題,因爲我使用的網絡從客戶端到服務器的延遲非常低(大約<= 10ms)。我猜這需要一段時間的sqlconnection來解析服務器名稱。這就是我能想到的。 –