簡介
ActiveXDataObjects(ADO)是微軟最新的數據訪問技術。它被設計用來同新的數據訪問層OLEDBProvider一起協同工作,以提供通用數據訪問(UniversalDataAccess)。OLEDB是一個低層的數據訪問接口,用它可以訪問各種數據源,包括傳統的關系型數據庫,以及電子郵件系統及自定義的商業對象。
ADO向我們提供了一個熟悉的,高層的對OLEDB的Automation封裝接口。對那些熟悉RDO的程序員來說,你可以把OLEDB比作是ODBC驅動程序。如同RDO對象是ODBC驅動程序接口一樣,ADO對象是OLEDB的接口;如同不同的數據庫系統需要它們自己的ODBC驅動程序一樣,不同的數據源要求它們自己的OLEDB提供者(OLEDBprovider)。目前,雖然OLEDB提供者比較少,但微軟正積極推廣該技術,並打算用OLEDB取代ODBC。
ADO向VB程序員提供了很多好處。包括易於使用,熟悉的界面,高速度以及較低的內存占用(已實現ADO2.0的Msado15.dll需要占用342K內存,比RDO的Msrdo20.dll的368K略小,大約是DAO3.5的Dao350.dll所占內存的60%)。同傳統的數據對象層次(DAO和RDO)不同,ADO可以獨立創建。因此你可以只創建一個"Connection"對象,但是可以有多個,獨立的"Recordset"對象來使用它。ADO針對客戶/服務器以及WEB應用程序作了優化。
本文的目的是帶你進入ADO廣闊的世界並開始使用它。
在哪裡能得到ADO?
目前ADO1.5版已經可以從微軟網站免費下載。到目前為止,微軟網站仍是你獲取有關ADO最新信息的最佳場所。ADO1.5是作為OLEDBSDK的一部分提供的。你可以從下面這個網址下載:
http://www.microsoft.com/data/oledb/download.htm
在下載之前請先確認OLEDBSDK提供的各項特性。下載文件大約有15M,如果完全安裝的話要占用80M的硬盤空間。如果你只對ADO感舉趣,就選擇最小安裝,這樣只會占用你15M的硬盤空間。關於ADO的網頁在:
http://www.microsoft.com/data/ado/adoinfo.htm.
在這裡你可以找到許多關於ADO的示例代碼和文章,尤其是在"Workshop"系列的文章中。你也可以從本站下載ADO2.5的幫助文件。
盡管OLEDBSDK提供自己的ADO幫助文件,你會發現ADO1.0的幫助文件更易於使用。同時它還向你提供ADO對象模型的圖示
ADO是如何組織起來的?
以前的對象模型,如DAO和RDO是層次型的。也就是說一個較低的數據對象如Recordset是幾個較高層次的對象,如Environment和QueryDef,的子對象。在創建一個QueryDef對象的實例之前,你不能創建DAORecordset對象的實例。但ADO卻不同,它定義了一組平面型頂級對象.
最重要的三個ADO對象是Connection,Recordset和Command.本文將主要介紹Connection和Recordset這兩個對象。每個Connection的屬性定義了與數據源的連接。Recordset對象接收來自數據源的數據。Recordset可以與Connection一起起使用,先建立一個連接,然後獲取數據。盡管如此,Recordset也可以被單獨創建,其Connection參數可以在Open屬性定義。
如何使用ADO?
一旦安裝了ADO,在VB的工程->引用對話框中你就可以看到象下圖所示的東西了:
選擇"ActiveXDataObjects1.5Library"(ADODB).在其下的"ADORecordset1.5Library"是一個客戶端的版本(ADOR),它定義了有聚的數據訪問對象。ADOR對於客戶端的數據訪問來說是足夠的了,因為你不需要Connection對象來建立與遠程數據源的聯系。
如果你想要訪問更多的外部數據源,你需要安裝這些外部數據源自己的OLEDBProvider,就象你需要為新的數據庫系統安裝新的ODBC驅動程序一樣。如果該外部數據源沒有自己的OLEDBProvider,你就得使用OLEDBSDK來自己為這個外部數據源創建一個OLEDBProvider了。這已不是本文討論的范圍了。
示例
下面的示例代碼以Northwinds數據庫作為遠程數據源,然後用ADO來訪問它。首先在控制面板中打開“32位數據源”,單擊“添加”按鈕。在彈出的對話框中選擇"MicrosoftAccessDriver(*.mdb)"作為數據源驅動程序。
然後按下圖所示,在對話框中填寫下面的內容
選擇數據庫Northwinds所在路徑。單擊完成,退出ODBC設備管理器。
啟動一個新的VB工程,在窗體的Load事件中輸入下面的代碼:
PrivateSubForm_Load()
DimcnAsADODB.Connection
Setcn=NewADODB.Connection
'SetConnectionproperties
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!"
cn.Close
EndSub
按F5運行程序,看看,一個消息框彈出來告訴你連接成功了。請注意,這裡我特別注明了是ADODB.Connection,而不是ADOR.Connection,這樣做是為了將二者區分開(如果你引用了ADODB和ADOR的話,這樣做很有必要)。連接字符串看上去同RDO的連接字符串差不多。事實上,二者確實差不多。
如果我們要訪問一個SQLserver數據庫,你的Connection代碼看上去應象下面所示:
'設置連接屬性cn.Provider="MSDASQL"
cn.ConnectionString="driver={SQLServer};"&"server=prod1;uid=bg;pwd=;database=main"
cn.Open
"Provider"屬性指向SQLServer的OLEDBProvider.
回到我們的示例程序,讓我們創建一個Recordset對象來訪問“Orders”表,並從該表的"ShipCountry"字段中產生頭十個不重復的國家名。修改窗體Load事件中的代碼,讓它看上去象下面這樣。
PrivateSubForm_Load()
DimcnAsADODB.Connection
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setcn=NewADODB.Connection
Setrs=NewADODB.Recordset
'SetpropertiesoftheConnection.
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!"
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
Setrs=cn.Execute(sSQL)
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
cn.Close
EndSub
運行程序後,你會看到如下圖所示的消息框。
不幸的是,目前這個Recrodset對象是只讀的和forwardcursor。如果你想要獲取更多的功能,你需要創建一個獨立的Recordset對象,該對象擁有自己的Connection屬性,就象下面的代碼所示:
PrivateSubForm_Load()
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setrs=NewADODB.Recordset
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
rs.OpensSQL,"DSN=RDCNwind;UID=;PWD=;",adOpenDynamic
'ReportRecordsetConnectioninformation
MsgBoxrs.ActiveConnection,,"ConnectionInfo"
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
rs.Close
EndSub
上面代碼返回的結果同前例一樣,但是本代碼中的Recordset是獨立的。這一點是DAO和RDO做不到的。Recordset對象的Open方法打開一個代表從SQL查詢返回的記錄的游標。雖然你可以用Connection對象同遠程數據源建立連接,但請記住,在這種情況下,Connection對象和Recordset對象是平行的關系。
總結
本文僅向你介紹了ADO強大的功能的冰山一角。微軟承諾,在將來ADO將會取代DAO和RDO。所以現在你應該考慮如何將你的數據訪問代碼投向ADO的懷抱。這種轉變不會很痛苦,因為ADO的語法同現有的語法差不多。也許微軟或第三方會在將來開發出轉換向導來簡化這一轉換過程。從現在起,你就應開發純ADO代碼的程序。你也可以繼續使用DAO或RDO代碼來開發你的程序,但落伍的感覺總是不好的。->