2008-10-07 52 views
2

我想知道每個人都認爲從您自己的數據庫處理結果的最佳方法是。其他團隊可能會參與其中,程序/數據總是有可能被改變,並且會出現錯誤的結果。我的問題是這個。讓異常發生,捕獲並記錄它或嘗試處理所有突發事件並隱藏錯誤會更好嗎?說,像下面的東西。消毒數據庫返回數據

if (dr.Table.Columns.Contains("column") && !dr["column"].Equals(DBNull.Value)) 
{ 
    this.value = (type)dr["column"]; 
} 
else 
{ 
    this.value= null; 
} 
+0

這個問題確實與數據庫沒有多大關係。呼叫服務或DLL也可以這樣說...這實際上是一個通用的異常處理問題。 – 2010-11-18 20:50:11

回答

4

就我個人而言,我喜歡快速失敗 - 當然有適當的歉意用戶消息。有一些值得從中恢復的東西,但是像預期爲非null的列是空的,對我來說這聽起來更重要。

當然,我也想嘗試建立一些煙霧測試,以確保您的生產:)

0

數據庫約束應該照顧這個最適合你之前瞭解它。對於什麼不是,我會建議回到數據庫設計並修復這些限制。

失敗的是,在該字段上返回一個異常將是最好的,以便數據可以被修復(或刪除)。

0

處理您認爲值得處理的所有事情,並在發生「不可能」事件時處理異常。

由於@AviewAnew說,你可能是一個有點偏執狂,但這並不意味着你錯了!

我原以爲缺少的列會比空值差得多,那麼如何爲丟失的列拋出異常呢?

try // wrap everything in a try/catch to handle things I haven't thought of 
{ 

    if (!dr.Table.Columns.Contains("column")) 
    { 
     throw new SomeSortOfException("cloumn: " + column + " is missing"); 
    } 
    else // strictly don't need the else but it makes the code easier to follow 
    { 
     if (dr["column"].Equals(DBNull.Value)) 
     { 
      this.value= null; 
     } 
     else 
     { 
      this.value = (type) dr["column"]; 
     } 
    } 
} 
catch(SomeSortOfException ex) 
{ 
    throw; 
} 
catch(Exception ex) 
{ 
    // handle or throw impossible exceptions here 
} 

另一方面......如果你打算在整個代碼中進行所有這些檢查,維護費用將會相當可觀。 ......這是另一回事。

您的電話!

0

我會盡力確保它不會發生在第一位或最小化發生的可能性。

例如來自jonSkeet的帖子。如果您希望列的非空條件對該列有約束?如果不是,那麼您可能會期望它,因爲DBA/DB開發人員告訴您這將是這樣。我會告訴他們,你會依靠這個事實,並鼓勵,鼓勵,哄騙他們添加非空約束。如果您期望獨特的價值觀,那麼請求一個獨特的約束。只有大寫字符,添加檢查約束。代碼檢查全部大寫,然後下一個應用程序和下一個應用程序以及下一個應用程序可以完成一次時,沒有什麼意義。記住幹 - 不要重複自己。

對於缺少的列錯誤,我的主動方法是確保db開發團隊瞭解應用程序使用哪些表和視圖以及過程。每個應用程序應該有它自己的用戶名,每個應用程序的用戶名應該被授予只選擇它需要的表格 - 而不是作爲安全功能,但作爲文檔。如果您更改此表格,則會被這些應用程序使用。與proc一樣,將執行授予使用它的應用程序。如果你保持這種緊張狀態,並且灌輸「在進行修改時檢查外部依賴性」的態度,那麼您將面臨很多錯誤。