【问题标题】:Conversion from type 'DBNull' to type 'Boolean' is not valid从“DBNull”类型到“Boolean”类型的转换无效
【发布时间】:2017-03-02 23:05:03
【问题描述】:

谁能告诉我为什么我在使用下面的代码时收到以下错误.. 从“DBNull”类型到“Boolean”类型的转换无效。

    Dim newOrderID As Guid = Guid.Parse(orderID)
    Dim DBConnect2 As New DBConn
    Using db As DbConnection = DBConnect2.Conn("DBConnectionString")
        Dim cmd As SqlCommand = DBConnect2.Command(db, "SelectWebLinkVisible")

        cmd.Parameters.Add(New SqlParameter("orderID", SqlDbType.UniqueIdentifier, ParameterDirection.Input)).Value = newOrderID

        db.Open()
        Dim DR As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
        Dim webLinkVisible As Boolean

        While DR.Read
            webLinkVisible = DR("webLinkVisible")
        End While

        DR.Close()
        DR = Nothing
        cmd.Dispose()
        cmd = Nothing
        db.Dispose()
        db.Close()
    End Using

我什至尝试用以下内容替换 WHILE 位,并认为页面会重定向,因为它尝试读取的数据肯定是 NULL,但它什么也没做..

        While DR.Read
            If DR("webLinkVisible") is nothing Then
                Response.Redirect("www.bbc.co.uk")
            End If
        End While

【问题讨论】:

  • 旁注:你不需要在db 上调用CloseDispose,这就是using 块的结尾隐含地为你做的事情。如果您要保留它们,则应撤消呼叫(在您使用 Disposed 后不要拨打 Close)。您的阅读器和命令也应该包含在usings 中。也无需将 Nothing 分配给这些值,因为它们无论如何都超出了范围。

标签: sql vb.net


【解决方案1】:

当字段包含 NULL 值时,OleDbDataReader 返回值 DBNull.Value。这与 Nothing 不同。
要处理这种情况,您可以使用IsDBNull 方法

While DR.Read
    If Not DR.IsDBNull(DR.GetOrdinal("webLinkVisible")) Then
        webLinkVisible = DR("webLinkVisible")
    End If
End While

需要对 DR.GetOrdinal 进行额外调用,因为 IsDBNull 无法使用字段名称,但它需要查询返回的字段的序号位置。

【讨论】:

  • 刚刚试过这个。非常感谢您的回复。仍然遇到同样的错误:-(任何其他建议表示赞赏。@Steve
  • 我的错。忘记在检查 DBNull 之前添加 Not
猜你喜欢
  • 1970-01-01
  • 2014-06-10
  • 2012-11-19
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多