我正在使用数据集从数据库中提取数据。连续的一个字段是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
也会返回相同的错误。哎呀。
答案 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
即使您使用强类型数据集
,也不会抛出异常