ADO簡介

 

簡介
ActiveX Data Objects (ADO) 是微軟最新的數(shù)據(jù)訪問技術(shù)。它被設(shè)計用來同新的數(shù)據(jù)訪問層OLE DB Provider一起協(xié)同工作,以提供通用數(shù)據(jù)訪問(Universal Data Access)。OLE DB是一個低層的數(shù)據(jù)訪問接口,用它可以訪問各種數(shù)據(jù)源,包括傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,以及電子郵件系統(tǒng)及自定義的商業(yè)對象。
ADO向我們提供了一個熟悉的,高層的對OLE DB的Automation封裝接口。對那些熟悉RDO的程序員來說,你可以把OLE DB比作是ODBC驅(qū)動程序。如同RDO對象是ODBC驅(qū)動程序接口一樣,ADO對象是OLE DB的接口;如同不同的數(shù)據(jù)庫系統(tǒng)需要它們自己的ODBC驅(qū)動程序一樣,不同的數(shù)據(jù)源要求它們自己的OLE DB提供者(OLE DB provider)。目前,雖然OLE DB提供者比較少,但微軟正積極推廣該技術(shù),并打算用OLE DB取代ODBC。

ADO向VB程序員提供了很多好處。包括易于使用,熟悉的界面,高速度以及較低的內(nèi)存占用(已實現(xiàn)ADO2.0的Msado15.dll需要占用342K內(nèi)存,比RDO的Msrdo20.dll的368K略小,大約是DAO3.5的Dao350.dll所占內(nèi)存的60%)。同傳統(tǒng)的數(shù)據(jù)對象層次(DAO和RDO)不同,ADO可以獨立創(chuàng)建。因此你可以只創(chuàng)建一個"Connection"對象,但是可以有多個,獨立的"Recordset"對象來使用它。ADO針對客戶/服務(wù)器以及WEB應(yīng)用程序作了優(yōu)化。

本文的目的是帶你進入ADO廣闊的世界并開始使用它。

在哪里能得到ADO?
目前ADO1.5版已經(jīng)可以從微軟網(wǎng)站免費下載。到目前為止,微軟網(wǎng)站仍是你獲取有關(guān)ADO最新信息的最佳場所。ADO1.5是作為OLE DB SDK的一部分提供的。你可以從下面這個網(wǎng)址下載:
http://www.microsoft.com/data/oledb/download.htm

在下載之前請先確認OLE DB SDK提供的各項特性。下載文件大約有15M,如果完全安裝的話要占用80M的硬盤空間。如果你只對ADO感舉趣,就選擇最小安裝,這樣只會占用你15M的硬盤空間。關(guān)于ADO的網(wǎng)頁在:

http://www.microsoft.com/data/ado/adoinfo.htm.

在這里你可以找到許多關(guān)于ADO的示例代碼和文章,尤其是在"Workshop"系列的文章中。你也可以從本站下載ADO2.5的幫助文件。

盡管OLE DB SDK提供自己的ADO幫助文件,你會發(fā)現(xiàn)ADO1.0的幫助文件更易于使用。同時它還向你提供ADO對象模型的圖示

ADO是如何組織起來的?
以前的對象模型,如DAO和RDO是層次型的。也就是說一個較低的數(shù)據(jù)對象如Recordset是幾個較高層次的對象,如Environment和QueryDef,的子對象。在創(chuàng)建一個QueryDef對象的實例之前,你不能創(chuàng)建DAO Recordset對象的實例。但ADO卻不同,它定義了一組平面型頂級對象.
最重要的三個ADO對象是Connection, Recordset和Command. 本文將主要介紹Connection和Recordset這兩個對象。每個Connection的屬性定義了與數(shù)據(jù)源的連接。Recordset對象接收來自數(shù)據(jù)源的數(shù)據(jù)。Recordset可以與Connection一起起使用,先建立一個連接,然后獲取數(shù)據(jù)。盡管如此,Recordset也可以被單獨創(chuàng)建,其Connection參數(shù)可以在Open屬性定義。

如何使用ADO?
一旦安裝了ADO,在VB的工程->引用對話框中你就可以看到象下圖所示的東西了:


選擇 "ActiveX Data Objects 1.5 Library" (ADODB).在其下的 "ADO Recordset 1.5 Library"是一個客戶端的版本(ADOR),它定義了有聚的數(shù)據(jù)訪問對象。ADOR 對于客戶端的數(shù)據(jù)訪問來說是足夠的了,因為你不需要Connection對象來建立與遠程數(shù)據(jù)源的聯(lián)系。

如果你想要訪問更多的外部數(shù)據(jù)源,你需要安裝這些外部數(shù)據(jù)源自己的OLE DB Provider,就象你需要為新的數(shù)據(jù)庫系統(tǒng)安裝新的ODBC驅(qū)動程序一樣。如果該外部數(shù)據(jù)源沒有自己的OLE DB Provider,你就得使用OLE DB SDK來自己為這個外部數(shù)據(jù)源創(chuàng)建一個OLE DB Provider了。這已不是本文討論的范圍了。

