0

null 値に問題があります。2 つの値が null かどうかを確認するには、if が必要です。初めてループすると、すべて問題ありません。For を 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

まず、エラーの原因が正確にはわかりませんが、エラーの理由を見つけて修正するのに役立つ一般的なヒントを次に示します。

厳密に型指定され、null 許容型もサポートするField拡張メソッドを使用することをお勧めします。適切な null 許容型DataRowに自動的に変換されます。DBNull.Value

AndAlsoの代わりにも使用する必要がありますAnd。前者は最初の部分がすでに実行されている場合、2 番目の部分を実行しませんが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 に答える