| ADO(ActiveXDataObjects)是Microsoft提供和建議使用的新型的資料提供者,具體實現為Automation。這樣,程式員可以在各種支援Automation的開發環境下方便地訪問ADO對象,如VisualBasic、VisualC++、VisualJ++及Delphi等。ADO被實現為OLEDB之上的一個薄層,這使得ADO可以有更快的訪問速度,更易使用,同時更節省資源。值得注意的是,對於VisualStudio6.0的使用者而言,現在提供的ADO2.0要比VisualStudio5.0時代的ADO1.5更加完整。這意味著程式員可以更為廣泛地使用ADO介面,甚至在所有的基於Windows平台的資料訪問中使用它。比如對RDS(前身是ADC)的支援,可以方便的構建高效的Web應用。 一、對ADO對象的主要操作 對ADO對象的主要操作,同DAO、RDO庫的實現基本相同。主要包括6個方面: 1.串連到資料來源。這是可選的、通常涉及ADO的Connection對象。 2.向資料來源提交命令。通常涉及ADO的Command對象。在查詢中可以與參數對象(Parameter)協同使用。 3.執行命令,比如一個SELECT指令碼。 4.如果提交的命令有結果返回,可以通過ADO的Recordset對象對結果進行操作,資料存放區在緩衝中。 5.如果合適,可將緩衝中被修改的資料更新到物理的儲存上。 6.提供錯誤偵測。通常涉及ADO的Error對象。 以程式員的視角來看,ADO、DAO和RDO三者的對象名稱不很相同。但使用ADO對象要比DAO和RDO簡單得多。最主要的一點在於,程式員不用像在使用DAO和RDO那樣要從物件模型的頂層開始一步步的建立子物件。因此,ADO提供了一種更靈活的編程方式。 二、ADO中主要對象的功能 Connection對象,表示了一個到資料來源的會話。使用Connection對象的成員,可以使用相應的屬性開啟到資料來源的串連,設定遊標的位置,設定預設的當前資料庫,設定將使用的OLEDBProvider,直接提交SQL指令碼等。值得注意的是,在提交SQL指令碼的任務時,不用建立一個Command對象,就可完成查詢。另外,對Connection對象的建立是同其他對象無關的。Command對象,可被用於查詢資料庫並返回結果在Recordset對象中。也可以進行批操作和操縱資料庫的結構,當然,這需要使用的OLEDBProvider提供相應的支援。此外,可以將一個啟用的Connection對象綁定到Command對象的ActiveConnection屬性,這使得多個Command對象執行個體可以共用一個Connection對象。 Recordset對象,用來封裝查詢的結果,可稱為結果集。 Field對象,用來表達一行結果中各子段的類型和值。 Error對象,用來檢測和判斷在資料庫操作中出現的錯誤,比如串連失敗。 在ADO中,許多個物件名後多了一個"s",比如Error->Errors,Field->Fields等等。添加"s"意味著是相應對象的Collection(集合)對象,比如Errors是Error對象的Collection對象。Collection有點像數組(Array),但不同的是,Collection可以以不同類型的資料或對象作為自己的元素,而數組中的各元素通常都是相同類型的。所以,在看到一個對象名最後是"s",通常表明這是一個Collection對象,比如Errors中的各元素是由Error對象的執行個體組成的。 三、簡單的例子 現在,我們在經過了前面的鋪墊後,終於可以進入寫代碼的過程了。下面是一系列在VisualBasic中編寫的程式碼片段,其中對ADO的操縱完全用代碼來實現。在開始前,請不熟悉ActiveXAutomation的讀者牢記,我們正在使用的,是被實現為ActiveXAutomation的ADO組件。1.開啟Connect.ion對象 開啟一個到資料來源的串連,即Connection對象的VB代碼如下:
Dim cn As ADODB.Connection ’聲明ADODB.Connection物件變數 Dim strCN As String ’聲明存放串連串的字串變數 Set cn= New Connection ’執行個體化Connection對象 ’產生串連串(ConnectionString) strCN="Provider=Microsoft.Jet.Oledb.3.51; UserID=Admin;"&_ "DataSource=D:/MicrosoftVisual Studio/VB98/Nwind.mdb;" cn.Open strCN ’調用Connection對象的方法Open串連資料來源 |
以上代碼在訪問ADO對象時,使用了前綁定(Early-bind),實現前綁定需要從VisualBasic的Project菜單下選擇Reference功能表項目,並選擇MicrosoftActiveXDataObjects2.0Library。在程式中聲明的strCN變數中,串連串屬性Provider標識了OLEDBProvider為OLEDBProviderforMicrosoftJet,因為我們訪問的是MicrosoftAccess資料檔案,使用MicrosoftJetEngine可以獲得比ODBC更好的效能。在實驗以上代碼時有兩個地方要注意。首先,要根據系統安裝的OLEDBProviderforMicrosoftJet服務選擇相應版本,可能是3.51,也可能是4.0。在本例中使用的是3.51版本。如果使用4.0版本,首先需要將Provider屬性改為"Microsoft.Jet.Oledb.4.0";其次,DataSource屬性標識了所要訪問的資料檔案的路徑,要根據自己的安裝情況作出適當的調整。檔案Nwind.mdb通常被VisualStudio預設安裝,一般放在Visual Basic的工作目錄下。 除了OLEDB Provider for MicrosoftJet以外,Visual Studio6.0還提供了以下的OLEDBProvider,如下所示。
| OLEDB Provider類型 |
資料來源類型 |
| Microsoft OLEDB Provider for ODBC |
databases |
| Microsoft OLEDB Provider for Microsoft Index Server |
Microsoft(r) Index Server |
| Microsoft OLEDB Provider for Microsoft Active Directory Service |
Microsoft(r) Active Directory Service |
| Microsoft OLEDB Provider for SQLServer Microsoft(r) SQLServer |
Microsoft OLEDB Provider for Oracle |
| Oracle |
databases |
這意味著使用ADO介面可以方便地訪問以上的各種資料來源,要做的就是選擇適當的OLEDB Provider。除了使用Connection對象的Open方法以外,還可通過Recordset對象的Open方法快捷地建立到資料來源的串連。這充分體現了ADO的靈活性。 2.建立Command對象
| Dim cmd As ADODB.Command Set cmd=New Command’執行個體化Command對象 |
3.執行查詢 以Command對象為例。
| Dim rs As New ADODB.Recordset Set cmd.ActiveConnection=cn’綁定啟用的Connection對象執行個體 cmd.CommandText="SELECT*from Customers"’產生SQL指令碼 Set rs=cmd.Execute’執行查詢 |
上述的代碼僅僅是一種查詢途徑,此外,ADO的Connection對象的Execute方法和Recordset對象的Open方法也提供了查詢能力。返回的結果可以被儲存在一個Recordset對象執行個體中以便後續的資料處理和操縱。例如:
| Dim rs As NewADODB.Recordset rs.Open cmd,cn,adOpenDymanic,adLockBatchOptimistic |
另外在SQL指令碼的產生方式上,通常可以藉助Parameters/Parameter對象來完成。 4.顯示和操縱資料 查詢結果由Recordset對象封裝。對資料的操縱可以通過Recordset對象提供的成員(屬性和方法)來完成。
| rs.MoveFirst Do While Not rs.EOF’判斷EOF標記屬性(Endoffile) Debug.Print rs!CustomerID & vbTab & rs!CompanyName & _ vbTab & rs!ContactName & vbTab & rs!ContactTitle rs.MoveNext’將遊標指標移到下一條記錄 Loop |
上述代碼將Recordset中的各行記錄列印在Visual Basic的Immediate Window中。為了看到列印的結果,可以在上述代碼之後,增加一條Stop語句,以便進入Debug狀態。 5.更新記錄 使用Recordset對象來完成Update操作。 rs.Close’關閉之前建立的結果集 ’開啟新的結果集,具有寫操作許可權
| rs.Open"Customers",cn,adOpenDynamic,adLockOptimistic,adCmdTable rs.MoveFirst’雖無必要,但可能是一個良好的習慣 rs!CompanyName="Microsoft"’對相應欄位賦予新值 rs.Update’在實體儲存體上生效 |
除了Update以外,寫操作還包括AddNew(添加一條新記錄)和Delete(刪除一條新記錄)。另外,Recordset支援批處理,但這些特徵需要由低層的OLEDBProvider支援。當寫操作出現錯誤時,可根據錯誤描述(訪問ADO的Error或VisualBasic的Err對象)來判斷原因。另一個需要注意的是,當使用Recordset對象完成寫操作時,需要預先指定Recordset對象執行個體非唯讀。 6.收尾工作 在這個階段應該顯式的釋放相應的資源,如果不做的話,通常VisualBasic會自動釋放和回收資源。但對於一個有良好編程習慣的程式員來說,應該主動地做收尾工作,就像下面的代碼一樣。
| rs.Close Set rs=Nothing Set cmd=Nothing cn.Close Set cn=Nothing |
|