2017-02-14 74 views
2

我已經閱讀了有關SQL Server超時異常的信息。我發現這兩個環節:區分SQL Server超時異常和C#中的SqlCommand超時異常

how to detect sql server timeout from .NET application without using catch Exception

How to catch SQLServer timeout exceptions

所以-​​2是一個客戶端超時,當我理解這個權利,可以使用此服務器連接超時和命令超時。 -1和-3是服務器網絡錯誤。

現在。在C#中是否有可能捕獲異常並區分服務器連接超時和命令超時?

非常感謝!

編輯:例如在這裏:

https://msdn.microsoft.com/en-us/library/cc645611.aspx

-2 超時過期。操作完成之前超時的時間或服務器沒有響應。 (Microsoft SQL Server,錯誤:-2)。

如何檢測在a)操作完成之前是否超時或b)服務器是否無響應?這就是問題。

+0

是否連接終止,如果命令超時?如果沒有 - 你有你的答案 – BugFinder

+0

連接超時意味着SQL Server不響應你的應用程序調用。命令超時意味着SQL Server試圖執行該命令,但無法及時完成它 – jean

+0

是的。我需要處理這個並拋出不同的例外。 – Canox

回答

1

是的,你可以。注意當你的數據庫管理系統沒有響應你的應用程序調用時發生連接超時,而命令時鐘指的是DBMS響應。事實上,它發送一個「失敗」,以便您的驅動器拋出異常。 雖然在命令中,它在連接超時時收到服務器的顯式錯誤代碼,但您的應用程序無法知道發生了什麼(可能有人拉動了網線,可能服務器已關閉),但驅動程序/框架的內部會告訴您使用數字屬性發生了什麼。

下面的代碼將查找例外編號屬性,並檢查它是否是命令超時

try 
{ 
    //your .net C# code here 
}  
catch (SqlException ex) 
{ 
    if (ex.Number == -2 && (Regex.IsMatch(sqlEx.Message, "[tT]ime\-{0,1}out")) { 
     Console.WriteLine ("Command Timeout occurred") 
    }; 
} 

此外,您可以解析異常文本,以獲取它是另一種類型的命令錯誤,例如FK違例。只要做一個正則表達式匹配「超時」字。

引用:​​3210

MSDN Forum

How to catch SQLServer timeout exceptions

+1

但-2可以是我還是我錯了? – Canox

+0

好的謝謝你的解釋,但是當我檢查它是否爲-2,然後會做一個else它會捕獲每一個異常,而不僅僅是服務器連接超時或其他連接超時 - 對嗎? – Canox

+0

@Canos youa重新更正,在此情況下編輯解釋您可以解析異常消息 – jean