【问题标题】:Checking for DBNull throws a StrongTypingException检查 DBNull 会引发 StrongTypingException
【发布时间】:2016-08-17 15:50:41
【问题描述】:

我正在使用数据集从数据库中提取数据。一行中的一个字段是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 也返回相同的错误。啊。

【问题讨论】:

    标签: .net vb.net dbnull


    【解决方案1】:

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

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

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

    If Not aRow.IsSomeFieldNull Then
       'do something
    End If
    

    【讨论】:

      【解决方案2】:

      试试这个: aRow.IsSomeFieldNull

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 谢谢,伙计。该行试图将 null 强制转换为具有默认 null 行为作为“抛出异常”的列。数据集让我很痛苦。
        【解决方案4】:

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

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

        参考这里:msdn documentation

        祝你好运。

        【讨论】:

          【解决方案5】:
          **DateTime? ToDate = (row.IsToDateNull()) ? null : row.IsToDate;**
          

          【讨论】:

            【解决方案6】:

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

            如果你使用

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

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

            【讨论】:

            • 这个——最简单的。
            猜你喜欢
            • 1970-01-01
            • 2013-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-02
            • 1970-01-01
            • 1970-01-01
            • 2023-03-06
            相关资源
            最近更新 更多