【 tulaoshi.com - 编程语言 】
                             
                            类模块使VB编程更为简洁。通过封装技术将复杂的代码同程序的其它部分分隔开,并通过方法和属性同程序的其它部分对话。对于类的种种好处,相信大家都非常清楚了。本文主要介绍类在数据库编程方面的应用。  
  通过类模块的封装,你可以只需要书写一次那些冗长繁人的SQL查询语句,并能方便地同他人分享你的代码。本文向你介绍如何利用类模块创建SQL查询对象。本文用到Northwind数据库。数据访问技术用的是DAO。  
  工程目的
  本工程的目的是要建立一个查询,该查询将从Northwind数据库中返回Beverage供应商的信息。这些信息包括哪种饮料是由哪些供应商供应的。看上去很简单,但你得对三个表进行操作,这三个表分别是Suppliers,Categories和Products,因此你需要写一串很长的SQL查询语句,所以你只希望写一次就够了。
  设计类模块
  首先确认你已添加了对MicrosoftDAO3.5ObjectLibrary的引用。接下来在工程中添加一个类模块。将该类模块重命名为ClsSQL。让我们先为这个类创建两个新的公共属性,代码如下:  
  PublicCompanyNameAsString'Objectproperty
  PublicCategoryNameAsString'Objectproperty  
  添加一个公用变量,名为strMsg。该变量用来保存对象返回给用户的信息。
  PublicCompanyNameAsString'Objectproperty
  PublicCategoryNameAsString'Objectproperty  
  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:MSOfficeAccessSamplesNorthwind.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代码则被封装在类中。用标准模块,你必须将控制权交给模块。最后,类模块更易于移植。->