示例

下面的示例代碼以Northwinds數(shù)據(jù)庫作為遠程數(shù)據(jù)源,然后用ADO來訪問它。首先在控制面板中打開“32位數(shù)據(jù)源”,單擊“添加”按鈕。在彈出的對話框中選擇 "Microsoft Access Driver (*.mdb)" 作為數(shù)據(jù)源驅(qū)動程序。

然后按下圖所示,在對話框中填寫下面的內(nèi)容

 

選擇數(shù)據(jù)庫Northwinds所在路徑。單擊完成,退出ODBC設(shè)備管理器。

啟動一個新的VB工程,在窗體的Load事件中輸入下面的代碼:

Private Sub Form_Load()

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection

'Set Connection properties
cn.ConnectionString = "DSN=RDC Nwind;UID=;PWD=;"
cn.ConnectionTimeout = 30
cn.Open

If cn.State = adStateOpen Then _
    MsgBox "Connection to NorthWind Successful!"

cn.Close

End Sub
按F5運行程序,看看,一個消息框彈出來告訴你連接成功了。請注意,這里我特別注明了是ADODB.Connection,而不是ADOR.Connection,這樣做是為了將二者區(qū)分開(如果你引用了ADODB和ADOR的話,這樣做很有必要)。連接字符串看上去同RDO的連接字符串差不多。事實上,二者確實差不多。
如果我們要訪問一個SQL server數(shù)據(jù)庫,你的Connection代碼看上去應(yīng)象下面所示:

'設(shè)置連接屬性cn.Provider = "MSDASQL"
cn.ConnectionString = "driver={SQL Server};" & "server=prod1;uid=bg;pwd=;database=main"
cn.Open

"Provider"屬性指向SQL Server的OLE DB Provider.
回到我們的示例程序,讓我們創(chuàng)建一個Recordset對象來訪問“Orders”表,并從該表的"ShipCountry"字段中產(chǎn)生頭十個不重復(fù)的國家名。修改窗體Load事件中的代碼,讓它看上去象下面這樣。

Private Sub Form_Load()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Dim sSQL As String
Dim sOut As String
Dim Count As Integer
   
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

' Set properties of the Connection.
cn.ConnectionString = "DSN=RDC Nwind;UID=;PWD=;"
cn.ConnectionTimeout = 30
cn.Open

If cn.State = adStateOpen Then _
    MsgBox "Connection to NorthWind Successful!"

sSQL = "SELECT DISTINCT Orders.ShipCountry FROM Orders"
Set rs = cn.Execute(sSQL)

'Enumerate the recordset
sOut = ""
For Count = 1 To 10
    sOut = sOut & rs("ShipCountry") & vbCrLf
    rs.MoveNext
Next Count

MsgBox sOut, vbExclamation, "ADO Results"
cn.Close

End Sub
運行程序后,你會看到如下圖所示的消息框。


不幸的是,目前這個Recrodset對象是只讀的和forward cursor。如果你想要獲取更多的功能,你需要創(chuàng)建一個獨立的Recordset對象,該對象擁有自己的Connection屬性,就象下面的代碼所示:

Private Sub Form_Load()

Dim rs As ADODB.Recordset

Dim sSQL As String
Dim sOut As String
Dim Count As Integer
   
Set rs = New ADODB.Recordset

sSQL = "SELECT DISTINCT Orders.ShipCountry FROM Orders"

rs.Open sSQL, "DSN=RDC Nwind;UID=;PWD=;", adOpenDynamic

'Report Recordset Connection information
MsgBox rs.ActiveConnection, , "Connection Info"

'Enumerate the recordset
sOut = ""
For Count = 1 To 10
    sOut = sOut & rs("ShipCountry") & vbCrLf
    rs.MoveNext
Next Count

MsgBox sOut, vbExclamation, "ADO Results"

rs.Close

End Sub
上面代碼返回的結(jié)果同前例一樣,但是本代碼中的Recordset是獨立的。這一點是DAO和RDO做不到的。Recordset對象的Open方法打開一個代表從SQL查詢返回的記錄的游標。雖然你可以用Connection對象同遠程數(shù)據(jù)源建立連接,但請記住,在這種情況下,Connection對象和Recordset對象是平行的關(guān)系。
總結(jié)
本文僅向你介紹了ADO強大的功能的冰山一角。微軟承諾,在將來ADO將會取代DAO和RDO。所以現(xiàn)在你應(yīng)該考慮如何將你的數(shù)據(jù)訪問代碼投向ADO的懷抱。這種轉(zhuǎn)變不會很痛苦,因為ADO的語法同現(xiàn)有的語法差不多。也許微軟或第三方會在將來開發(fā)出轉(zhuǎn)換向?qū)砗喕@一轉(zhuǎn)換過程。從現(xiàn)在起,你就應(yīng)開發(fā)純ADO代碼的程序。你也可以繼續(xù)使用DAO或RDO代碼來開發(fā)你的程序,但落伍的感覺總是不好的。