错误:在运行for循环VB.NET时,无法将对象从DBNull强制转换为其他类型



我有一个空值问题。我需要一个if来检查两个值是否为空。如果我第一次循环浏览,一切都很好。当我第二次循环For时,我在'oTableTemp.Rows(I)("ProspectielijstId").ToString()="'上得到一个错误。我什么都试过了。我尝试过DbNull.Value,Is Nothing,。。。这是完整的代码:

    For i As Integer = 0 To oTableTemp.Rows.Count - 1 Step 1
        If (Convert.ToInt32(oTableTemp.Rows(i)("OpleidingsId")) = 0 And oTableTemp.Rows(i)("ProspectielijstId").ToString() = "" And oTableTemp.Rows(i)("ActieId") = specialeactieId) Then
            cString &= "SELECT * FROM AITest..SpecialeActie WHERE SpecialeActie.ActieId = " + clGlobalsData.G_FieldN(specialeactieId)
            Exit For
        ElseIf (oTableTemp.Rows(i)("ProspectielijstId").ToString() IsNot "" And oTableTemp.Rows(i)("ActieId") = specialeactieId) Then
            cString &= "    SELECT KlantProspectAlgemeen.Nummer, SpecialeActie.Titel, SpecialeActie.Inhoud, SpecialeActie.Link " & _
            "FROM (AITest..SpecialeActie INNER JOIN AITest..t_ProspectieLijst ON t_ProspectieLijst.NaamLijst= " & _
            "SpecialeActie.ProspectielijstID) INNER JOIN AITest..KlantProspectAlgemeen ON t_ProspectieLijst.Nummer=KlantProspectAlgemeen.Nummer WHERE SpecialeActie.ActieId = " + clGlobalsData.G_FieldN(specialeactieId)
            Exit For
        ElseIf (Convert.ToInt32(oTableTemp.Rows(i)("OpleidingsId")) <> 0 And oTableTemp.Rows(i)("ActieId") = specialeactieId) Then
            cString &= "SELECT KlantProspectAlgemeen.Nummer, SpecialeActie.Titel, SpecialeActie.Inhoud, SpecialeActie.Link " & _
            "FROM (AITest..SpecialeActie INNER JOIN AITest..Cursus ON Cursus.NummerInternCursus=SpecialeActie.OpleidingsID " & _
            "INNER JOIN AITest..CursusEmailmarketing ON Cursus.NummerInternCursus = CursusEmailmarketing.NummerInternCursus " & _
            "INNER JOIN AITest..t_ProspectieLijst ON t_ProspectieLijst.NaamLijst=CursusEmailmarketing.ProspectielijstID) " & _
            "INNER JOIN AITest..KlantProspectAlgemeen ON t_ProspectieLijst.Nummer= KlantProspectAlgemeen.Nummer WHERE SpecialeActie.ActieId = " + clGlobalsData.G_FieldN(specialeactieId)
            Exit For
        End If
    Next

请帮帮我,我绝望了。。

首先,我不确定错误的确切原因,但是,这里有一些通用提示可以帮助找到错误的原因并进行修复:

我建议使用DataRowField扩展方法,它是强类型的,也支持可为null的类型。它会自动将DBNull.Value转换为适当的可为null的类型。

您还应该使用AndAlso而不是And。如果第一部分已经是False,前者将不会执行第二部分,而后者将始终执行这两个部分,这可能会导致类似的错误。

考虑一下:

Dim str As String = Nothing
If str IsNot Nothing And str.Length = 0 Then
   ' boooom
End If

这项工作:

If str IsNot Nothing AndAlso str.Length = 0 Then
    ' no booom 
End If

这里的sql部分向您展示了一个更可读的示例:

For Each row As DataRow In oTableTemp.Rows
    Dim OpleidingsId = row.Field(Of Int32)("OpleidingsId")
    Dim ProspectielijstId = row.Field(Of String)("ProspectielijstId")
    Dim ActieId = row.Field(Of Int32)("ActieId")
    If OpleidingsId = 0 AndAlso String.IsNullOrWhiteSpace(ProspectielijstId) AndAlso ActieId = specialeactieId Then
        cString = "SELECT * FROM AITest..SpecialeActie WHERE ..."
    End If

请注意,您还对SQL注入开放,请使用SQL参数!

相关内容

最新更新