Vb.net 从类型转换为';DBNull';输入';日期';在tryparse上无效

Vb.net 从类型转换为';DBNull';输入';日期';在tryparse上无效,vb.net,Vb.net,我正在尝试从一个日期格式的字符串执行一个DateTime.TryParse到一个作为DataView表的一部分创建的新列。当代码运行时,我收到此错误。从类型“DBNull”到类型“Date”的转换无效。 这是代码行: DateTime.TryParse(dr("IX_ArticleStartDate"), dr("nStartDate")) 这些是我手表出错时的数值 + dr("IX_ArticleStartDate") "2015/3/11" {String} Obje

我正在尝试从一个日期格式的字符串执行一个
DateTime.TryParse
到一个作为
DataView
表的一部分创建的新列。当代码运行时,我收到此错误。
从类型“DBNull”到类型“Date”的转换无效。

这是代码行:

DateTime.TryParse(dr("IX_ArticleStartDate"), dr("nStartDate"))
这些是我手表出错时的数值

+       dr("IX_ArticleStartDate")   "2015/3/11" {String}    Object
+       dr("nStartDate")    {}  Object
我的印象是,如果
TryParse
无法转换数据类型,它将返回
NULL
值。要将此字符串转换为
DateTime
数据类型,我是否应该做些不同的事情

dr被实例化为一个
DataRow


Dim dr As DataRow=dv0.Table.Rows(i)
A
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
,而是一个
可为空的(日期时间)
,如声明中
DateTime
之后的问号
所示(请参阅)。
TryParse
方法实际上将
string
值作为第一个参数,将输出参数
DateTime
值作为第二个参数。如果解析成功,则返回
True
,并将输出参数设置为解析的
DateTime
值;另一方面,如果解析不成功,它将返回
False
,并将输出参数设置为
DateTime.MinDate
,这不是很有用,因为很难区分
DateTime.MinDate
和null的有效使用

该示例使用了一个函数,该函数要么解析并返回日期值(如果该值不为null),要么返回可为null的日期(
New DateTime?


然后,您将相应地使用
myDate.HasValue()
来确定该值是否为null,如果它不是null,您可以使用它的值:
myDate.value

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

有趣..我添加了你的代码,但它突出显示了最后一个问号,并说-“the”?“字符不能在这里使用。“这不是问题。它现在说没有一个“TryParse”接受这个数量的参数..当我尝试添加第二个参数时,就像在我的问题中一样,它说“不能推断一个普通类型;对象假定“?@roryap”不起作用,因为DateTime.TryParse返回一个布尔值,需要两个参数(第二个参数是一个引用,如果返回值为true,它将保存结果)。@schlaviener——你说得对。我已经更新了我的答案。我尝试了这个,但它仍然给出了与原始问题相同的错误。IX_ArticleStartDate是字符串类型,但我已将nStartDate创建为日期时间,并尝试将IX_ArticleStartDate转换为日期时间,然后将其放入nStartDate中。@user3267755-我更改了初始答案。这肯定行得通。谢谢,行得通!您的解释很好,感谢您为TryParse添加了签名,这解释了为什么代码现在会爆炸。@user3267755-仅供参考:在这种情况下,我通常使用
dr(“IX_ArticleStartDate”).ToString()
,因为DBNull.ToString()返回空字符串,在您的情况下,这很好。如果您不同意,VB也会尝试使用dr(“IX_ArticleStarteDate”)。由于同样的原因(不能将DBNull强制转换为字符串),TryParse返回一个布尔值,指示解析是否成功。如果不是,则传递的DateTime变量具有与以前相同的值。除非它是可空的(日期时间),否则它不会是空的。DBNull不是一回事