错误:从类型' DBNull'转换输入' String'无效

时间:2016-06-07 20:56:26

标签: vb.net

我正在处理一个从数据库中获取数据的项目。

现在我收到此错误消息:

  

从类型' DBNull'转换输入' String'无效

我知道错误意味着什么,我只需要一种解决方法。

我有以下代码:

 Private Function ParseSeamansNames(ByVal seaman As ItemsDataSet.SeamenRow) As String
        If (seaman Is Nothing) Then Return String.Empty

        Dim name As String
        Dim firstNames() As String = Split(seaman.FirstName.Replace("-", " "))
        Dim index1 As Integer = CInt(seaman.GivenNameNumber.Substring(0, 1))
        Dim index2 As Integer = CInt(seaman.GivenNameNumber.Substring(1, 1))
        If (index1 > firstNames.Length - 1) Then
            index1 = 0
        End If
        If (index2 > firstNames.Length - 1) Then
            index2 = 0
        End If
        If (index1 = 0 And index2 = 0) Then
            name = seaman.FirstName
        ElseIf (index1 > 0 And index2 = 0) Then
            name = firstNames(index1 - 1)
        ElseIf (index1 = 0 And index2 > 0) Then
            name = firstNames(index2 - 1)
        Else
            name = firstNames(index1 - 1) & "-" & firstNames(index2 - 1)
        End If
        name = name & " " & seaman.LastName

        Return name
    End Function

我尝试将其更改为If (seaman Is Nothing) Then Return DBNull,但收到错误:

  

dbnull是一种类型,不能用作表达式

我真的不知道如何修复它。谁能帮我?

更新

我收到此错误:

  

[InvalidCastException:从类型' DBNull转换'输入' String'   无效。]
  Microsoft.VisualBasic.CompilerServices.Conversions.ToString(对象   价值)+715847
  C:\ BUMS中的BUMSSeamenWebb.ItemsService.SeamenRow.get_FirstName()   LOKAL \开发\项目\ BUMSSeamenWebb \ WEB   引用\ ItemsService \ Reference.vb:51036

该行是此代码:

 <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
             Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")>  _
            Public Property FirstName() As String
                Get
                    Try 
                        Return CType(Me(Me.tableSeamen.FirstNameColumn),String)
                    Catch e As Global.System.InvalidCastException
                        Throw New Global.System.Data.StrongTypingException("The value for column 'FirstName' in table 'Seamen' is DBNull.", e)
                    End Try
                End Get
                Set
                    Me(Me.tableSeamen.FirstNameColumn) = value
                End Set
            End Property

特别是:

 Return CType(Me(Me.tableSeamen.FirstNameColumn),String)

我无法在这里看到问题

更新2:

这是另一个检查其他列的函数

 Private Sub SetSeamanData(ByRef itemRow As ItemsDataSet.ItemsRow, ByVal seaman As ItemsDataSet.SeamenRow)
        itemRow.PersonalIdentityNumber = seaman.PersonalIdentityNumber
        itemRow.Name = ParseSeamansNames(seaman)
        itemRow.CitizenShipCode = seaman.CitizenshipCode
        If Not seaman.IsEmailNull() Then
            itemRow.EmailAddress = seaman.Email
        Else
            itemRow.EmailAddress = Nothing
        End If
        If Not seaman.IsTelephoneNull() Then
            itemRow.TelephoneNumber = seaman.Telephone
        Else
            itemRow.TelephoneNumber = Nothing
        End If
        If Not seaman.IsMobiletelephoneNull() Then
            itemRow.MobilephoneNumber = seaman.Mobiletelephone
        Else
            itemRow.MobilephoneNumber = Nothing
        End If
    End Sub

1 个答案:

答案 0 :(得分:1)

这些生成的DataRow类的编码方式如果您尝试读取具有数据库空值的属性(列值),则会抛出异常。

在尝试从中读取之前,您需要检查null

正如您从消息中可以看出的那样,在这种情况下,它抱怨您正在尝试读取FirstName的值,但它是空的(DbNull)。

通常,当列可以为null时,这些DataRow类还包括一个便捷函数,用于检查该特定列的null。因此,在这种情况下,ItemsDataSet.SeamenRow也应该具有IsFirstNameNull功能。如果是这样,请先调用它,然后处理该特定情况。如果IsFirstNameNull返回false,那么您可以安全地从FirstName属性中读取。

如果您的数据库中有其他可以为null的列,则需要遵循类似的模式。