检查 DBNull 会引发 StrongTypingException

发布于 2024-10-11 20:37:00 字数 433 浏览 9 评论 0原文

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

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

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

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

I am using a dataset to pull data from a DB. One of the fields in a row is NULL. I know this. However, the following vb.net code throws a StrongTypingException (in the autogenerated get_SomeField() method in the dataset designer):

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

According to documentation and this question it should be fine.

edit: If aRow.SomeField is DBNull.Value Then also returns the same error. Argh.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

孤檠 2024-10-18 20:37:00

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

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

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

If Not aRow.IsSomeFieldNull Then
   'do something
End If

Just some additional information: The exception comes because you are using a strongly typed DataSet. StrongTypingException documentation says it:

The exception that is thrown by a strongly typed DataSet when the user accesses a DBNull value.

The usage of strongly typed DataSets is slightly different from that of the untyped ones. With strongly typed DataSets you get automatically some extended/additional methods for your fields that you can call. In your case you would very likely have to call:

If Not aRow.IsSomeFieldNull Then
   'do something
End If
-黛色若梦 2024-10-18 20:37:00

试试这个:
aRow.IsSomeFieldNull

Try this:
aRow.IsSomeFieldNull

甜心 2024-10-18 20:37:00

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

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

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

我不是一个巨大的 DataTable 人,但您可以尝试通过名称/索引/检查它柱子;或者将该列标记为可为空,以便它为 Nullable(在上面的示例中)。

The difference is that in the related question it is talking about an untyped value (i.e. object) via an indexer. When you go via .SomeField, the type is already included - so this could be int etc. And it wouldn't make sense to try IsDBNull on an int, as an int can never be DBNull.

Essentially the SomeField is a wrapper for (excuse the C# accent...)

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

I'm not a huge DataTable person, but you could try checking it by name/index/column; or marking the column as nullable so that it is Nullable<int> (in the example above).

若水微香 2024-10-18 20:37:00

有一种巧妙的方法可以解决这个问题。但你需要意识到后果。

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

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

祝你好运。

There is a neat way of going around it. But you need to be aware of consequences.

To prevent exception of occuring you can change in DataSet field property NullValue to either "Null" or "Empty" (whatever suits your needs). Default is set to "Throw Exception".

For a reference look here: msdn documentation

Good luck.

情栀口红 2024-10-18 20:37:00
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
**DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
卷耳 2024-10-18 20:37:00

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

如果您使用

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

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

This question is old but what i'm adding doesn't seem to be in any of the other answers.

If you use

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

This will not throw an exception even if you're using a strongly typed dataset

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文