如果我有DBNull异常,为什么?

时间:2019-10-08 13:10:41

标签: vb.net ado.net

我通过向用户显示数据库中的值来制作程序。当我查询字段是否为NULL时,出现错误。

我的尝试:

Dim dtContacts As New DCFLEXNorthwind.ContactsDataTable
taContacts.SelectAllByID(dtContacts, ID)
Dim r As DCFLEXNorthwind.ContactsRow = dtContacts.Rows(0)

If r.Extension Is DBNull.Value Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If r.Extension Is DBNull Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If r.Extension = DBNull.Value Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If r.Extension = DBNull Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If IsDBNull(r.Extension) Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

然后,有效查询会发生以下错误:

The value for column extension in table Contacts is DBNull.

Invalid conversion from type DBNull to type String.

2 个答案:

答案 0 :(得分:2)

r.Extension的定义是什么?

r.Extension = DBNull.Value可能是正确的,但前提是它直接从ADO.Net数据传输对象字段(如DataReader,DataTable或DataSet)中读取。这些类型的字段使用基本的Object类型,该类型可以包含字符串,日期时间,数字等值……您可能会从数据库中获取的任何内容,包括DBNull

您的r变量及其Extension属性看起来更像是数据传输对象已用于用真实属性填充真实类型,其中Extension属性被显式声明为string。此时,检查数据库null已经为时已晚,因为首先无法将DBNull分配给该属性。

答案 1 :(得分:1)

您应该始终通过与nothing比较来检查值字段是否存在

使用IsNothing(r.Extension)r.Extension Is Nothing

先不检查任何内容,否则如果值不存在,则会出错。

这是要尝试的代码

Dim dtContacts As New DCFLEXNorthwind.ContactsDataTable
taContacts.SelectAllByID(dtContacts, ID)
Dim r As DCFLEXNorthwind.ContactsRow = dtContacts.Rows(0)

If IsNothing(r.Extension) OR r.Extension Is DBNull.Value Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If IsNothing(r.Extension) OR r.Extension Is DBNull Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If IsNothing(r.Extension) OR r.Extension = DBNull.Value Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If IsNothing(r.Extension) OR r.Extension = DBNull Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If

If IsNothing(r.Extension) OR IsDBNull(r.Extension) Then
    txtExtension.Text = ""
Else
    txtExtension.Text = r.Extension
End If