ADO 對象模型如下圖所示,如圖所示,ADO 對象模型非常簡單,僅包含少數幾種類型的對象。注意,ADO 對象模型並不是採用層次結構。每個對象都是獨立的,不從屬於模型中的其他對象。

使用 ADO 對象需要引用 ADO 庫,並選定了 ADO 庫 ( Microsoft ActiveX 數據對象 )。你的電腦上安裝的 ADO 庫的具體版本可能會有所不同,實際上,” 引用 ” 對話框中可能存在多個 ADO 庫。如果想要使用可用於 Access 的最新版本,可選擇編號最高的庫。當然,你也可以選擇編號較低的庫,用以維護現有系統的兼容性。

在下面的示例中,所有 ADO 對象變數都作爲 ADODB 對象類型進行引用。儘管不是完全必要,但在對象類型名稱中加上庫引用前綴可以澄清 Access 對於 VBA 語句引用的對象類型所可能產生的不明確之處。例如,ADO 和 DAO 都支持 Recordset 對象,如果不在對象類型聲明中加上前綴 ADODB 或 DAO,Access 可能會錯誤地理解 VBA 語句中引用的是那種類型的記錄集。

☛ ADO Connection 對象

Connection 對象提供數據源的連接。能夠訪問數據源是執行任何數據操作所必需的,因此,幾乎在任何涉及 ADO 的場景方案中都需要 Connection 對象。

在引用 ADO 庫後,創建 Connection 對象會變得非常簡單 ( ADO 庫在 VBA 代碼中表示爲 ADODB ),如下所示:

Dim adConn as ADODB.Connection
Set adConn = New ADODB.Connection

這兩個語句是在 VBA 中進行面向對象的編程的典型方法。在第一個語句中,使用 ADODB.Connection 對象類型建立了一個對象變數 ( adConn )。這意味着,VBA 會將 adConn 識別爲 Connection,包含與 Connection 對象關聯的所有屬性和方法,如 ADO 庫所定義。但此時,adConn 只是一個佔位符,在內存中尚不存在。

第二個語句對 adConn 對象變數進行實例化。在執行該語句時,VBA 將在計算機的內存中創建一個 Connection 對象,將 adConn 變數指向內存中的變數,並準備使用它。

必須先打開 Connection 對象,然後才能使用。下面的語句是打開 ADO Connection 對象最簡單的方式:

adConn.Open CurrentProject.Connection

在該示例中,Connection 對象連接到當前資料庫。正如你即將看到的,Connection 對象需要設置很多屬性,然後才能成功打開,但在當前資料庫的 Connection 屬性中打開 Connection 對象可以提供所有這些設置。實際上,CurrentProject.Connection 是一個長字符串 ( 具體地說,是一個連接字符串 ),其中包含所需的有關當前資料庫的所有信息。典型的 Connection 屬性設置如下所示:

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;
Data Source=C:\...\Chapter28.accdb;
Mode=Share Deny None;Extended Properties="";
Jet OLEDB:System database=C:\...\Microsoft\Access\System.mdw;
Jet OLEDB:Registry Path=Software\...\Access Connectivity Engine;
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=6;
Jet OLEDB:Database Locking Mode=1;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False;
Jet OLEDB:Support Complex Data=True;
Jet OLEDB:Bypass UserInfo Validation=False;
Jet OLEDB:Limited DB Caching=False;
Jet OLEDB:Bypass ChoiceField Validation=False;

實際上,這要遠遠超過 Connection 對象實際所需的內容,但是,Microsoft 希望確保不遺漏任何內容。

請注意 ConnectionString 屬性的 Data Source 部分。這部分指向特定的 ACCDB 文件。更改該路徑表示 Connection 對象幾乎可以打開任何 Access 資料庫,前提是該路徑有效並且指向一個 ACCDB 文件。

下面的過程將針對當前資料庫打開 Connection 對象,打印輸出該 Connection 對象的 Provider 屬性,然後關閉並放棄該 Connection 對象:

Public Sub OpenConnection()

       Dim adConn As ADODB.Connection

       Set adConn = New ADO.Connection
       adConn.Open CurrentProject.Connection

       ' Connection is open

       Debug.Print adConn.Provider

       adConn.Close
       Set adConn = Nothing

End Sub

在使用 ADO 時,在代碼完成對象處理以後應該關閉對象 ( 如果該對象支持 Close 方法 ) 並將其設置爲 Nothing,這一點非常重要。 ADO 對象在打開後會保留在內存中,必須顯式關閉並放棄 ( 設置爲 Nothing ) 以便將其從內存中清除。如果某個 ADO 對象未正確終止,那麼它可能仍會留在內存中,最終爲用戶帶來問題。

☛ ADO Command 對象

所謂的 Command 對象就是針對通過 Connection 對象打開的資料庫執行命令。命令可能如同查詢的名稱一樣簡單,也可能非常複雜,如同用於選擇很多字段幷包含 WHERE 和 ORDER BY 子句的長 SQL 語句一樣。實際上, Command 對象是從 Access 應用程序執行 SQL Server 存儲過程最常用的方式。

執行 Command 對象得到的輸出結果可以直接轉到記錄集中。然後,可以使用該記錄集中的數據填充窗體或控件,例如本文框、組合框和列表框。

下面的過程是一個關於使用 Command 對象的示例。在該示例中,Command 對象將使用直接從 tbClustomers 表獲取數據填充記錄集。

Public Sub ExecuteCommand()

    Dim adRs As ADODB.Recordset
    Dim adCmd As ADODB.Command

    Const sTABLE As String = "tbCustomers"

    Set adRs = New ADODB.Recordset
    Set adCmd = New ADODB.Command

    adCmd.ActiveConnection = CurrentProject.Connection
    adCmd.CommandText = sTABLE

    Set adRs = adCmd.Execute

    Debug.Print adRs.GetString

    adRs.Close
    Set adRs = Nothing
    Set adCmd = Nothing

End Sub

 

請注意該過程中的以下操作:

✦ 聲明並實例化了一個 Recordset 對象和一個 Command 對象。

✦ Command 對象的 ActiveConnection 屬性設置爲當前工程的 Connection。

✦ Command 對象的 CommandText 屬性設置爲資料庫中某個表的名稱。

✦ 通過將記錄集設置爲執行 Command 對象時返回的值來填充記錄集。

上面的示例說明了對於 ADO Command 對象需要了解的基本知識。必須通過 ActiveConnection 屬性將 Command 對象附加到可用的 Connection。ActiveConnection 可以是一個連接字符串,也可以是一個打開的 Connection 對象。對於 Connection 指向的位置,不會產生任何差別,可能是 Access 或 SQL Server 資料庫、Orcale 或其他任何數據源。Command 對象使用 Connection 的數據源特別知識來到達該數據。

在處理參數化查詢時,Command 對象的價值最大。每個 Command 對象都包含一個 Paramenters 集合,其中自然會包含 Paramenter 對象。每個參數對應於 Command 的 CommandText 屬性引用的查詢或存儲過程所需的一個參數。

在很多情況下,CommandText 屬性設置爲包括參數的 SQL 語句,如下所示:

SELECT * FROM tblCustomers
WHERE State = 'NY' OR State = 'NJ';