类模块使VB编程更为简洁。通过封装技术将复杂的代码同程序的其它部分分隔开,并通过方法和属性同程序的其它部分对话。对于类的种种好处,相信大家都非常清楚了。本文主要介绍类在数据库编程方面的应用。
通过类模块的封装,你可以只需要书写一次那些冗长繁人的SQL查询语句,并能方便地同他人分享你的代码。本文向你介绍如何利用类模块创建SQL查询对象。本文用到Northwind数据库。数据访问技术用的是DAO。
工程目的
本工程的目的是要建立一个查询,该查询将从Northwind数据库中返回Beverage供应商的信息。这些信息包括哪种饮料是由哪些供应商供应的。看上去很简单,但你得对三个表进行操作,这三个表分别是Suppliers,Categories和Products,因此你需要写一串很长的SQL查询语句,所以你只希望写一次就够了。
设计类模块
首先确认你已添加了对MicrosoftDAO3.5ObjectLibrary的引用。接下来在工程中添加一个类模块。将该类模块重命名为ClsSQL。让我们先为这个类创建两个新的公共属性,代码如下:
PublicCompanyNameAsStringObjectproperty
PublicCategoryNameAsStringObjectproperty
添加一个公用变量,名为strMsg。该变量用来保存对象返回给用户的信息。
PublicCompanyNameAsStringObjectproperty
PublicCategoryNameAsStringObjectproperty
PublicstrMsgAsString
现在为这个类编写RunQuery方法。
SubRunQuery()
DimstrSQLAsString
DimdbAsDatabase
DimqdfTempAsQueryDef
DimrsResultsAsRecordset
ConstructtheSQLstring
strSQL=”SELECTDISTINCTROWSuppliers.CompanyName,”&”Products.ProductNameFROMSuppliersINNERJOIN”&”(CategoriesINNERJOINProductsONCategories.CategoryID=”&”Products.CategoryID)”&”ONSuppliers.SupplierID=Products.SupplierID”&”WHERE(((Suppliers.CompanyName)=”&CompanyName&”)AND”&”((Categories.CategoryName)=”&CategoryName&”))”
Setdb=OpenDatabase(“C:\MSOffice\Access\Samples\Northwind.mdb”)
SetqdfTemp=db.CreateQueryDef(“”)
qdfTemp.SQL=strSQL
SetrsResults=qdfTemp.OpenRecordset(dbOpenSnapshot)
rsResults.MoveFirst
Enumeratetherecordset
WithrsResults
DoWhileNot.EOF
Debug.Print.Fields(0);””;.Fields(1)
strMsg=strMsg&.Fields(1)&vbCrLf
.MoveNext
Loop
EndWith
rsResults.Close
qdfTemp.Close
EndSub
现在让我们来简单地分析一下上面的代码。在上面的代码中数据库的路径是用的绝对路径。如果Northwind数据库的路径同你机器上的不同,你需要修改这个路径,以便程序能找到这个数据库。
SQL代码是在Access中建立好然后粘贴到程序中来的。这样做不仅免去你书写代码的麻烦,而且还不容易出错。在粘贴完之后,将原来在SQL代码中的”BigfootBreweries”和”Beverages”用公共变量CompanyName和CategoryName替换掉。
在定义了QueryDef之后,程序枚举记录集。记录集的信息不仅在立即窗口中显示出来,同时被写入strMsg变量中。
在结束对类模块的编码之前,我们还需要对类模块的Terminate事件编写代码。将下面的代码放到该事件中。
PrivateSubClass_Terminate()
MsgBoxstrMsg,Title:=”BeverageResultsfor”&CompanyName,buttons:=vbExclamation
EndSub
现在我们已结束了对类模块的编程。接下来在窗体中添加一个命令按钮。将该命令按钮的Caption属性设置为&RunQuery。将下面的代码放在命令按钮的鼠标单击事件中。
PrivateSubCommand1_Click()
DimobjSQLAsClsSQL
Settheobjectvariable
SetobjSQL=NewClsSQL
Setpropertiesofthenewobject
WithobjSQL
.CompanyName=”BigfootBreweries”
.CategoryName=”Beverages”
EndWith
Retrievetheproperties
Debug.PrintobjSQL.CompanyName
Debug.PrintobjSQL.CategoryName
Callamethodoftheobject
objSQL.RunQuery
Destroytheobject
SetobjSQL=Nothing
EndSub
在上面的语句中,我们首先定义了一个对象变量,接下来将这个对象变量初始化为我们刚建立的类的一个实例。我们也可以用下面这一条语句来实现。
DimobjSQLAsNewClsSQL
紧接着我们设置该对象的属性。CompanyName=”BigfootBreweries”和CategoryName=”Beverages”,将这两个值在立即窗口中显示出来。这样做仅仅为了验证而已。然后调用对象的RunQuery方法。
objSQL.RunQuery
最后释放该对象,触发对象的Terminate事件,弹出消息框,显示查询结果。
MsgBoxstrMsg,Title:=”BeverageResultsfor”&CompanyName,buttons:=
vbExclamation
结论
现在你已对用类模块进行数据库编程的好处有了初步的认识。当然你也可以用标准模块来实现同样的功能。但是用标准模块远不如用类模块简洁。用类模块,你可以为每个查询初始化一个新的对象,而复杂的SQL代码则被封装在类中。用标准模块,你必须将控制权交给模块。最后,类模块更易于移植。->