数据库组合查询

            在使用数据库的过程中,数据的查询是使用最多的,所以,数据的精确查询是一个很重要的问题。以前的数据查询是最简单的数据查询,也从来没想过组合查询的问题,可是在做机房收费系统的时候,遇到了一个很大的问题,当三个条件随意组合的时候,会出现7中组合情况。具体问题,见下图:

 数据库组合查询_第1张图片

           首先,当连接数据库时,必须要用到查询条件,即where子句,可是数据库中的字段名和窗体中的字段名不相符,所以首先应该将窗体中的字段名设置为数据库可以识别的字段名,代码如下:

 

        

dim strName(2) as string
dim strRelation(2) as string
For Index = 0 To 2
        '数据库不能识别窗体中的名称,利用循环和选择变成数据库可以识别的名称。
        Select Case ComboName(Index).Text
            Case "卡号"
                strName(Index) = "cardno"
            Case "学号"
                strName(Index) = "studentNo"
            Case "姓名"
                strName(Index) = "studentName"
            Case "性别"
                strName(Index) = "sex"
            Case "系别"
                strName(Index) = "department"
            Case "年级"
                strName(Index) = "grade"
            Case "班号"
                strName(Index) = "class"
        End Select
        
        Select Case ComboRelation(Index).Text
            Case "与"
                strRelation(Index) = "And"
            Case "或"
                strRelation(Index) = "Or"
        End Select
        
    Next

              现在,数据库可以识别字段名了,接下来,其中查询组合应该怎样组合呢,借鉴学生信息管理系统的经验,首先设置一个标记,利用标记来设置组合方式,代码如下:

dim dd(2) as boolean
Private Sub cmdCheck_Click()
    MSFlexGrid.clear
    If testtxt(ComboName(0).Text) = True Then      '判断第一个条件是否被使用
        If testtxt(ComboSign(0).Text) = True Then
            If testtxt(txtContent1.Text) = True Then
                dd(0) = True   '标记第一个条件
            End If
        End If
    End If
    
    If testtxt(ComboName(1).Text) = True Then     '判断第二个条件是否被使用
        If testtxt(ComboSign(1).Text) = True Then
            If testtxt(txtcontent2.Text) = True Then
                dd(1) = True
            End If
        End If
    End If
    
    If testtxt(ComboName(2).Text) = True Then   '判断第三个条件是否被使用
        If testtxt(ComboSign(2).Text) = True Then
            If testtxt(txtContent3.Text) = True Then
                dd(2) = True
            End If
        End If
    End If
    If dd(0) = True Then   '首先判断第一个条件是否被选中,如果被选中,则补充完整查询限制条件
        txtSQL = txtSQL & " " & strName(0) & " " & ComboSign(0).Text & " " & txtContent1.Text & " "
    End If   '(条件1)
    
    If dd(1) = True Then   '判断第二个条件是否被选中
        If dd(0) = True Then   ' 再判断第一个条件是否被选中
            txtSQL = txtSQL & " " & strRelation(0) & " " & strName(1) & " " & ComboSign(1).Text & " " & txtContent2.Text & " "
        Else   '(条件2,1)
            txtSQL = txtSQL & " " & strName(1) & " " & ComboSign(1).Text & " " & txtContent1.Text & " "
        End If   '(条件2)
    
    If dd(2) = True Then   '判断第三个条件是否被选中
        If dd(0) = True Or dd(1) = True Then   '判断前两个条件是否被选中
            txtSQL = txtSQL & " " & strRelation(1) & " " & strName(2) & " " & ComboSign(2).Text & " " & txtContent3.Text & " "
        Else    '(条件3,1) 或 (条件3,2)  或 (条件3,2,1)
            txtSQL = txtSQL & " " & strName(2) & " " & ComboSign(2).Text & " " & txtContent3.Text & " "
        End If   '条件(3)
    End If
 
    If dd(0) = False And dd(1) = False And dd(2) = False Then     '判断是否选择查询条件
        MsgBox "您还没有完整的选择一个查询条件,请选择查询条件。", vbOKOnly + vbExclamation, "提示"
        Exit Sub
        ComboName(0).SetFocus
    End If
    
    Set mrc = Executesql(txtSQL, msgtext)
    
    If mrc.EOF = True Then
        MsgBox "没有找到相关记录,请重新输入查询条件。", vbOKOnly + vbExclamation, "提示"
        Exit Sub
    Else
        With MSFlexGrid    '将查询到的数据写到表中
            For i = 0 To mrc.RecordCount - 1
                .Rows = .Rows + 1
                .TextMatrix(.Rows - 1, 0) = mrc.Fields(0)
                .TextMatrix(.Rows - 1, 1) = mrc.Fields(1)
                .TextMatrix(.Rows - 1, 2) = mrc.Fields(2)
                .TextMatrix(.Rows - 1, 3) = mrc.Fields(3)
                .TextMatrix(.Rows - 1, 4) = mrc.Fields(4)
                .TextMatrix(.Rows - 1, 5) = mrc.Fields(5)
                .TextMatrix(.Rows - 1, 6) = mrc.Fields(6)
            Next
        End With
    End If
    mrc.Close
End Sub

           首先用dd(2)用来标记三个查询条件,中间的代码用来选择查询方式,三个查询条件组合可以组合成七种组合,也可以把所有的组合方式都写出来,但是,我们采用了一种更简便的方法,就是不管组合方式,我们只考虑单个的查询条件,如果选中第一个条件,则把第一个条件写入内存,如果第二个条件被选中,则把第二个条件写入内存中,依次类推。

           需要说明的是,每一个查询子句并不是完整的查询语句,都是跟上边查询语句的结合而形成的。这样可以减少代码的重复编写。
            最后利用循环语句,将查询到的结果写到表格中。

 

你可能感兴趣的:(数据库组合查询)