【问题标题】:Conversion from type 'DBNull' to type 'Date' is not valid on tryparse从类型“DBNull”到类型“Date”的转换在 tryparse 上无效
【发布时间】:2015-04-01 13:46:44
【问题描述】:

我正在尝试将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 数据类型时,我应该做些什么不同的事情吗?

dr 被实例化为DataRow

Dim dr As DataRow = dv0.Table.Rows(i)

【问题讨论】:

  • TryParse 返回一个布尔值,指示解析是否成功。如果不是,则传递的 DateTime var 具有与以前相同的值。除非它是 Nullable(Of DateTime),否则它不会是 Nothing/null。和 DBNull 不是一回事

标签: vb.net


【解决方案1】:

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

【讨论】:

  • 我试过这个,但它仍然给出与原始问题相同的错误。 IX_ArticleStartDate 是字符串类型,但我已将 nStartDate 创建为 DateTime,并尝试将 IX_ArticleStartDate 转换为 DateTime 并将其放入 nStartDate。
  • @user3267755 - 我更改了最初的答案。这应该肯定有效。
  • 谢谢,成功了!您的解释很好,感谢您包含 TryParse 的签名,现在代码为什么会爆炸是有道理的。
  • @user3267755 - 仅供参考:在这种情况下,我通常使用dr("IX_ArticleStartDate").ToString(),因为 DBNull.ToString() 返回和空字符串,这在你的情况下很好。如果你不这样做,VB 也会尝试强制转换 dr("IX_ArticleStarteDate")。由于同样的原因,这将失败(不能将 DBNull 转换为字符串)
【解决方案2】:

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,这不是很有用,因为很难区分@987654337的有效使用@ 和 null。

该示例使用了ternary operator,它解析并返回日期值(如果它不为空),或者返回一个可为空的日期(New DateTime?)。

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

【讨论】:

  • 有趣..我添加了您的代码,但它突出显示了最后一个问号并说 - '“?”此处不能使用字符。”
  • 这不是问题。现在它说没有'TryParse'接受这个数量的参数..当我尝试像我的问题一样添加第二个参数时,它说'无法推断出一个常见的类型;假定对象'?
  • @roryap 不起作用,因为 DateTime.TryParse 返回一个布尔值并需要两个参数(第二个参数是一个引用,如果返回值为 true,它将保存结果)。
  • @SchlaWiener -- 你是对的。我已经更新了我的答案。
猜你喜欢
  • 2011-10-05
  • 2014-06-10
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多