爲什麼以下代碼:如何正確檢查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
爲什麼以下代碼:如何正確檢查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
你是正確的。 AndAlso
短路。
但是,錯誤出現由調用CurRow("GuyBook")
(在調試器中驗證這一點,以確保我不是騙子或做一些瘋狂的假設,或者只是記錯* ;-)。在詢問數值之前,您需要詢問DataRow if it has a value。也就是說,使用:
CurRow.IsNull("BuyBook")
快樂編碼。
*一應該只是能夠與DBNull.Value
比較或使用IsDBNull
。不過,我相當肯定,在我拋出這些異常之前,我碰到了一排,而不是返回一個DBNull
對象。首先在調試器的立即窗口中找到 - 正好其中表達式拋出異常。
而不是不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"
我想你錯過了這個'我甚至已經把它分成兩個陳述,並嘗試'。 – 2012-01-13 07:35:07
您是否嘗試過比較像這樣:
If CurRow("BuyBook") Is DBNull.Value Then
'...
End If
是的,我收到一個異常,說你無法比較Object和DBNull類型。 – merlin2011 2012-01-13 07:41:47
已更新,以更改比較方式,以匹配在我們的某些代碼中完成的操作。 – Pondidum 2012-01-13 07:52:25
在vb.net我平時做這樣的事情:
A = (CurRow("BuyBook") & "" = "Yes")
老把戲從VB6的時代。如果CurRow("BuyBook")
爲空,則vb.net在將它與另一個字符串連接時會將其視爲空字符串。
這不是依靠Option Strict關閉嗎?如果使用此解決方案,我寧願直接使用ToString方法'CurRow(「BuyBook」)。ToString =「Yes」。 – jmoreno 2015-05-24 04:45:50
If dt.Rows(0)("BuyBook") = DBNull.Value Then
End If
希望它有幫助。
您可以試試這個'A =(不是IsDBNull(CurRow(「BuyBook」)))並且CType(CurRow(「BuyBook」),string)=「是」' – 2012-01-13 07:17:42
調試代碼以查看單元格內的數據。 – Boomer 2012-01-13 07:21:31
我甚至把它分成兩個陳述並嘗試。我認爲IsDBNull壞了。 – merlin2011 2012-01-13 07:25:37