关于.net:如何处理将DBNull传递给函数?

How to handle passing DBNull into a function?

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

但是,每当我将空值传递给函数时,如果试图将空值转换为函数参数的类型,就会引发异常。最好的方法是什么?

数据:

1
2
Name    StartDate    EndDate
Bob     01/01/2013   NULL

调用函数:

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

功能:

1
2
3
4
5
6
Public Function MyFunction(
                           ByVal StartDate as Date,
                           ByVal EndDate as Date) As Object
    ....
    Return something
End Function

编辑:很多很好的提示,但仍然没有骰子。

将函数中的日期时间类型声明为可以为空的ByVal EndDate as DateTime?,将导致System.InvalidCastException: Specified cast is not valid.

使用datarow.field(属于datetime)("enddate")以及将参数声明为可以为空的类型将导致System.InvalidCastException: Cannot cast DBNull.Value to type 'System.DateTime'

伊迪丝2:找到了我一个问题的根源。我使用的是iif(),其中一个值的类型为System.DBNull,另一个值的类型为Date。真假部分必须是同一类型。我花了点时间才发现。


使用可为空的日期时间参数:

1
 ByVal EndDate AS Nullable(Of DateTime)

完整例子:

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


您可以尝试使参数Nullable为:

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

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

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


从数据库端,您可以空检查日期时间,并分配任何日期,如"1/1/1990"。


对于可以为空的值,应该考虑使用可以为空的值。看看这里举个例子……日期时间"空"值