ActiveX Data Objects

微软公司的ADO（）是一个用于访问数据源的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上运行。Microsoft Knowledge Base 2640696: An ADO-based application that is compiled in Windows 7 SP1 or Windows Server 2008 R2 SP1 does not run in earlier versions of Windows

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 databasesNo 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)  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   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  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  2.6 2000年9月 SQL Server 2000 Not included (manually installed):
 Microsoft Jet
 Microsoft Jet OLE DB Provider
 ODBC Desktop Database Drivers   2.7 2001年10月 Windows XP 支持64位系统 


  2.8 2003年8月 Windows Server 2003bug修复 
  2.8 SP1 2005年5月 SQL Server 2000 SP4
 Windows XP SP2bug修复 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"。

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   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 ✔         

 参考文献 

 外部链接 

 微软ADO开发信息首页

 參見 
 ADO.NET

Category:微軟API
Category:数据库API