2012-01-13 38 views
9

爲什麼以下代碼:如何正確檢查VB中的DBNull?

A = not IsDBNull(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

導致以下錯誤:

Conversion from type 'DBNull' to type 'String' is not valid. 

當AndAlso根據本文應該短路:

http://support.microsoft.com/kb/817250

+0

您可以試試這個'A =(不是IsDBNull(CurRow(「BuyBook」)))並且CType(CurRow(「BuyBook」),string)=「是」' – 2012-01-13 07:17:42

+0

調試代碼以查看單元格內的數據。 – Boomer 2012-01-13 07:21:31

+0

我甚至把它分成兩個陳述並嘗試。我認爲IsDBNull壞了。 – merlin2011 2012-01-13 07:25:37

回答

9

你是正確的。 AndAlso短路。

但是,錯誤出現由調用CurRow("GuyBook")(在調試器中驗證這一點,以確保我不是騙子或做一些瘋狂的假設,或者只是記錯* ;-)。在詢問數值之前,您需要詢問DataRow if it has a value。也就是說,使用:

CurRow.IsNull("BuyBook") 

快樂編碼。


*一應該只是能夠與DBNull.Value比較或使用IsDBNull。不過,我相當肯定,在我拋出這些異常之前,我碰到了一排,而不是返回一個DBNull對象。首先在調試器的立即窗口中找到 - 正好其中表達式拋出異常。

0

而不是不IsDBNull(CurRow(「BuyBook」)),使用NOT(CurRow(「BuyBook」))是System.Dbnull.Value)。試試這個:

A = (NOT (CurRow("BuyBook")) is System.Dbnull.Value) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 

OR

A = not string.IsNullOrEmpty(CurRow("BuyBook")) AndAlso CType(CurRow("BuyBook"), string) = "Yes" 
+0

我想你錯過了這個'我甚至已經把它分成兩個陳述,並嘗試'。 – 2012-01-13 07:35:07

4

您是否嘗試過比較像這樣:

If CurRow("BuyBook") Is DBNull.Value Then 
    '... 
End If 
+0

是的,我收到一個異常,說你無法比較Object和DBNull類型。 – merlin2011 2012-01-13 07:41:47

+0

已更新,以更改比較方式,以匹配在我們的某些代碼中完成的操作。 – Pondidum 2012-01-13 07:52:25

-1

在vb.net我平時做這樣的事情:

A = (CurRow("BuyBook") & "" = "Yes") 

老把戲從VB6的時代。如果CurRow("BuyBook")爲空,則vb.net在將它與另一個字符串連接時會將其視爲空字符串。

+0

這不是依靠Option Strict關閉嗎?如果使用此解決方案,我寧願直接使用ToString方法'CurRow(「BuyBook」)。ToString =「Yes」。 – jmoreno 2015-05-24 04:45:50

0
If dt.Rows(0)("BuyBook") = DBNull.Value Then 
End If 

希望它有幫助。