存储过程返回有关用户记录的数据,包括上次登录日期的可空日期时间列。在尝试分配.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
类型时效果不佳。
答案 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?)