为什么我的SQL语句在使用AND或-Visual Basic时会以这种方式运行

为什么我的SQL语句在使用AND或-Visual Basic时会以这种方式运行,sql,vb.net,Sql,Vb.net,我有一个表格,有两个单选按钮SSOP或SCOP,六个复选框和一个组合框。根据单选按钮的选择,组合框将填充,然后使用复选框进行过滤。可以选择多个复选框 我已经编写了下面的代码,当我选择only复选框时,它工作得非常好,只显示该复选框的SSOP。但当我选中多个复选框时,它会同时显示SSOP和SCOP。好像LIKE语句被忽略了一样。为什么呢 谢谢 Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles

我有一个表格,有两个单选按钮SSOP或SCOP,六个复选框和一个组合框。根据单选按钮的选择,组合框将填充,然后使用复选框进行过滤。可以选择多个复选框

我已经编写了下面的代码,当我选择only复选框时,它工作得非常好,只显示该复选框的SSOP。但当我选中多个复选框时,它会同时显示SSOP和SCOP。好像LIKE语句被忽略了一样。为什么呢

谢谢

    Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles 
    btnSearch.Click

 SQLa = "SELECT * FROM ARES_Procedure_List WHERE ARES_ID LIKE '%SSOP%' "
        Dim strChk As String = ""
        Dim chk As CheckBox
        Dim strSubsystem As String = ""
        Dim listSubsystem As List(Of [String]) = New List(Of String)
        For Each ctl As Control In Me.Controls
            If TypeOf ctl Is CheckBox Then
                chk = DirectCast(ctl, CheckBox)
                If chk.Checked = True Then
                    listSubsystem.Add("Subsystem = '" & 
         Microsoft.VisualBasic.Mid(chk.Text, 1) & "'")

                End If
            End If

        Next
        strSubsystem = [String].Join(" OR ", listSubsystem.ToArray())
        Label1.Text = strSubsystem
        SQLa = SQLa & "AND " & strSubsystem & ""
        MsgBox(SQLa)
        CallAccess()
        cboSelect.Items.Clear()
        Do Until RSa.EOF()
        cboSelect.Items.Add(RSa.Fields("ARES_ID").Value)
        RSa.MoveNext()
        Loop
        CloseAccess()
    End Sub

强制逻辑运算符的正确求值顺序在或条件的序列周围添加括号

SQLa = SQLa & "AND (" & strSubsystem & ")"
但是,您应该对复选框的状态添加一些控制。如果没有选中任何一个,那么代码将生成一个无效的SQL

if listSubsystem.Count > 0 Then
    strSubsystem = [String].Join(" OR ", listSubsystem.ToArray())
    Label1.Text = strSubsystem
    SQLa = SQLa & "AND (" & strSubsystem & ")"
End If
旁注。检查循环可以用

    For Each chk In Me.Controls.OfType(Of CheckBox)
        If chk.Checked Then
            listSubsystem.Add("Subsystem = '" & Microsoft.VisualBasic.Mid(chk.Text, 1) & "'")

       End If
    Next

过滤和强制转换直接在OfTypeOf复选框IEnumerable extension中完成。这太完美了!非常感谢你!