我正在处理一个从数据库中获取数据的项目。
现在我收到此错误消息:
从类型' 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
答案 0 :(得分:1)
这些生成的DataRow
类的编码方式如果您尝试读取具有数据库空值的属性(列值),则会抛出异常。
在尝试从中读取之前,您需要检查null 。
正如您从消息中可以看出的那样,在这种情况下,它抱怨您正在尝试读取FirstName
的值,但它是空的(DbNull
)。
通常,当列可以为null时,这些DataRow
类还包括一个便捷函数,用于检查该特定列的null。因此,在这种情况下,ItemsDataSet.SeamenRow
也应该具有IsFirstNameNull
功能。如果是这样,请先调用它,然后处理该特定情况。如果IsFirstNameNull
返回false
,那么您可以安全地从FirstName
属性中读取。
如果您的数据库中有其他可以为null的列,则需要遵循类似的模式。