0

我对空值有疑问。我需要一个 if 来检查 2 个值是否为空。如果我第一次循环,一切都很好。当我第二次循环时,'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

请帮助我,我很绝望..

4

1 回答 1

0

首先,我不确定究竟是什么导致了错误,但是,这里有一些一般提示可以帮助找到错误的原因并修复它:

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

您还应该使用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-Injection开放,使用 SQL-Parameters!

于 2013-07-19T12:33:12.770 回答