无法使用 Visual Basic 代码将对象从 DBNull 转换为其他类型

Posted

技术标签:

【中文标题】无法使用 Visual Basic 代码将对象从 DBNull 转换为其他类型【英文标题】:Object cannot be cast from DBNull to other types with visual basic code 【发布时间】:2021-08-19 09:01:41 【问题描述】:

我已将虚拟数据添加到我的 SQL 数据库中。 当我尝试运行 VB 时,它返回一个空错误。

我所做的是从数据库中删除虚拟数据,使其不再读取空值。 即使在删除它之后,VB 文件仍然会抛出错误,就像空值仍然存在一样。 我已经运行了一个 sql 脚本来检查,我可以确认它不再存在。

这是引发错误的代码行。

If Date.Now.AddDays(LoadsFilter * -1) > Convert.ToDateTime(myReader(2)) Then
    ShowLoad = 0 
End If

我对 vb 还是很陌生,所以我不确定在这里做什么。 我正在考虑传递一个方法来读取空值,但我已经删除了空值。我不知道该怎么做,有人可以帮忙吗?

【问题讨论】:

您需要在使用前检查 myReader(2) 是否返回 null。 是的,它是 'If IsDBNull(myReader(2)) Then myhtml = myHtml + "" '这就是为什么我很困惑 您是否正在检查阅读器是否也返回了行? 它返回值,我可以在表中看到它。所以我知道它有效。但是我已经删除了虚拟数据,还需要抛出这个错误吗? 您确定连接到正确的数据库吗? 【参考方案1】:

无需进行任何转换。数据读取器有自己的方法用于空测试和获取适当类型的数据,例如

If Not myDataReader.IsDBNull(2) Then
    Dim dt = myDataReader.GetDateTime(2)

    'Use dt here.
End If

您也可以使用单行获取Nullable(Of Date)

Dim dt = If(myDataReader.IsDBNull(2), New Date?, myDataReader.GetDateTime(2))

请注意,如果您更喜欢使用列名而不是索引,这会使您的代码更清晰,那么您可以使用GetOrdinal 方法,因为其他方法只支持索引:

Dim dt = If(myDataReader.IsDBNull(myDataReader.GetOrdinal("ColumnName")),
            New Date?,
            myDataReader.GetDateTime(myDataReader.GetOrdinal("ColumnName")))

【讨论】:

以上是关于无法使用 Visual Basic 代码将对象从 DBNull 转换为其他类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从Visual Basic 6程序传递给VBscript代码?

无法编译此Visual Basic程序

Visual Basic从入门到精通pdf

Visual Basic 出现多个奇怪错误 - 无法设置控件的 Win32 父窗口

如何在 Visual Basic 6 中对齐 RichEdit 粘贴对象位置?

使用 OLEDBConnection 将新记录插入到带有 Visual Basic 的表中