類模塊使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代碼則被封裝在類中。用標准模塊,你必須將控制權交給模塊。最後,類模塊更易於移植。->