我通过向用户显示数据库中的值来制作程序。当我查询字段是否为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.
答案 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