2011-06-27 34 views
0

我做了一個捕獲,如果拋出特定的sql服務器錯誤,代碼可能會忽視並繼續執行。一位同事表示,我正在捕獲的錯誤消息是從SQL引發的,當我們升級到2008年時它可能會發生變化。他說我的解決方案今天可以使用,但這是一個弱項解決方案。所以,我的問題是...如何捕獲和處理從SQL服務器拋出的錯誤,如果它可能依賴於sql服務器版本。即(2005年,2008年或更新)?關於如何使捕魚更好的任何想法?如何捕獲可能隨SQL Server升級而更改的SQL錯誤

我的代碼

string sqlError = "The INSERT statement conflicted with the FOREIGN KEY constraint Table1. The conflict occurred in database Work1, table Table2."; 

catch (Exception oExp) 
{ 
//This check will allow the specific error to continue without getting caught. 
if (oExp.Message.Contains(Constants.sqlError) == false) 
{ 
    throw oExp; 
} 
} 
+0

爲什麼錯誤首先被拋出。我會盡力解決這個問題。 –

+0

同意 - 這是一個可避免的錯誤 - 所以採取措施避免它發生的可能性。 –

+0

,不要'拋出oExp;'拋開';否則你會失去我認爲的堆棧跟蹤。 –

回答

1

正如在評論中指出,這是避免所以你應該做正確的事,並確保它不能在第一時間發生。

正如你猜測的那樣,使用靜態文本是一件壞事。如果考慮到這些消息將根據安裝了SQL Server或用戶登錄的語言(如SQL消息是區域設置敏感的)而變化,則無論升級級別如何,情況更是如此。

另外...我不太明白爲什麼你要繼續,即使這個錯誤被拋出,因爲它聽起來像它把你的數據進入不一致的狀態,所以我會檢查你是否在做首先是正確的事情。然而,我不知道你的申請...

因此,所有這些警告說...在避免這種情況是不可能的(無論什麼原因 - 不包括懶惰:-)),而不是抓住一個通用的Exception,你應該趕上SqlException,其中包括StateNumber屬性,你應該能夠逐字使用。

+0

有一個項目從表中刪除了行,並且此錯誤是無法預料的。他們沒有從表中刪除的行,所以我們無法恢復。不要問我爲什麼,我不知道。我將更深入地探討SqlException,它處理Chris J.建議的狀態和編號。謝謝大家。 –