代码之家  ›  专栏  ›  技术社区  ›  TheTXI

从数据库中获取空值并分配给日期变量

  •  3
  • TheTXI  · 技术社区  · 17 年前

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

        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
    

    编辑

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

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

    编辑#2 TryParse 方法在尝试分配给 Nullable 类型

    5 回复  |  直到 17 年前
        1
  •  6
  •   Matthew Bonig    17 年前

    第二个代码段更好。例外情况适用于例外情况,而不是您期望发生的情况。此外,目的要好得多。很明显,您希望DBNull是一个可能的值,并且希望相应地处理它。

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

        2
  •  2
  •   Ben Hoffstein    17 年前

    这是一个好主意 blog post 有关异常的更多详细信息(请参阅关于异常和性能的部分)。

        3
  •  2
  •   Siddharth Rout    13 年前

    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"))
    

    它将不返回任何内容或返回日期。

        4
  •  1
  •   OldBuildingAndLoan Caffé    17 年前

    在VB.net中,它必须是可空的(日期)

    这里有一个方法:

    dim theDate as nullable(of Date)
    
        If theDate.HasValue Then
          'you can proceed
        Else
          'you must assign with DBNull.value
        End If
    

    数据库也可能会考虑到您可以做什么。 不管发生什么事,微软Access都会为日期争吵不休。我最终实现了上述功能,但我通常更喜欢将日期保存为Access中的字符串。这只会减少路上的麻烦。

        5
  •  0
  •   bdukes Jon Skeet    17 年前

    我会用 TryCast

    _LastLogin = TryCast(DT.Rows(0)("LastLogin"), Date?)
    
    推荐文章