假设有图表出现。但是,它没有因为dbnull问题存在问题。当三个select语句中的任何一个没有数据时,就会发生这种情况
Dim user As String = Session("NoMatrik")
Dim resultId As Object = Session("max")
Dim idQuery = "select max(resultid) as id from tblResult where result_nomatric = @matric and result_quiz_id = 1 UNION All " +
"select max(resultid) as id from tblResult where result_nomatric = @matric and result_quiz_id = 2 UNION All " +
"select max(resultid) as id from tblResult where result_nomatric = @matric and result_quiz_id = 3"
conn.Open()
Dim cmdGetId As New SqlCommand(idQuery, conn)
cmdGetId.Parameters.AddWithValue("@matric", user)
Dim maxIDs As SqlDataReader = cmdGetId.ExecuteReader
Dim IDs As String = ""
While maxIDs.Read
IDs += maxIDs("id").ToString() + ", "
End While
maxIDs.Close()
IDs = IDs.Substring(0, IDs.Length - 2)
Dim cmdString = "Select tblResult.result_quiz_id as Quiz,count(TblAnswer.AnswerType) as answerCount , TblAnswer.AnswerType " +
"from TblResultDetail inner join TblAnswer on TblResultDetail.ResultDetail_Answer_Id = TblAnswer.AnswerId " +
"inner join tblResult on tblResult.resultid = TblResultDetail.ResultDetail_Result_Id " +
"where TblResultDetail.ResultDetail_Result_Id in (" + IDs + ") " +
"group by TblAnswer.AnswerType, tblResult.result_quiz_id order by TblAnswer.AnswerType"
Dim cmd As New SqlCommand(cmdString, conn)
If IsDBNull(resultId) Then
Label1.Visible = True
chrtResult.Visible = False
Else
Dim dr1 As SqlDataReader
dr1 = cmd.ExecuteReader
While dr1.Read()
Dim tempArr(0) As Double
Dim count As Double = dr1("answerCount")
tempArr(0) = count
Dim Type As String = dr1("AnswerType").ToString()
Dim level As Integer = dr1("Quiz")
chrtResult.Series(Type).Points(level - 1).YValues = tempArr
End While
End If
conn.Close()
End If
End Sub
错误,'附近的语法不正确('出现在第dr1 = cmd.ExecuteReader
行。那么,我想如何修复此错误?
答案 0 :(得分:2)
更新您的第一个查询以使用Null
子句排除任何HAVING
值,如下所示:
Dim idQuery = "select max(resultid) as id from tblResult " +
"where result_nomatric = @matric and result_quiz_id = 1 " +
"having max(resultid) is not null " +
"UNION All " +
"select max(resultid) as id from tblResult " +
"where result_nomatric = @matric and result_quiz_id = 2 " +
"having max(resultid) is not null " +
"UNION All " +
"select max(resultid) as id from tblResult " +
"where result_nomatric = @matric and result_quiz_id = 3 " +
"having max(resultid) is not null"
having max(resultid) is not null
将排除UNION ALL
中的所有空值。
如果没有返回IDs
,则只需在执行下一个代码块之前对此进行检查,并按照@DmitriE建议添加引号进行检查。重新组织它看起来像:
While maxIDs.Read
IDs += "'" + maxIDs("id").ToString() + "', "
End While
If IDs = "" Then
Label1.Visible = True
chrtResult.Visible = False
Else
IDs = IDs.Substring(0, IDs.Length - 2)
Dim cmdString = "Select ....."
Dim dr1 As SqlDataReader
dr1 = cmd.ExecuteReader
While dr1.Read()
' YOUR WHILE LOOP CODE HERE'
End While
End If
答案 1 :(得分:0)
这应该是
While maxIDs.Read
IDs += "'" + maxIDs("id").ToString() + "', "
End While
然后你需要删除最后一个单引号。
in子句应遵循以下格式:其中x.id in(' id1',' id2',' idN')