我正在尝试从日期格式化的字符串中执行DateTime.TryParse
到我作为DataView
表的一部分创建的新列。代码运行Conversion from type 'DBNull' to type 'Date' is not valid.
这是代码行:
DateTime.TryParse(dr("IX_ArticleStartDate"), dr("nStartDate"))
当出现错误时,这些是我手表中的值。
+ dr("IX_ArticleStartDate") "2015/3/11" {String} Object
+ dr("nStartDate") {} Object
我认为如果TryParse
无法转换数据类型,NULL
会返回DateTime
值。有没有什么我应该做的不同将此字符串转换为DataRow
数据类型?
dr被实例化为Dim dr As DataRow = dv0.Table.Rows(i)
{{1}}
答案 0 :(得分:2)
VB隐式尝试将DBNull值强制转换为DateTime,因为DateTime.TryParse的方法签名是
Public Shared Function TryParse(s As String, ByRef result As Date) As Boolean
失败了。您可以改为使用变量:
dim startDate as DateTime
If DateTime.TryParse(dr("IX_ArticleStartDate").ToString(), startDate) Then
dr("startDate") = startDate
End If
答案 1 :(得分:0)
DateTime
是值类型,不能为空值。你可以这样做:
Dim result As DateTime
Dim myDate As DateTime? = If(Not dr.IsNull("IX_ArticleStartDate") AndAlso _
DateTime.TryParse(dr.IsNull("IX_ArticleStartDate").ToString(), result), _
result, New DateTime?)
在此示例中,变量myDate
实际上不是DateTime
,而是Nullable(Of DateTime)
,如?
之后的问号DateTime
所示声明(见MSDN)。 TryParse
方法实际上将string
值作为第一个参数,输出参数作为DateTime
值作为第二个参数。如果解析成功,则返回True
并将输出参数设置为已解析的DateTime
值;另一方面,如果解析不成功,则返回False
并将输出参数设置为DateTime.MinDate
,这不是很有用,因为很难区分有效使用DateTime.MinDate
和null。
该示例使用ternary operator解析并返回日期值(如果它不为null),或者返回可为空的日期(New DateTime?
)。
然后,您将相应地使用myDate.HasValue()
来确定该值是否为空,如果不是 null,则可以使用其值:myDate.Value
。