从数据库中获取NULL值并分配给Date变量

时间:2009-03-11 16:55:04

标签: asp.net vb.net date

存储过程返回有关用户记录的数据,包括上次登录日期的可空日期时间列。在尝试分配.Net日期变量时,哪一个是处理NULL值可能性的更好选择?

    Try
        _LastLogin = CDate(DT.Rows(0)("LastLogin"))
    Catch ex As InvalidCastException
        _LastLogin = Nothing
    End Try

    If DT.Rows(0)("LastLogin") Is DBNull.Value Then
        _LastLogin = Nothing
    Else
        _LastLogin = CDate(DT.Rows(0)("LastLogin"))
    End If

编辑:我也忘记了使用TryParse

的可能性
    If Not Date.TryParse(DT.Rows(0)("LastLogin").ToString, _LastLogin) Then
        _LastLogin = Nothing
    End If

哪个是从数据库中处理可能的NULL值的首选方法?有没有比列出的三个更好的方法?

编辑#2 :我注意到TryParse方法尝试分配到Nullable类型时效果不佳。

5 个答案:

答案 0 :(得分:6)

第二个代码段更好。例外是针对特殊情况,而不是您预期会发生的情况。此外,意图更好。很明显,您期望DBNull成为可能的值,并且您希望相应地处理它。

此外,如果值不为null但不可解析,则可能会产生意外后果(尽管可能永远不会发生这种情况)。

答案 1 :(得分:2)

第二种方法更可取,因为抛出异常涉及成本(特别是如果你希望LastLogin字段定期为NULL)。

这是一个很好的blog post,其中包含有关例外的更多详细信息(请参阅有关例外和效果的部分)。

答案 2 :(得分:2)

我使用的是FixDBNull类:

Public Class FixDBNull(Of ItemType)    
    Public Shared Function Convert(ByVal data As Object) As ItemType
        If data IsNot System.DBNull.Value Then
            Dim obj As ItemType = Nothing

            Try
               obj = CType(data, ItemType)    
            Catch ex As Exception
                'do something with the conversion error
            End Try

            Return obj
        Else
            Return Nothing
        End If

End Function
End Class

然后我可以这样称呼它:

_LastLogin = FixDBNull(Of date).Convert( DT.Rows(0)("LastLogin"))

将返回任何内容或日期。

答案 3 :(得分:1)

在VB.net中,它必须是Nullable(of Date)

这是一种方式:

dim theDate as nullable(of Date)

    If theDate.HasValue Then
      'you can proceed
    Else
      'you must assign with DBNull.value
    End If

数据库也可能会影响您的工作。 无论如何,MS Access都会关注日期。我最终得到了上述工作,但我通常更喜欢在Access中将日期保存为字符串。它只会减少麻烦。

答案 4 :(得分:0)

我会使用TryCast,它看起来像这样:

_LastLogin = TryCast(DT.Rows(0)("LastLogin"), Date?)