在VB.net中处理DBNull异常

时间:2012-03-22 08:22:58

标签: asp.net .net vb.net error-handling

我正在尝试从数据库中读取数据时处理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.错误。怎么了?

4 个答案:

答案 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