【问题标题】:vb.net DBNull to string errorvb.net DBNull 到字符串错误
【发布时间】:2013-11-16 22:02:54
【问题描述】:

我有一个子程序,它只是将访问数据库中的值添加到文本框。但是,数据库中的某些字段包含空值或为空,这导致 vb 抛出错误,“无法从 DBNull 转换为字符串”。

如何根据我发布的代码解决此问题,或者是否有人可以发布此类事件的教程,因为我是一个新用户,正在努力理解这一点。非常感谢

Sub add()
        While dr.Read()
            txtname.Text = dr(0).ToString()
            txtfathername.Text = dr(1).ToString()
            txtaddress.Text = dr(2).ToString()
            txtemail.Text = dr(3).ToString()
        End While

    End Sub

更新:

Sub filllistview()
        Try
            'creatconn()
            cn.Open()
            Dim cmd As OleDbCommand = New OleDbCommand("Select * from Postings", cn)
            dr = cmd.ExecuteReader()
            While dr.Read()
                ListView1.Items.Add(dr(0).ToString())
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(dr(1))
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(dr(2))
                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(dr(3))

            End While

        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message)
        Finally
            dr.Close()
            cn.Close()
        End Try
    End Sub

Sub showcontectsinlistview()
        Try
            'creatconn()
            cn.Open()
            Dim cmd As OleDbCommand = New OleDbCommand("select * from Postings where [Code]='" & ListView1.Text & "'", cn)
            dr = cmd.ExecuteReader()
            add()

        Catch ex As Exception
            System.Windows.Forms.MessageBox.Show(ex.Message)
        Finally
            dr.Close()
            cn.Close()
        End Try
    End Sub

【问题讨论】:

    标签: vb.net visual-studio-2010


    【解决方案1】:

    先检测来自该行的数据是否为空,然后将其替换为其他值,将其变为字符串,然后您可以将其传递到您的文本框

    使用无功能:

    dim x as string
    if dr(0).value = nothing then
        x = "Null data"
    else
        x = dr(0).value
    end if
    

    当您从数据库中读取数据时,问题似乎源于部分。您可以尝试将查询更改为不输出空值吗?

    类似

       SELECT Field
       FROM Table
       WHERE Not(Field) is null;
    

    【讨论】:

    • x 是否涵盖 dr(0) 到 dr(4)?还是我需要为每一行声明 var 。谢谢
    • 将 x 处理 dr(0)、dr(1) 等。请参阅我之前的评论。谢谢
    • 你可以为 dr,friend 的每个实例使用 x
    • Malky 在设置您的代码并将我的代码替换为我认为正确但会导致错误的代码后,我已经尝试过了。 ListView1.Items.Add(dr(0).x)
    • 我将开始一个新帖子,因为我认为我们已经从原来的问题转移了,因为我在那里有 50%。谢谢,请接受答案。
    【解决方案2】:

    我认为你应该只检查值是否不为 NULL

    Sub add()
        While dr.Read()
            If dr(0) Then txtname.Text = dr(0).ToString()
            If dr(1) Then txtfathername.Text = dr(1).ToString()
            If dr(2) Then txtaddress.Text = dr(2).ToString()
            If dr(3) Then txtemail.Text = dr(3).ToString()
        End While
    End Sub
    

    不过可能有更好的方法...

    【讨论】:

    • 您可以添加一个函数来检查该值是否为 NULL
    • 或者您可以检查长度是否高于 0 If dr(0).length > 0 Then txtname.Text = dr(0).ToString
    • 我认为这样的事情会做到这一点:If(IsDBNull(Dr(2), string.Empty, Dr(2)) 但不确定如何包含在我上面的 Sub filllistview() 示例中。谢谢
    【解决方案3】:

    您需要先检查IsDBNull 的值是否像这样

    Dim value As String = If(dr.IsDBNull(dr(0)), "", dr(0).ToString())
    

    然后使用value

    你可以把这个逻辑放到一个方法中,然后从那里返回。

    或在您的方法中:

    Sub add()
        While dr.Read()
            If dr(0) Then txtname.Text = If(dr.IsDBNull(dr(0)), "", dr(0).ToString())
            If dr(1) Then txtfathername.Text = If(dr.IsDBNull(dr(1)), "", dr(1).ToString())
            If dr(2) Then txtaddress.Text = If(dr.IsDBNull(dr(2)), "", dr(2).ToString())
            If dr(3) Then txtemail.Text = If(dr.IsDBNull(dr(3)), "", dr(3).ToString())
        End While
    End Sub
    

    SqlDataReader.IsDBNull

    还检查其他 SO 答案:SQL Data Reader - handling Null column values

    .Add(dr(0).ToString())
    

    变成:

    .Add(If(dr.IsDBNull(dr(0)), "", dr(0).ToString()))
    

    【讨论】:

    • Ric 现在这会导致我的列表视图中出现错误,这是我在原始问题中放置的代码。我已经发布了错误的截图。谢谢
    • 您是否在进行 IsDBNull 检查并返回空字符串而不是 null?
    • Ric 我正在使用您发布的代码。但是,我发布了另一段调用 add() 的代码。我怎么知道我要返回什么?谢谢
    • 每当您尝试访问读取器的列值时,例如 dr(0),您应该首先执行 dr.IsDBNull(dr(0)) 以检查 null
    • Ric 上面的 Sub filllistview() 示例中的代码如何。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多