9

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

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

根据文档和这个问题,应该没问题。

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

4

6 回答 6

19

只是一些附加信息:出现异常是因为您使用的是强类型 DataSetStrongTypingException文档说:

当用户访问 DBNull 值时,强类型 DataSet 引发的异常。

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

If Not aRow.IsSomeFieldNull Then
   'do something
End If
于 2011-01-14T09:57:27.933 回答
7

试试这个:aRow.IsSomeFieldNull

于 2011-01-14T09:49:01.733 回答
4

有一种巧妙的方法可以绕过它。但是你需要知道后果。

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

如需参考,请查看此处:msdn 文档

祝你好运。

于 2011-06-20T09:55:36.983 回答
4

object不同之处在于,在相关问题中,它通过索引器谈论未类型化的值(即)。当您通过.SomeField时,该类型已经包含在内-因此可能是int等等。尝试IsDBNullan是没有意义的int,因为 anint永远不可能DBNull

本质上SomeField是一个包装器(请原谅 C# 口音...)

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

我不是一个大人物DataTable,但你可以尝试按名称/索引/列检查它;或将该列标记为可为空,以便它是Nullable<int>(在上面的示例中)。

于 2011-01-14T09:42:22.403 回答
1

这个问题很老,但我要添加的内容似乎不在任何其他答案中。

如果你使用

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

即使您使用的是强类型数据集,这也不会引发异常

于 2013-07-10T15:15:12.120 回答
1
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
于 2012-02-23T07:44:53.577 回答