2010-01-13 91 views
7

我有下面的代碼行如何爲DBNull不等於DBNull的

if (DBNull.Value.Equals(o) || o != null) 

其中oobject o in row.ItemArray我不斷收到的錯誤 - >

Xml type "List of xdt:untypedAtomic" does not support a conversion from Clr type "DBNull" to Clr type "String".

我也不是什麼理解是,當我通過我的代碼時,這if應該趕上這一點,執行我的替代動作,但它不?

有人可以爲我散光。

謝謝!

+0

你能發佈一些更多的代碼嗎? o哪裏得到分配? – hackerhasid 2010-01-13 21:03:30

+1

Console.WriteLine(o.GetType()。Name);'?的結果是什麼? – jason 2010-01-13 21:10:03

+2

我認爲這有點奇怪,首先你與DBNull比較,然後與非空 – tga 2010-01-13 21:18:38

回答

1

可能是這樣的比較有助於

if (!o.GetType().Equals(DBNull.Value))

if (o is DBNull)

6

我覺得你的問題是,實際上

DBNull.Value == null 
//is always false 

的DBNull的是對值進行比較從數據庫返回這樣一類特殊的你真的需要檢查一個空的條件和一個DBNull.value,如果你的數組包含兩個。

編輯:抱歉仔細看看你的代碼,你可能只需要扭轉你的OR操作。如果o == null,你的第一個語句將會拋出你的異常。嘗試:

if (o != null || o == DBNull.Value) 
+1

如果o == null ... – 2010-01-14 15:57:30

+0

這個編輯是錯誤的,它做了一個完全相反的測試。正如@ThomasLevesque正確指出的那樣,它需要是'if(o == null || o == DBNull.Value)'。但是第一條語句也不是一個問題,但是這種風格確實會導致許多編碼錯誤,當對象爲空時它會拋出異常。因此,在對值做任何其他操作之前,總是檢查是否爲null或不爲空。 – 2016-02-08 14:51:51

+1

當你嘗試像'if(o.ToString()){...}'之類的東西時,'炸燬代碼'的錯誤是因爲當o爲null時,任何*屬性*或方法函數像'.ToString() '會拋出一個錯誤。所以確保首先測試null或非null是一種很好的做法。但是,如果(DBNull.Value.Equals(o)|| o!= null)不訪問o的任何屬性。如果該方法正確處理空值,那麼當o爲空時沒有錯誤。但是,很多程序員忘記測試null,所以經常將null傳遞給MANY方法會導致很多問題,因爲誠實地說,很多代碼是sl。不馴的。 – 2016-02-08 15:00:50