','附近的语法不正确(dbnull问题)

时间:2014-06-18 14:29:07

标签: asp.net sql-server vb.net gridview

假设有图表出现。但是,它没有因为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行。那么,我想如何修复此错误?

2 个答案:

答案 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')