我的 If 中有一个 DBNull 异常,为什么?

I have an DBNull Exception in my If, why?

我通过向用户显示数据库中的值来编写程序。查询某个字段是否为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.

r.Extension是怎么定义的?

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

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

您应该始终通过与 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