2011-08-18 86 views
0

使用c#vs2008 winforms。Winforms窗體處理最佳實踐中的Sql異常

我的標準形式具有
形式負載
SqlConnection對象打開一個典型的使用模式。

讀/寫數據集採用sqldataadaptors
讀取使用SQL的讀者很多東西
使用存儲過程編寫

關閉SQL連接
密切形式

在處理異常因此,whats最佳實踐寫了許多數據在這種類型的使用模式 中,我使用try catch子句將所有讀取和寫入代碼放在sql服務器中以捕獲異常。

那麼當我陷入異常時我該怎麼辦?
我應該關閉並處理所有的sql對象嗎?
我應該關閉窗體並處理窗體。
我應該嘗試讓用戶繼續
我應該嘗試重新打開我的sqlconnection,如果異常是sql連接斷開了?
鑑於我打開和關閉表單加載和關閉連接,因爲它只有在理論上打開一次,並關閉一次與許多讀寫中間。

我只是不確定我應該採取什麼行動,當我陷入異常,以防止內存和資源泄漏。

任何意見讚賞

感謝

回答

2

這取決於你收到異常及其嚴重程度。如果它是錯誤號1205,那麼您將需要重試,因爲這是SQL Server死鎖錯誤。例如

catch (SqlException sqlEx) 
{  
    if (sqlEx.Number == 1205)  
    {   
     // Deadlock occurred, retry...  
    }  
    else   
     throw; 
} 

對於不可恢復的錯誤,你想清理和連接等

最佳做法是使用using塊只要一個對象實現IDisposable(如SqlConnectionSqlCommand等處置)

來得到錯誤代碼的完整列表,運行這個TSQL:

SELECT * FROM sysmessages 
+0

另外SqlCommand是IDisposable。總是檢查框架類的MSDN文檔,看他們是否實現IDisposable;如果是這樣,請使用「使用」塊以確保及時處理它們。 – Polyfun

+0

如果您是死鎖受害者(錯誤1205),則整個事務將回滾,因此如果您重試,請確保從頭重試事務(再次執行事務中的所有語句)。 – Polyfun

+0

http://stackoverflow.com/questions/320636/how-to-get-efficient-sql-server-deadlock-handling-in-c-with-ado –

0

您可能需要考慮在您的表單的整個生命週期中不保持SqlConnection打開狀態。表單的生命期由用戶控制,因此目前SqlConnections的生命週期也由用戶控制,這不是一個好主意;數據庫上的鎖可能會保持打開狀態,直到SqlConnection關閉。在多用戶系統中,這可能會增加鎖定記錄的爭用 - 當您的表單打開連接時,您可能會阻止其他用戶。

最好打開和關閉表單上特定動作的連接,例如,當用戶單擊按鈕時。因爲連接池自動實現在封面上,所以您不必擔心重複打開和關閉連接的開銷 - 這將通過連接池最小化。

+0

我不記得曾遇到記錄被鎖定的問題一個開放的sql連接。你能提供更多關於這方面的信息嗎? – Spooky2010

+0

此外,我們發現在通過VPN時,爲表單的生命保持開放的sql連接顯着加速數據庫訪問,這就是爲什麼我們要這樣做 – Spooky2010