在机房里,有三个窗体涉及到了组合查询,几乎可以用完全相同的代码。在这里,我以”操作员工作记录“为例介绍模糊查询和组合查询。
模糊查询,顾名思义,就是模糊查询数据库中数据,何为模糊呢?就是不给出准确的查询条件。例如:
txtSQL = "select * from worklog_Info where "
这就是在模糊的查询worklog表数据。
什么又是组合查询呢?
组合查询的原理相当于多条件查询(参考我的博客SQL多条件查询),但又不同于多条件查询,组合查询是自己选择查询条件以及组合条件,然后将数据库中符合条件的语句查询出来。同样以“操作员工作记录”为例:
关键位置在哪?对,没错,就是最后的组合关系。
我敲这部分代码的时候是围绕组合关系展开的,在这里,组合查询可以有多种逻辑,我认为从这下手比较简单。
组合关系里只有”与“和”或“两种情况,两个选择框就是四种情况,1、2都空,1不空2空,1空2不空,1、2都不空。
首先,1、2都空的时候,就是只查询第一行;1不空2空是查询前两行;1空2不空是查询后两行;1、2都不空是查询三行。这样写囊括了全部可能出现的情况。
条件选择语句当然要以判断组合关系combo是否为空。
逻辑分析好了,然后来做前期工作。因为这是一个需要自己填入查询关键字、查询条件、查询内容以及查询组合关系的功能窗体。所以,我们要先把SQL不可识别的关键字转换为SQL可以识别的关键字。
在这里有两种方法。
1、select case法
就是定义一个自定义转换函数:
Public Function field(strfilename As String) As String
Select Case strfilename
Case "教师"
field = "UserID"
Case "注册日期"
field = "LoginDate"
Case "注册时间"
field = "LoginTime"
Case "注销日期"
field = "LogoutDate"
Case "注销时间"
field = "LogoutTime"
Case "机器名"
field = "computer"
Case "与"
field = "and"
Case "或"
field = "or"
End Select
End Function
然后,在写组合查询语句的时候。
查询第一行:
txtSQL = "select * from worklog_Info where "
txtSQL = txtSQL & field(字段1.Text) & Trim(操作符1.Text) & "'" & Trim(关键字1.Text) & "'"
查询前两行:
txtSQL = txtSQL & field(组合1.Text) & " " & field(字段2.Text) & 操作符2.Text & "'" & Trim(关键字2.Text) & "'"
查询三行:
txtSQL = txtSQL & field(组合2.Text) & " " & field(字段3.Text) & 操作符3.Text & "'" & Trim(关键字3.Text) & "'"
其中,field就是自定义的函数,它能将”组合“和”字段“中的如”与“和”教师“转换成SQL可识别的”and“和”UserID“。那为什么操作符不用转换呢,因为操作符本身就是SQL可识别的”=“,”<>“,”>“以及”<“。
2、If语句转换法(在对应combo的click事件中写,使用数组比较好,省时省力省代码。)
If comboField = "教师" Then comboField.Tag = "UserID"
If comboField = "注册日期" Then comboField.Tag = "LoginDate"
If comboField = "注册时间" Then comboField.Tag = "LoginTime"
If comboField = "注销日期" Then comboField.Tag = "LogoutDate"
If comboField = "注销时间" Then comboField.Tag = "LogoutTime"
If comboField = "机器名" Then comboField.Tag = "computer"
然后,在组合查询时,类似于上一种方法。
查询第一行:
txtSQL = "select * from worklog_Info where "
txtSQL = txtSQL & 字段1.Tag & Trim(操作符1.Text) & "'" & Trim(关键字1.Text) & "'"
查询第二行:
txtSQL = txtSQL & 组合1.Tag & " " & 字段2.Tag & Trim(操作符2.Text) & "'" & Trim(关键字2.Text) & "'"
查询第三行:
txtSQL = txtSQL & 组合2.Tag & " " & 字段3.Tag & Trim(操作符3.Text) & "'" & Trim(关键字3.Text) & "'"
和第一种方法不同的是,在需要转换的地方是用的.Tag。对应到if语句中,完成了转换。
组合查询的总体思想以及部分代码就是这些,还有需要注意的是验证输入框是否为空,数据库是否为空的这些优化上面了。