ADO

微軟公司的 **ADO**（**A**ctiveX **D**ata **O**bjects）是一個用於存取資料來源的 COM 組件，作為高層的編程介面層。ADO 是在 OLE DB 之上，包含了很多層次化的 COM 物件與集合（Collections，也是一類物件，在其裡面包含了其他層級物件）。允許開發人員編寫存取資料的代碼而不用關心資料來源是如何實現與存取驅動的，而只用關心到資料庫的連接。存取資料庫的時候，關於 SQL 的知識不是必要的，但是特定資料庫支援的 SQL 命令仍可以通過 ADO 中的命令物件（Command）來執行。

## 版本

ADO 被設計來替代微軟早期的資料存取物件層（包括 RDO（Remote Data Objects）和 DAO（Data Access Objects））。ADO 在 1996 年 8 月與 OLE DB 一起被發布。

ADO 檔案通常儲存在 C:\Program Files (x86)\Common Files\System\ado\ 目錄下。

* Microsoft Office 2000 中發布了 ActiveX Data Objects 2.1 Library（MSADO21.TLB）。
* Microsoft Office 2002 中發布了 ActiveX Data Objects 2.5 Library（MSADO25.TLB）。引入了 Record 物件、Stream 物件、 URL 繫結；並支援辨識 URL 模式的 OLE DB provider。
  * Microsoft ADO Extensions 2.5 for DDL and Security Library（MSADOX.DLL）包含了下述 object 與 collection：Catalog、Column、Group、Index、Key、Procedure、Property、Table、User object and Users collection、View。
  * Microsoft Jet and Replication Objects 2.5 Library（MSJRO.DLL）包括了 Filter object 與 collection，JetEngine object，Replica object。
* ActiveX Data Objects 2.6 Library（MSADO26.TLB）引入了 CubDef.GetSchemaObject 方法、Command 流、Dialect 屬性、Command.Execute 方法、Field statusvalues、NamedParameters 屬性、Resultsets in streams、Single row resultset。
* ActiveX Data Objects 2.7 Library（MSADO27.TLB）支援 64 位元 CPU
* ActiveX Data Objects 2.8 Library（MSADO28.TLB）於 2003 年 8 月隨 Windows Server 2003 作業系統發布，作為 Microsoft Data Access Components (MDAC) 2.8 的組成部分。未引進任何新特性，但做了很多安全方面的修補程式。
* ADO 6.0 (MSADO60.TLB) 包含在 Windows Vista 中，作為 Windows Data Access Components (Windows DAC) 6.0 的組成部分。功能上 ADO 6.0 等價於 ADO 2.8.
* ADO 6.1 (MSADO15.dll) ：2011 年 10 月發布。檔名使用了 15 這個老號。因為 Windows 7 SP1 的 ADO GUID 改變了，導致在此作業系統編譯的使用了 ADO 的軟體可以在 Windows 7 SP1 上執行，但卻無法在 Windows 7 Release 版或 Windows Vista 或 Windows XP 上執行。

2003 年後在新的編程框架.NET Framework 中，微軟提供了一個面向 Internet 的版本的 ADO，稱為 ADO.NET，其物件模型和 ADO 差別很大，基本上需要重新徹底學習。

Microsoft.Jet.OLEDB.X.0 和 Microsoft.ACE.OLEDB.1Y.0 的區別：

* Jet 引擎可以存取 office 97-2003，但是無法存取 office 2007。ACE 引擎是與 Office 2007 一起發布的資料庫連接組件，可以存取 Office 2007 或 Office 97-2003。
* ACE 引擎可以存取正在打開的 Excel 檔案，Jet 引擎不能。

## 架構

ADO 包含 12 個物件：

