2012-12-10 128 views
3

首先,我想告訴大家我已搜查我的具體問題,似乎無法找到什麼導致我的問題。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秒的默認未定義超時增加。這仍然是一個奇怪的問題,因爲我使用的網絡從客戶端到服務器的延遲非常低(大約<= 10ms)。我猜這需要一段時間的sqlconnection來解析服務器名稱。這就是我能想到的。 –

回答

4

您正在將連接超時值設置爲1秒。從連接字符串中刪除它,然後重試。

或者問題可能是與選擇您所使用的SQL。這會花費很長時間嗎?如果是這樣,第二次和第三次調用將檢索緩存的值,從而運行得更快。

+0

Hrm,將連接超時增加到60個工作。這仍然是一個奇怪的問題,因爲客戶端和服務器之間的延遲幾乎不存在。我能想到的唯一事情就是查找需要一段時間。 –

+1

@ Termin8tor你在這裏看到的是連接池(http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.80).aspx)。在第一個連接上,大量的準備工作已經完成;此後,連接立即達到所有意圖和目的。 – briantyler

+0

@牛的嘴巴 - 啊!解釋它!感謝那些信息,這非常有用!現在只是讀了一遍,聽起來好像是什麼導致了我所看到的行爲。感謝您的洞察! –