ActiveX Data Objects

微軟公司的 ADO（ActiveX Data Objects）是一個用於訪問資料來源的 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 存取資料的一些基本步驟：

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

ASP 範例

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

dim myconnection, myrecordset, name

set myconnection = server.createobject ("ADODB.Connection")

set myrecordset = server.createobject ("ADODB.Recordset")

myconnection.open mydatasource

myrecordset.open "Phonebook", myconnection

myrecordset.find "PhoneNumber = '555-5555'"

name = myrecordset.fields.item ("Name")

myrecordset.close

set myrecordset = nothing

set myconnection = nothing

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

dim myconnection, myrecordset, name

set myconnection = server.createobject ("ADODB.connection")

myconnection.open mydatasource

set myrecordset = myconnection.execute ("SELECT Name FROM Phonebook WHERE PhoneNumber = '555-5555'")

name = myrecordset (0)

C 語言例子

AfxOleInit ;//COM 庫的初始化

import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF") // 系統生成 msado15.tlh,ado15.tli 兩個標頭檔案來定義 ADO 庫

ConnectionPtr mpConnection; // 指向 Connection 物件的指標

HRESULT hr;

hr = m_pConnection.CreateInstance ("ADODB.Connection");/// 建立 Connection 物件

if (SUCCEEDED (hr))

{ // 連線資料庫：

hr = m_pConnection-> Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb", ""," ",adModeUnknown); // 未設定第二個引數 UserID、第三個引數 Password

}

// 上面一句中連線字串中的 Provider 是針對 ACCESS2000 環境的，對於 ACCESS97, 需要改為：Provider=Microsoft.Jet.OLEDB.3.51;

/* 第四個引數 Options 可以取值為:

adModeUnknown: 預設。當前的許可權未設定

adModeRead: 只讀

adModeWrite: 只寫

adModeReadWrite: 可以讀寫

adModeShareDenyRead: 阻止其它 Connection 物件以讀許可權開啟連線

adModeShareDenyWrite: 阻止其它 Connection 物件以寫許可權開啟連線

adModeShareExclusive: 阻止其它 Connection 物件開啟連線

adModeShareDenyNone: 允許其它程式或物件以任何許可權建立連線 */

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 提供了這方面的補充功能。