無法將型別為“System.DBNull”的物件強制轉換為型別“System.String”分析及解決方案

螢火蟲小Q發表於2012-08-02

         今天在做專案的時候,無意間犯了一個錯誤,出現了:無法將型別為“System.DBNull”的物件強制轉換為型別“System.String”。的錯誤提示。想著很多的初學者可能會遇上同樣的問題,現在分析出現的問題,並解決之。

問題:用強型別DataSet 獲取Oracle資料,其中一個欄位值為DBNull,報錯:無法強制轉換成String。

詳細錯誤資訊如下所示:

無法將型別為“System.DBNull”的物件強制轉換為型別“System.String”。  
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊跟蹤資訊,以瞭解有關該錯誤以及程式碼中導致錯誤的出處的詳細資訊。  

異常詳細資訊: System.InvalidCastException: 無法將型別為“System.DBNull”的物件強制轉換為型別“System.String”。

源錯誤:  


行 5092: get {
行 5093: try {
行 5094: return ((string)(this[this.tableBRN_YXJX_MN_ATTACHED.AUDITER_CODEColumn]));
行 5095: }
行 5096: catch (global::System.InvalidCastException e) {後面還有很多的,就不再累述了。

出現問題的原因如下:

       資料庫中很多欄位是空值,但是需要載入到資料控制元件中,於是在預設的情況下就會出現問題了。因為微軟在設計的時候就是預設的資料欄位在載入的時候如果例項資料為空就會丟擲異常,正是由於微軟這個非常人性化的設計出現了上述的錯誤。

 

解決的方案:方案很多,這裡就說說幾種簡單方便的方案。



1、開啟強型別DataSet的設計檢視,找到報錯的列,選擇此列,在【屬性】視窗中可以看到一個設定

選項:

NullValue。

這個值有三個選項:Null,Empty,Throw exception


選擇Null或者Empty就OK了。


這個選項用於設定如果所取資料的這個欄位值為NullValue時的處理辦法。

預設是第三個選項:丟擲異常。

修改後就OK了!

 

2、可以改寫SQL在 欄位新增ISNULL(["你的要查詢的欄位"],0);這個的效果是如果這個欄位的值是空那轉成"0";

 

3、 在讀取時價格判斷,if(讀的值!=“”){讀取值,賦值;}這個是如果讀的值不為空就執行賦值的操作

 

4、sdr.IsDBNull(5) ? string.Empty : sdr.GetString(5);這樣問題就會迎刃而解了。

相關文章