摘 要:作者利用VB6实现了对数据表的组合查询,该模块可以应用于数据库系统的开发中。
关键字:VB6;查询
一、概述
在开发数据库应用系统的开发中,无论是数据的更新、删除和浏览,还是最终需求报表的生成,用户都要首先从拥有大量记录的数据表中检索数据,所以怎样方便用户快速地查询所需数据是开发人员首先要考虑的问题。一般对查询系统有以下几点要求:
①通用性。可以完成大多数的数据查询任务,降低系统开发工作量。
②实用性。要方便用户的操作,增强系统的实用性。
作者在某港务局办公自动化系统的开发中,就是应用开发出的组合查询系统,大大缩短系统的开发周期。关于数据库的通用查询的文章也很多,但作者总觉得实用性不是太好,有的是太专业化,让用户自己组合SQL语句进行查询,有的是可操作性差,不符合大多数用户的习惯。在作者进行系统的分析过程中,就针对这个问题同用户进行了专门的交流,从而提出了这个解决方案,并在系统的运行后得到了用户的肯定。
二、查询模块的详细实现
下面就详细介绍组合查询系统的设计,用VB6来实现的,也可以用其他语言完成。
第一步是在新建的VB工程中添加一标准模块,主要查询函数的实现,以及放置系统所需的全局变量,主要代码如下:
Public Const strCn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Study\Query\DB.mdb;Persist Security Info=False"
Public CancelQuery As Boolean
Function GetQuerySQL(ByVal sRS As String) As String
Dim cn As Connection:Dim rs As Recordset:Dim i As Integer
Set cn = New Connection:Set rs = New Recordset
On Error GoTo errHandle
cn.CursorLocation = adUseClient: cn.Open strCn
rs.Open sRS, cn, adOpenDynamic, adLockReadOnly
With frmQuery.lstFields
.Clear
For i = 0 To rs.Fields.Count - 1
.AddItem rs.Fields(i).Name
Next
End With
frmQuery.Show 1
Set rs = Nothing: Set cn = Nothing
GetQuerySQL = frmQuery.txtWhere.Text: Unload frmQuery
Exit Function
errHandle:
MsgBox "系统出错!", vbExclamation, "警告"
End Function
其中strCn为连接到数据库的连接字符串,CancelQuery是判断用户在调出查询界面后是否进行查询,下面的查询函数GetQuerySQL的传递参数为标准SQL查询语句,提供给用户所要查询的数据表的字段,当用户进行组合查询后把结果以字符串的形式返回给该函数,这个地方主要是用一个TextBox实现变量的传递,可以视情况而定。
图1查询窗体
第二步是查询窗体的实现,在VB中新建一窗体,添加如图1(为程序运行后的界面)所示的各个控件,字段列表中的字段是窗体显示之前加载,同时设置CancelQuery为False,当用户进行各种查询条件的组合后添加到查询条件列表中,供用户查看。因为最终的结果要转化成标准的SQL条件语句,所以当用户确定后要对查询的组合进行检查,以便转化工作,主要是提示用户进行查询的“傻瓜”组合,主要代码如下:
Private Sub cmdOK_Click()
If lstList.ListCount < 1 Then
txtWhere.Text = "":Me.Hide: Exit Sub
End If
Dim i As Integer:Dim strFind As String
If lstList.List(0) = "And" Or lstList.List(0) = "Or" Then
MsgBox "请删除查询条件列表第一项的 And 或 Or 标记!", vbExclamation
Exit Sub
End If
With lstList
For i = 1 To .ListCount - 1
If i Mod 2 <> 0 Then
Dim pass As Boolean:pass = False
If .List(i) = "And" Then pass = True:If .List(i) = "Or" Then pass = True
If Not pass Then
MsgBox "查询条件列表中第" & (i + 1) & "项需要And 或 Or标记!", vbExclamation, "通用查询"
Exit Sub:End If: End If:Next
End With
If lstList.List(lstList.ListCount - 1) = "And" Or
lstList.List(lstList.ListCount - 1) = "Or" Then
MsgBox "请删除查询条件列表最后一项的 And 或 Or 标记!", vbExclamation, "通用查询"
Exit Sub
End If
With lstList
For i = 1 To .ListCount
strFind = Space(1) & strFind & .List(i - 1) & Space(1)
Next
End With
strFind = "where " & strFind:txtWhere.Text = Trim(strFind):Me.Hide
End Sub
最后把组合结果返回给TextBox,这个控件在运行时要隐藏,最终返回给标准模块中的函数GetQuerySQL,而当用户取消本次查询时要在取消按钮的Click事件中添加CancelQuery=True语句,这样本组合查询设计工作就完成了,其它代码从略。下面是它的应用实例。
首先新建一VB6工程,同时新建一个Access数据库,并建立一个学生信息表Student,放置一个命令按钮,一个DataGrid控件,不要忘了为工程引用ADO对象库,为命令按钮的Click事件添加以下代码:
Private Sub Command1_Click()
Dim strSQL As String
strSQL = GetQuerySQL("select * from student")
If CancelQuery = True Then Exit Sub
Dim cn As Connection: Dim rs As Recordset
Set cn = New Connection: Set rs = New Recordset
cn.CursorLocation = adUseClient: cn.Open strCn
If strSQL <> "" Then
rs.Open "select * from student " & strSQL, cn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rs
End If
Set rs = Nothing: Set cn = Nothing
End Sub
查询条件的设置如图所示,测试的结果如图2所示。
图2测试结果
三、结论
本文主要从实用的角度出发,目的是使用户能方便、快速的查询复杂数据。经过实际的应用,基本满足了用户的查询需要。同时,本组合查询系统可以用其他编程语言重新实现,应用到数据库系统的开发中。
参考文献
[1] Visual Basic 6.0中文版数据库和Internet编程 胡荣根 清华大学出版社 1999年.
[2] 三层结构的综合查询系统的开发 孙晓辉,姚楠 江苏电机工程2000年04期.
|