在使用SqlDataReader (即“reader”)时,我在试图检查某个值是否为DBNull时遇到了以下错误。
运算符'=‘不是为'DBNull’和'DBNull‘类型定义的。
使用以下代码时:
If reader("MyColumn") = DBNull.Value Then
'...
End If我通过调用IsDBNull()绕过了错误,我怀疑这是因为' is‘和'=’之间的区别。
然而,我的问题是:为什么不能使用'=‘操作符进行比较?
发布于 2019-03-01 17:07:37
并非所有类型都可以使用=运算符。当一个类型定义了各种操作符应该如何使用它的逻辑时,它被称为“操作符重载”(诚然,这有点令人困惑,因为它与方法重载无关,而且与方法重载完全不同)。基本Object类型不会重载=运算符,因此,当您创建自定义类时,它不会从Object继承=运算符重载。因此,只有特定重载运算符的类型才能实际使用它。例如,以下代码将不会编译:
Module Module1
Public Sub Main()
Dim dan As New Person() With {.Id = 1, .Name = "Daniel Thorne"}
Dim steve As New Person() With {.Id = 2, .Name = "Steven Doggart"}
If dan = steve Then
Console.WriteLine("They're the same")
End If
End Sub
Public Class Person
Public Property Id As Integer
Public Property Name As String
End Class
End Module编译器提供以下生成错误:
BC30452运算符'=‘未为'Module1.Person’和'Module1.Person‘定义。
然而,这将如预期的那样建立和发挥作用:
Public Sub Main()
Dim dan As New Person() With {.Id = 1, .Name = "Daniel Thorne"}
Dim steve As New Person() With {.Id = 2, .Name = "Steven Doggart"}
If dan = steve Then
Console.WriteLine("They're the same")
End If
End Sub
Public Class Person
Public Property Id As Integer
Public Property Name As String
Public Shared Operator =(x As Person, y As Person) As Boolean
Return AreEqual(x, y)
End Operator
Public Shared Operator <>(x As Person, y As Person) As Boolean
Return Not AreEqual(x, y)
End Operator
Private Shared Function AreEqual(x As Person, y As Person) As Boolean
If (x Is Nothing) And (y Is Nothing) Then
Return True
ElseIf (x IsNot Nothing) And (y IsNot Nothing) Then
Return x.Id = y.Id
Else
Return False
End If
End Function
End Class因此,在DBNull上出现错误的原因是,不管出于什么原因,编写该类的开发人员选择不为其重载=运算符。至于为什么,你猜和我的一样好。
另外请注意,您也可以重载许多其他操作符,这有时是有用的。不过,要小心。如果你在使用运算符过载时过于自由,你可能会后悔。
发布于 2019-03-01 16:51:04
在SQL中,null = null计算为false。这可能是为什么没有为这种类型定义相等运算符的原因。
您无法确定未知的东西是否等于其他未知的东西,从而使相等操作符变得无用。
使用DBNull.Value.Equals()确定它是否为空。
发布于 2021-10-14 14:43:51
SqlDataReader类有一个这样的方法:SqlDataReader.IsDBNull(Int32)方法。
Dim colNum = reader.GetOrdinal("MyColumn")
If sqlReader.IsDBNull(colNum) Then
' Do something
End Ifhttps://stackoverflow.com/questions/54948574
复制相似问题