如何处理将 DBNull 传递给函数?

Posted

技术标签:

【中文标题】如何处理将 DBNull 传递给函数?【英文标题】:How to handle passing DBNull into a function? 【发布时间】:2013-09-05 14:51:19 【问题描述】:

我正在从存储过程返回结果并将它们传递给函数以进行进一步处理。在某些情况下,其中一个字段(日期值)可能(并且非常好)返回 null。

但是,每当我将 null 传递给函数时,都会抛出异常,试图将 null 转换为函数参数的类型。处理这个问题的最佳方法是什么?

数据:

Name    StartDate    EndDate
Bob     01/01/2013   NULL

调用函数:

MyFunction(
           DataRow.Item("StartDate"), 
           DataRow.Item("EndDate")) ' <--- invalid cast exception

功能:

Public Function MyFunction(
                           ByVal StartDate as Date, 
                           ByVal EndDate as Date) As Object
    ....
    Return something
End Function

编辑:很多很棒的技巧,但仍然没有骰子。

将函数中的 DateTime 类型声明为可为空,ByVal EndDate as DateTime?,结果为 System.InvalidCastException: Specified cast is not valid.

使用 DataRow.Field(Of DateTime)("EndDate") 以及将参数声明为可空类型会导致 System.InvalidCastException: Cannot cast DBNull.Value to type 'System.DateTime'

EDIT2:找到了我的一个问题的根源。我使用的是 Iif(),其中一个值是 System.DBNull 类型,另一个是 Date 类型。并且真假部分必须是同一类型。我花了一段时间才发现这一点。

【问题讨论】:

我不认为 Date 是可以为空的类型.. 以后也请记住这一点,许多数据类型默认情况下不可为空,必须明确声明为允许空值。 【参考方案1】:

使用nullable DateTime 参数:

 ByVal EndDate AS Nullable(Of DateTime)

完整示例:

Public Function MyFunction(ByVal StartDate as Date, ByVal EndDate as Nullable(Of DateTime)) As Object
    ....
    Return something
End Function

【讨论】:

有趣的是,我不知道 DateTime 在功能上与 Date 有什么不同。我一直想知道这一点。谢谢。 @Darren Davies 我试过了,现在它在同一行上给了我一个更一般的错误。“System.InvalidCastException: Specified cast is not valid.”【参考方案2】:

你试试可以做参数Nullable:

Public Function MyFunction(ByVal StartDate as DateTime, ByVal EndDate as DateTime?) As Object
    ....
    Return something
End Function

但您可能需要使用Field 方法调用它:

MyFunction(DataRow.Field(Of DateTime)("StartDate"), DataRow.Field(Of DateTime?)("EndDate")) 

【讨论】:

我从不知道 Nullable 的 ? 简写!多么棒的、出乎意料的小贴士。 如果我使用您的 Field(Of DateTime) 建议,我会收到“System.InvalidCastException:无法将 DBNull.Value 转换为类型 'System.DateTime'。请使用可为空的类型。” ...如果我只使用 row.Item("..") 那么我得到“System.InvalidCastException: Specified cast is not valid.”有什么想法吗? @user1003916 请注意,它是Field(Of DateTime?)(可以为空,带有?)。这应该有效。根据MSDN:“如果指定DataColumn的值为Value且*T为引用类型或可空类型,则返回类型为null。方法不会返回 DBNull.Value.*"。如果StartDate 也可以为空,您可能需要将Field(Of DateTime?) 与两个参数一起使用。【参考方案3】:

您应该考虑为可以为空的值使用可空值。看看这里的例子......DateTime "null" value

【讨论】:

不确定开始时间是否也可以为空,但要记住一些事情。【参考方案4】:

从数据库方面,您可以对日期时间进行空值检查并分配任何日期,例如 '1/1/1990'

【讨论】:

这听起来很糟糕。

以上是关于如何处理将 DBNull 传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

从 DataAdapter 拉数据时如何处理 DBNull

如何处理所有 DBNull 而无需每次都检查它们(使用生成的 DataSet)? [复制]

将DBNull传递给SqlParameter时出错

ThreadPool 如何处理传递的变量

如何处理非规范化数据以传递给平面列表?

iOS 如何处理传递给 AFHTTPSessionManager GET 方法的空格或特殊字符?