我正在尝试从数据库中读取数据时处理DBNull
异常。
这是我的代码:
...
Dim SQLRDAs SqlDataReader
...
val1= GetStringFromDB(Trim(SQLRD("Name")))
val2= GetStringFromDB(Trim(SQLRD("Level")))
val2= GetStringFromDB(Trim(SQLRD("blahblah")))
...
Public Function GetStringFromDB(ByVal inputValue) As String
Dim outputValue As String
If IsDBNull(inputValue) Then
outputValue = "null"
Else
outputValue = inputValue
End If
Return outputValue
End Function
但我仍然遇到Conversion from type 'DBNull' to type 'String' is not valid.
错误。怎么了?
答案 0 :(得分:2)
这看起来比一个简单的换位错误。您检查Not IsDbNull(..)
,但行为类似于dbnull!
Public Function GetStringFromDB(ByVal inputValue) As String
Dim outputValue As String
If Not IsDBNull(inputValue) Then
outputValue = inputValue
Else
outputValue = "null"
End If
Return outputValue
End Function
这应该可以解决问题!
答案 1 :(得分:2)
你混淆了这个条件。
更改
If Not IsDBNull(inputValue) Then
outputValue = "null"
' ....
要
If IsDBNull(inputValue) Then
outputValue = "null"
' ....
在您的DBNull检查之前执行 编辑:Trim
。所以我认为这会导致你的例外。将您的代码更改为:
GetStringFromDB(SQLRD("Name")).Trim
答案 2 :(得分:2)
向我看来,好像您尝试Trim
DBNull
值。
执行GetStringFromDB(SQLRD("Name")).Trim()
或GetStringFromDB
编辑:我将这些内容包装到扩展中,使其更易于使用,并且不会使代码混乱。
<Runtime.CompilerServices.Extension()>
Public Function ReadString(ByVal this As SqlDataReader, ByVal index As Integer) As String
Return If(Convert.IsDBNull(this.Item(index)), String.Empty, DirectCast(this.Item(index), String))
End Function
<Runtime.CompilerServices.Extension()>
Public Function ReadString(ByVal this As SqlDataReader, ByVal columnName As String) As String
Return If(Convert.IsDBNull(this.Item(columnName)), String.Empty, DirectCast(this.Item(columnName), String))
End Function
答案 3 :(得分:1)
IsDBNull检查是否缺少值。它不等于Nothing或String.Empty。 你确定你的inputValue包含DBNull.Value吗?
我将以这种方式更改您的代码:
If String.IsNullOrEmpty(inputValue) OrElse IsDBNull(inputValue) Then
outputValue = "null"
另请注意,您没有指定inputValue的类型,在我的回答中我假设 As String