* 連接（Connection），代表到資料儲存的一個通過 OLE DB 的連接。該物件的 open 方法以一個連接字串作為參數，建立一個資料連接。連接字串例子：`"Provider='SQLOLEDB';Data Source='TheSqlServerName'; Initial Catalog='Northwind';Integrated Security='SSPI';"`
* 命令（Command），一個 SQL 語句可以直接發給 OLE DB provider，通過 CommandText 屬性。傳送參數化查詢或者儲存程序通過 Parameter 物件或者 Parameters 集合。執行一個查詢並返回結果作為資料集物件通過 Execute 方法。
* 記錄集（Recordset），代表資料記錄的結果。包含了 Fields 與 Properties 兩個集合。修改了其中的資料後，呼叫 Update 或 UpdateBatch 方法把改變後的資料提交給資料來源。通過 AddNew 與 Update、UpdateBatch 方法，可以向資料來源增加一條新的記錄。通過 Delete 與 Update 方法，可以刪除資料來源的一條記錄。CancelUpdate 方法用於在 Update 失敗時（如資料庫的約束不能滿足）顯式強制地取消 Update 操作。修改資料來源時有三種方法：
  * Immediate 立即：呼叫 Update 方法會把資料立即修改到資料來源中。記錄集需要採用樂觀鎖（adLockOptimistic）或者悲觀鎖（adLockPessimistic）預先鎖定。前者是在修改資料來源時對記錄加鎖並檢查是否保持了資料完整性；後者是在打開記錄集時即把這部分資料上鎖。
  * Batch 批方式：使用批次樂觀鎖 adLockBatchOptimistic，每次呼叫 Update 方法時僅在臨時緩衝區中修改資料。最終呼叫 UpdateBatch 把修改資料寫入資料來源。在此之前，可以用 UpdateCancel 放棄在臨時緩衝區中的修改。
  * Transaction 事務：如果 OLE DB provider 支援事務操作，可以通過 BeginTrans 與 CommitTrans 方法來開始與提交事務。RollbackTrans 用於取消事務，把資料庫卷回到事務開始狀態。
* 記錄（Record），代表資料庫的一條記錄。包含了 Field 集合。
* 流（Stream），代表資料的順序集合。主要用於 RecordSet 物件，用於讀寫位元組流。常用於把 recordset 儲存為 XML 格式，向 OLE DB provider 傳送命令文字（替代 CommandText 物件）或者包含二進位或文字內容。
* 錯誤（Error），代表資料庫存取中 OLE DB 提供的錯誤
* 欄位（Field），代表一個資料庫欄位
* 參數（Parameter），代表一個參數，用於 SQL 或儲存程序。
* 屬性（Property），儲存物件的資訊
* ImmediateThe recordset is locked using the adLockOptimistic or adLockPessimistic lock.
* Batch：recordset 使用 adLockBatchOptimistic 上鎖。每次 Update 操作在一個臨時 buffer 中修改資料。當 UpdateBatch 呼叫時資料才真正修改回資料庫。呼叫 UpdateCancel 放棄臨時 buffer 中資料。
* Transaction：如果 OLE DB 允許事務操作，則 BeginTrans、CommitTrans、RollbackTrans 可呼叫

ADO 包含 4 個 collection：

* Fields：包含了 Field 物件。
* Properties：包含了 Property 物件。
* Parameters：包含了 Parameter 物件。
* Errors：被包含在一個 Connection 物件中。當 ADO 操作產生一個錯誤，Errors 被清空，然後 provider 產生的錯誤作為 Error 物件儲存到這個 Errors 集合中。

## 使用

ADO 組件的使用需要利用支援 COM 的高階語言，例如 ASP 中的 VBScript 或者 Visual Basic，甚至微軟的競爭對手 Borland 的產品 Delphi，，現在也支援使用 ADO 來存取資料庫。

使用 ADO 存取資料的一些基本步驟：

1. 建立連接物件去連結資料庫（Create a connection object to connect to the database.）
2. 建立記錄集物件來取得資料（Create a recordset object in order to receive data in.）
3. 打開連接（Open the connection）
4. 在記錄集中完成 SQL 語法的描述（Populate the recordset by opening it and passing the desired table name or SQL statement as a parameter to _open_ function.）
5. 對取得的資料進行搜尋／處理操作。
6. 確定改變資料（Commit the changes you made to the data (if any) by using _Update_ or _UpdateBatch_ methods.）
7. 關閉記錄集（Close the recordset）
8. 關閉連接（Close the connection）

## ASP 範例

下列的 ASP 範例使用 ADO 於 "Phonebook" 表中選取 "Name" 欄位，其中 "PhoneNumber" 等於 "555-5555"。

這相當於下列的 ASP code，以 plain SQL 取代 Recordset object：

## C 語言例子

## ADOX

ADO 包含的物件能夠建立、維護、刪除給定資料來源的記錄。但是，建立與管理資料庫及其所包含的物件，ADO 就力有不逮了。為此，**ADOX**，即 Microsoft ADO Ext. for DDL and Security，提供了這方面的功能，主要包括 Data Definition Language (DDL) 物件及安全管理。此外，Jet 資料庫引擎的許多功能都是 ADO 與 ADOX 不具備的；**JRO**，即 Microsoft Jet and Replication Objects 2.5 Library 提供了這方面的補充功能。

## 參考文獻

## 外部連結

* 微軟 ADO 開發資訊首頁

## 參見

* ADO.NET