如何在VB中正确检查DBNull?

10

为什么以下代码会:

  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


你能试试这个吗?A = (not IsDBNull(CurRow("BuyBook"))) AndAlso CType(CurRow("BuyBook"), string) = "Yes" - Amar Palsapure
调试代码以查看单元格内的数据。 - Boomer
我甚至将其分成了两个语句并尝试过。我认为 IsDBNull 有问题。 - merlin2011
3
顺便问一下,CurRow 的数据类型是什么?是 anIDataReader/SqlDataReader 吗? - Pondidum
请尝试使用 NOT (CurRow("BuyBook")) is System.Dbnull.Value,它应该可以正常工作。 - Harsh
显示剩余2条评论
5个回答

11
你是正确的。AndAlso是短路的。
然而,错误是由于调用CurRow("GuyBook")(在调试器中验证以确保我不是说谎或做出一些疯狂的假设或只是记错了 *;-)。在请求值之前,您需要询问DataRow 它是否有一个值。也就是说,请使用:
CurRow.IsNull("BuyBook")

愉快的编程。


应该只需与DBNull.Value进行比较或使用IsDBNull。但我相当确定之前遇到过一行代码,它抛出了这些异常而不是返回一个DBNull对象。首先,在调试器的即时窗口中找出确切地引发异常的哪个表达式。


6

你尝试过像这样进行比较吗:

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

是的,我收到了一个异常,说不能比较Object和DBNull类型。 - merlin2011
更新以匹配我们某些代码中的比较方式。 - Pondidum

1

不要使用 IsDBNull(CurRow("BuyBook")),而是使用 NOT (CurRow("BuyBook") is System.DBNull.Value)。试试这个:

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

或者

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

我猜你可能错过了这个部分:“我甚至将它拆分成两个语句并尝试”。 - Amar Palsapure

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

希望能有所帮助。


-1
在VB.NET中,我通常会这样做:
A = (CurRow("BuyBook") & "" = "Yes")

这是VB6时代的老技巧。如果CurRow("BuyBook")为空,vb.net在将其与另一个字符串连接时会将其视为空字符串。


这不是依赖于关闭Option Strict吗?如果使用这种解决方案,我更喜欢直接使用ToString方法 CurRow("BuyBook").ToString = "Yes" - jmoreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接