2012-10-24 34 views
0

我需要能夠測試System.Data.SqlClient.SqlException是否由於網絡錯誤(.NET環境連接到MS SQL Server)。如果是這樣,我可以告訴用戶他的連接有問題,但如果不是這樣,它很可能是我的代碼中的一個錯誤,它被區別對待。很明顯,不要發生誤報(宣佈在出現問題時提出網絡問題)。確定是否由於網絡問題導致SqlException

在相關問題over here有人建議從例外文本中提取信息。這對我來說很難,也很難,因爲文本是本地化的,並且可能因環境而異。

暫時,我考察了某些函數調用,這(通過經驗)與網絡問題相關的調用堆棧:

System.Data.SqlClient.TdsParserStateObject.WritePacket 
System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket 
System.Net.Sockets.SocketException 

然而,這些彈起的,如果有,而超時執行,例如,一個SELECT查詢。所以在那裏,我將不得不恢復到檢查「超時」是否出現在異常消息中,這很醜陋。

有沒有人有更好的主意?

回答

3

分析錯誤消息和堆棧是最後你想要做的事情。

SqlException附帶收集Errors
通過檢查SqlError.Number,SqlError.State和SqlException內部異常,您可以很好地猜測異常是本地(即網絡)還是遠程(即服務器)。 100以上的錯誤編號很可能由服務器報告。錯誤編號-2,-1,2和53被認爲是客戶端錯誤。包含內部Win32Exception的異常也是客戶端。 MSDN包含此decision table以提供幫助。

作爲一個方面說明:超時不是服務器錯誤,不存在SQL Server中查詢超時等概念。超時由您自己的應用程序觸發,因爲SqlCommand.CommandTimeout默認爲30秒。