检查DBNull会抛出StrongTypingException

时间:2011-01-14 09:29:57

标签: .net vb.net dbnull

我正在使用数据集从数据库中提取数据。连续的一个字段是NULL。我知道这个。但是,以下vb.net代码会抛出StrongTypingException(在数据集设计器中的自动生成的get_SomeField()方法中):

If Not IsDBNull(aRow.SomeField) Then
'do something
End If

根据文件和this question,它应该没问题。

编辑:If aRow.SomeField is DBNull.Value Then也会返回相同的错误。哎呀。

6 个答案:

答案 0 :(得分:17)

仅提供一些其他信息:出现异常是因为您使用的是强类型数据集StrongTypingException文档说明了:

  

当用户访问DBNull值时强类型DataSet抛出的异常。

强类型DataSet的使用与非类型化DataSet的使用略有不同。使用强类型数据集,您可以自动获得可以调用的字段的一些扩展/附加方法。在您的情况下,您很可能需要致电:

If Not aRow.IsSomeFieldNull Then
   'do something
End If

答案 1 :(得分:5)

试试这个:  aRow.IsSomeFieldNull

答案 2 :(得分:4)

不同之处在于,在相关问题中,它是通过索引器讨论无类型值(即object)。当您通过.SomeField时,类型已经包含在内 - 因此可能是int等等。在IsDBNull上尝试int是没有意义的int可以从不成为DBNull

基本上SomeField是一个包装器(原谅C#重音......)

public int SomeField {
    get { return (int) this["someFieldName"]; }
    set { this["someFieldName"] = value; }
}

我不是一个庞大的DataTable人,但您可以尝试按名称/索引/列进行检查;或将列标记为可为空,使其为Nullable<int>(在上例中)。

答案 3 :(得分:3)

有一种巧妙的解决方法。但你需要意识到后果。

为了防止发生异常,您可以将DataSet字段属性NullValue更改为“Null”或“Empty”(根据您的需要)。默认设置为“抛出异常”。

有关参考,请点击此处:msdn documentation

祝你好运。

答案 4 :(得分:1)

**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**

答案 5 :(得分:0)

这个问题很陈旧,但我添加的内容似乎没有出现在任何其他答案中。

如果您使用

If Not IsDBNull(aRow.item("SomeField")) Then
    'do something
End If

即使您使用强类型数据集

,也不会抛出异常