.net 正确处理dbnull值
我编写了一段代码,当用户名与登录我的程序的用户相同时,可以从access db检索电子邮件地址。我希望在名为.net 正确处理dbnull值,.net,vb.net,ms-access,error-handling,dbnull,.net,Vb.net,Ms Access,Error Handling,Dbnull,我编写了一段代码,当用户名与登录我的程序的用户相同时,可以从access db检索电子邮件地址。我希望在名为email Dim x If ConnectionDb.State = ConnectionState.Closed Then ConnectionDb.Open() Dim cmd As OleDbCommand = ConnectionDb.CreateCommand cmd.CommandText = " SELECT ID, EmailAddress, TelephoneNo F
email
Dim x
If ConnectionDb.State = ConnectionState.Closed Then ConnectionDb.Open()
Dim cmd As OleDbCommand = ConnectionDb.CreateCommand
cmd.CommandText = " SELECT ID, EmailAddress, TelephoneNo FROM tblContacts WHERE ID='" & NameVariable & "'"
x = cmd.ExecuteReader()
While x.Read()
If x("EmailAddress").IsDBNull(0) Then
Return
Else
Email.Text = x.GetString(0)
End If
. . . .
但是,当程序运行时,我收到以下错误,因为某些用户没有EmailAddress的值:
System.MissingMemberException:'未找到类型'DBNull'上的公共成员'IsDBNull'。-第7行
我还希望为TelephoneNo
值添加功能,该值也将显示在表单的文本框中。
我如何才能成功地检查空值而不让程序出错?取决于您的选项,
Dim x
可能是另一回事。如果选项<代码>推断处于<代码>打开状态,则此处为<代码>读取器
Dim x = cmd.ExecuteReader()
但在您的例子中,这是对象
,因为使用选项推断
,您需要在同一行上声明和赋值。您需要以OleDbDataReader的身份执行尺寸x
。这样,您将在IsDBNull
上看到intellisence错误。您在这里确实遇到了后期绑定错误
你应该这样做
If DbNull.Value.Equals(x("EmailAddress")) Then
这会解决你的问题。但是你有更多的问题。好的,如果选择单行/单值,只需使用ExecuteScalar
或者,至少是这样
If x.Read() AndAlso Not DbNull.Value.Equals(x("EmailAddress")) Then
Email.Text = x("EmailAddress").ToString()
End If
取决于您的选项,
Dim x
可能是另一回事。如果选项<代码>推断处于<代码>打开状态,则此处为<代码>读取器
Dim x = cmd.ExecuteReader()
但在您的例子中,这是对象
,因为使用选项推断
,您需要在同一行上声明和赋值。您需要以OleDbDataReader的身份执行尺寸x
。这样,您将在IsDBNull
上看到intellisence错误。您在这里确实遇到了后期绑定错误
你应该这样做
If DbNull.Value.Equals(x("EmailAddress")) Then
这会解决你的问题。但是你有更多的问题。好的,如果选择单行/单值,只需使用ExecuteScalar
或者,至少是这样
If x.Read() AndAlso Not DbNull.Value.Equals(x("EmailAddress")) Then
Email.Text = x("EmailAddress").ToString()
End If
欢迎来到SO。你不应该删除有答案的问题。他们将得到恢复。你应该做什么,如果答案对你有帮助,就接受它。欢迎参加。你不应该删除有答案的问题。他们将得到恢复。您应该做的是,如果答案对您有帮助,请接受它。如果在软件要求中,空字符串“等效”为DB null,则使用
AndAlso Not string.IsNullOrEmpty(x(“EmailAddress”)
甚至AndAlso x.(“EmailAddress”).ToString.Length>0
可能更具可读性。这些也将解释来自数据库的空字符串。@HardCode我希望您的意思是在DBnull
签入IF
之后使用IsNullOrEmpty
。因为您不能使用IsNullOrEmpty
而不是DBNull
。但它也依赖于数据库。例如,Oracle没有空字符串的概念—只有null或value。在这种情况下,实际上,您可以在分配期间添加Trim()
。文本框从不为空。但是,如果有人将空白存储到DB中,这就是问题的开始。应修剪保存的所有数据。您是否可以看到这样一个场景:在txt中有value1
,如果没有找到记录,则按下按钮并保留value1
?首先清空itugh,它应该是String.IsNullOrEmpty(x(“EmailAddress”).ToString)
如果x.Read()并且也不是String.IsNullOrEmpty(x(“EmailAddress”).ToString),那么你知道,在重新粘贴原始行之后,我开始怀疑我对这一行“可能更可读”的想法,我有一个DATAROW的代码,从DATAATION,通过DATAdAdvad加载,它将在代码> DR(“MyField”)中考虑DB空值。ToString < /代码>作为空字符串。它将null转换为空字符串。如果在软件要求中空字符串“等效”为DB null,则使用和也可以不使用字符串.IsNullOrEmpty(x(“EmailAddress”)
甚至和也可以使用x.(“EmailAddress”).ToString.Length>0
。这些也将解释来自数据库的空字符串。@HardCode我希望您的意思是在DBnull
签入IF
之后使用IsNullOrEmpty
。因为您不能使用IsNullOrEmpty
而不是DBNull
。但它也依赖于数据库。例如,Oracle没有空字符串的概念—只有null或value。在这种情况下,实际上,您可以在分配期间添加Trim()
。文本框从不为空。但是,如果有人将空白存储到DB中,这就是问题的开始。应修剪保存的所有数据。您是否可以看到这样一个场景:在txt中有value1
,如果没有找到记录,则按下按钮并保留value1
?首先清空itugh,它应该是String.IsNullOrEmpty(x(“EmailAddress”).ToString)
如果x.Read()并且也不是String.IsNullOrEmpty(x(“EmailAddress”).ToString),那么你知道,在重新粘贴原始行之后,我开始怀疑我对这一行“可能更可读”的想法,我有一个DATAROW的代码,从DATAATION,通过DATAdAdvad加载,它将在代码> DR(“MyField”)中考虑DB空值。ToString < /代码>作为空字符串。它将null转换为空字符串。