我有一个空值问题。我需要一个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
请帮帮我,我绝望了。。
首先,我不确定错误的确切原因,但是,这里有一些通用提示可以帮助找到错误的原因并进行修复:
我建议使用DataRow
的Field
扩展方法,它是强类型的,也支持可为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参数!