2010-08-09 66 views
1

考慮一個簡單的設置:爲什麼不是ODBCConnection.State可靠?

// _conn is the OdbcConnection with a MySQL-Server (MySQL-Connector 3.51) 
// _cmd is a created OdbcCommand 

// Constructor has created the objects successfully 

public void DoSomething() { 
    if(_conn.State == ConnectionState.Open) 
     _cmd.ExecuteNonQuery(); 
} 

現在我的問題是,OdbcConnection.State是不可靠的。事情是,一段時間後連接丟失,但State - 屬性不知道任何關於它,並不斷告訴我,連接是打開的,至少直到我嘗試執行一個命令(它優雅地失敗) 。我甚至遇到了State - 屬性永遠不會刷新,並一直告訴我,連接仍然存在(但命令失敗)。

當然,我可以將Try {...} Catch {...}塊添加到我的代碼中,但我試圖避免它們,因爲使用至少四行錯誤處理擴展雙行功能有點重。

所以我的問題是:爲什麼不是OdbcConnection.State可靠,我可以修復它?

回答

3

網絡的本質是,除非實際嘗試發送數據,否則您通常不知道存在問題。如果您只是將插頭從計算機背面拔出(或者將插頭從客戶端和服務器之間的某個位置拔出),則在操作系統實際嘗試發送數據之前無法知道操作系統甚至有一個問題。

的原因的話,那State是不可靠的,是因爲它不可能使是完全可靠的,而不實際實際上是試圖將數據發送到服務器。由於這對於一個簡單的屬性來說太過於工作(整個網絡往返),所以它不會這麼做,而只是做最簡單的事情。

另外,當您撥打State == Open和實際執行命令之間存在競爭狀態:您可能會調用State == Open,然後在執行命令之前有人拉動插頭。

因此,在一天結束時,您將不得不擁有該異常處理程序。我還建議你不要在每次調用數據庫時都拋出異常。如果你正在做一個網站,然後有一個頁面級處理程序,並在那。嘗試「處理」數據庫以任何其他方式進行,而不是通過向用戶顯示錯誤消息來確實沒有意義...

相關問題