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差别很大，基本上需要重新彻底学习。

版本｜发布日期｜包括｜特性｜安全问题

1.0｜1996年8月｜、ADC – IIS 3.0、OLE DB 1.1 SDK (OLE DB 1.1 and ADO 1.0)—Visual Studio、Visual Interdev 1.0 and with Active Server Pages (随IIS 3.0发布)｜、ODBC 3.0、OLE DB 1.1、ADO 1.0、ADC 1.0、ODBC drivers for Access/Jet, SQL Server，Oracle databases｜No bulletin发布

1.5｜1997年9月｜、Microsoft Internet Explorer 4.0、Internet Client SDK 4.0｜、ODBC 3.5、OLE DB 1.5、ADO 1.5、RDS 1.5 (取代ADC 1.0)｜99

2.0｜1998年7月1日｜、Visual Studio 98、Data Access 2.0 SDK｜、ODBC 3.5 SDK、OLE DB 1.5 SDK、OLE DB for OLAP Specification｜98

2.1｜1998年7月11日｜、SQL Server 7.0、SQL Server 6.5 SP5｜、ADO 2.1、RDS 2.1、OLE DB 2.1、OLE DB Provider for ODBC, SQL Server and Oracle、JRO 2.1、ODBC driver、Jet driver、RDO｜02

2.5｜2000年2月17日｜、Windows 2000｜、ADO 2.5、ADO MD 2.5、ADOX 2.5、RDS 2.5、OLE DB 2.5、OLE DB Provider for the ODBC driver for: SQL Server Site Server Search Internet Publishing Jet 4.0 (Access 2000) Oracle Indexing Services (Index Server) Microsoft Data Shaping Services OLAP Services DTS Packages Microsoft Directory Services Server DTS Flat File OLE DB Simple Provider、JRO 2.5、ODBC 3.51、an ODBC driver for Microsoft Access SQL Server Microsoft Excel Text Visual FoxPro FoxPro VFP dBase dBase VFP Paradox Oracle、Jet drivers for: Excel Microsoft Exchange Access text files Lotus 1-2-3 Paradox xBase｜02

2.6｜2000年9月｜、SQL Server 2000｜Not included (manually installed):、Microsoft Jet、Microsoft Jet OLE DB Provider、ODBC Desktop Database Drivers｜02

2.7｜2001年10月｜、Windows XP｜、支持64位系统｜、02、02、03、04

2.8｜2003年8月｜、Windows Server 2003｜bug修复｜、03、04

2.8 SP1｜2005年5月｜、SQL Server 2000 SP4、Windows XP SP2｜bug修复

2.8 SP2｜2005年3月｜、Windows Server 2003 SP1、兼容支持MSJRO

9.0｜从未发布｜、Visual Studio 2005 Beta 1、SQL Server 2005 Beta 1

Windows DAC 6.0｜2006年11月｜、Windows Vista｜、仅改变了版本号、难以兼容MSJRO

ADO 6.1｜2011年10月｜、Windows 7 SP1｜、适用于此后版本操作系统

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"。

```asp
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：

```asp
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语言例子

```cpp
  AfxOleInit();//COM库的初始化 
#import   "c:\program files\common files\system\ado\msado15.dll "   no_namespace   rename( "EOF ", "adoEOF ") //系统生成msado15.tlh,ado15.tli两个头文件来定义ADO库
  _ConnectionPtr   m_pConnection; //指向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提供了这方面的补充功能。

功能｜DAO｜ADO｜ADOX｜JRO(MDB's Only)

Create Recordsets｜✔｜✔

Edit Startup properties｜✔｜✔

Support ANSI92 SQL｜✔｜✔

Create Tables｜✔｜✔

Create New Database｜✔｜✔

Edit Existing Table properties｜✔｜✔

Create table relationships｜✔｜✔

Edit security settings｜✔｜✔

Support for Compression attribute for column data｜✔

Edit stored, basic SQL queries or views｜✔｜✔

Create permanent queries that are accessible only through code.｜✔

Create queries accessible through database container/UI and code.｜✔

Compact/Encode database｜✔｜✔

Refresh Cache｜✔｜✔

Make Database Replicable｜✔｜✔

Make Database Replicas｜✔｜✔

Synchronize Replicas｜✔｜✔

Edit Database properties｜✔

Create custom database properties｜✔

Edit table column properties｜✔