从类型'DBNull'到类型'Date'的转换在tryparse上无效

时间:2015-04-01 13:46:44

标签: vb.net

我正在尝试从日期格式化的字符串中执行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}}

2 个答案:

答案 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