Microsoft Data Access Components(MDAC;也称为Windows DAC)是微软的一套相互关联的技术框架,旨在使程序员能够以一种统一且全面的方式开发应用程序,以便访问几乎任何数据存储。它的组成部分包括ActiveX数据对象(ADO)、OLE DB和开放数据库连接(ODBC)。此外,MDAC还包括其他组件,如SQL Server客户端网络库、ADO.NET等。MDAC最初于1996年8月发布,随着时间的推移,其组件经历了多次更新和改进。MDAC现在被称为Windows DAC,尤其是在Windows Vista及更高版本的操作系统中。[1]
架构
MDAC的最新版本(2.8)包含多个交互组件,所有这些组件都是Windows特定的,除了ODBC(可在多种平台上使用)。MDAC架构可分为三个层次:编程界面层,包括ADO和ADO.NET;数据库访问层,由数据库供应商(如Oracle和Microsoft)开发,包括OLE DB、.NET托管提供程序和ODBC驱动程序;以及数据库本身。通过MDAC API,这些组件层都可供应用程序使用。Microsoft SQL Server网络库是一种专有的访问方法,专门用于Microsoft SQL Server,也被包含在MDAC中。开发人员被鼓励使用ADO或ADO.NET进行数据访问,这样做的好处是用户的应用程序不受数据库架构的限制,只要它得到MDAC的支持。当然,开发人员仍然可以选择编写直接访问OLE DB和ODBC的应用程序。[2]
Microsoft SQL Server网络库
Microsoft SQL Server网络库(也称为Net-Lib)用于Microsoft SQL Server通过多种网络协议读取和写入数据。尽管Net-Lib是针对SQL Server的专用技术,但Microsoft将其随MDAC一起提供。SQL Server使用Open Data Services(ODS)库与Net-Lib通信,后者直接与Windows NT操作系统系列的Win32子系统接口。SQL Server网络库通过Client Network Utility进行管理,该实用程序与SQL Server捆绑在一起。
每个支持的网络协议都有一个单独的驱动程序(不应与设备驱动程序混淆),并且具有支持会话层的协议堆栈。有两种类型的Net-Lib:主要和次要。主Net-Lib包括Super Socket Net-Lib和Shared Memory Net-Lib,而次级Net-Lib则包括TCP/IP和命名管道网络库(命名管道是一种用于与其他进程通过系统持久的管道进行通信的方法,该管道具有身份)。Microsoft OLE DB Provider for SQL Server(SQLOLEDB)通过主要Net-Lib进行通信。
Super Socket Net-Lib负责跨计算机通信,并协调次级Net-Lib——尽管TCP/IP次级Net-Lib是一个例外,因为它直接调用Windows Sockets 2 API。Banyan VINES、AppleTalk、ServerNet、IPX/SPX、Giganet和RPC Net-Lib在MDAC 2.5之后被删除。Network Library路由器的任务是管理所有这些协议,但现在只有命名管道次级Net-Lib由路由器管理。Super Socket Net-Lib还通过使用Windows SSL API处理数据加密。
Shared Memory Net-Lib另一方面,负责在同一台计算机上存在的多个SQL Server实例之间的通信。它使用共享内存区域在不同进程中进行通信。这是固有的安全的;因为操作系统不允许任何其他进程访问实例的共享内存区域,所以在同一台计算机上存在的SQL Server实例之间不需要数据加密。
Net-Lib还能够支持代表登录用户的权限上下文的身份验证机制,对于支持经过身份验证的连接的协议(称为受信任的连接),这是可能的。这允许Net-Lib提供集成的登录身份验证机制,通过使用Windows身份验证。Windows身份验证不适用于Windows 98或Windows Me。
OLE DB
OLE DB(也称为OLEDB或OLE-DB)允许MDAC应用程序以统一的方式访问不同类型的数据存储。Microsoft使用这项技术将应用程序与所需访问的数据存储分开。这样做是因为不同的应用程序需要访问不同类型和源的数据,并不一定需要知道如何访问特定技术的功能。该技术概念上分为消费者和提供商。消费者是需要访问数据的应用程序,而提供商是通过使用Component Object Model(或COM)公开OLE DB接口的软件组件。
OLE DB是MDAC使用的数据库访问接口技术。OLE DB提供商可以创建以访问简单的数据存储,如文本文件或电子表格,一直到复杂的数据库,如Oracle和SQL Server。然而,由于不同的数据存储技术有不同的功能,OLE DB提供商可能没有实现所有可能的接口。可用的能力是通过COM对象实现的——OLE DB提供商将数据存储技术的功能映射到特定的COM接口。Microsoft称接口的可用性为“提供商特定”的,因为它可能因涉及的数据库技术的不同而不适用。此外,提供商还可以扩展数据存储的功能;这些服务在Microsoft术语中被称为服务。
Microsoft OLE DB Provider for SQL Server(SQLOLEDB)是Microsoft提供的用于Microsoft SQL Server从版本6.5及以上的OLE DB提供商。
Universal data link
通用数据链接文件(或“.udl”文件)提供了一个共同的用户界面,用于指定连接属性。用户可以使用数据链接属性对话框将连接信息保存在.udl文件中,而不是手动在连接字符串中直接指定。因此,这些文件提供了一种方便的间接级别。此外,对话框指定了几种备用OLE DB数据提供商,供各种目标应用程序使用。
ODBC
开放数据库连接(ODBC)是一种原生接口,可通过编程语言(通常是C)访问原生库。在MDAC中,此接口定义为DLL。为了访问每个数据库,需要一个单独的模块或驱动程序。ODBC API中的函数由这些DBMS特定的驱动程序实现。Microsoft在MDAC中提供的驱动程序称为SQL Server ODBC驱动程序(SQLODBC),它是为Microsoft的SQL Server设计的。它支持SQL Server v6.5及以上版本。ODBC允许程序使用SQL请求访问数据库,而无需了解数据库的专有接口。它处理SQL请求,并将其转换为数据库系统理解的请求。据Microsoft称,“在SQL Server 2012之后,ODBC驱动程序将更新以支持最新的服务器功能,包括Microsoft Windows Azure SQL Database,并作为Microsoft ODBC Driver for SQL Server发布。”
ADO
ActiveX数据对象(ADO)是OLE DB的一个高层编程接口。它使用一个层次的对象模型,允许应用程序以编程方式创建、检索、更新和删除源自OLE DB支持的数据源的数据。ADO由一系列层次化的COM基础对象和集合组成,一个对象充当容器,包含许多其他对象。程序员可以直接访问ADO对象来操纵数据,或者可以通过几个ADO机制发送SQL查询到数据库。ADO由九个对象和四个集合组成。
集合包括:
- Fields:此集合包含一组Field对象。该集合可以在Recordset对象或Record对象中使用。在Recordset对象中,每个Field对象对应于表中的一个列。在Record对象中,Field可以是一个绝对或相对URL,指向树状命名空间(用于半结构化数据提供商,如Microsoft OLE DB Provider for Internet Publishing)或引用与该Record对象相关联的默认Stream对象。
- Properties:一个对象可以有多个Property对象,这些对象包含在对象的Properties集合中。
- Parameters:Command对象可以有几个Parameter命令来更改其预定义行为,每个Parameter对象都包含在Command对象的Parameters集合中。
- Errors:当ADO操作产生错误时,会在Errors集合中创建一个Error对象,而Errors集合本身包含在一个Connection对象中。当ADO操作产生错误时,集合会被清除,并创建一个新的Error对象组。然而,如果出于某种原因无法发生删除,例如因为违反参照完整性,则记录集将在调用Update方法后保持编辑模式。程序员必须显式调用CancelUpdate函数来取消更新。此外,ADO还可以回滚事务(如果支持的话)并取消批量更新。记录集也可以通过三种方式进行更新:即时更新、批处理更新或通过事务:
- Instantaneous:记录集使用adLockOptimistic或adLockPessimistic锁锁定。数据在数据源更新后立即在数据源中更新,调用Update方法。
- Batch:记录集使用adLockBatchOptimistic锁定,并且每次调用Update时都会将数据更新到临时缓冲区中。最终,当调用UpdateBatch时,数据将完全更新回到数据源。
- Transaction:如果OLE DB提供商允许,可以使用事务。要开始事务,程序员调用BeginTrans方法并执行所需的更新。当所有更新都已完成时,程序员调用CommitTrans方法。RollbackTrans可以调用来取消任何在事务内部所做的更改,并将数据库回滚到事务开始前的状态。
对象包括:
- Connection:连接对象是ADO与OLE DB的连接。连接对象存储有关会话的信息,并提供连接到数据存储的“Open”方法。由于某些数据存储有不同的连接方法,一些方法可能不在连接对象中支持,具体取决于OLE DB提供商。连接对象使用连接字符串建立与数据存储的连接,该连接字符串指定连接为一组键值对(例如:“Provider=’SQLOLEDB’;Data Source=’TheSqlServer’;Initial Catalog=’Northwind’;Integrated Security=’SSPI’;”)。开头必须标识数据存储连接所需的类型。这可能是:
- 一个OLE DB提供商(例如SQLOLEDB),使用语法“provider=”
- 一个文件名,使用语法“file name=”
- 远程提供商和服务器(见RDS),使用语法“Remote provider=”和“Remote server=”
- 一个绝对URL,使用语法“URL=”
- Command:连接对象建立与数据源的会话后,通过Command对象向数据提供商发出指令。Command对象可以通过CommandText属性直接向提供商发送SQL查询,通过Parameter对象或Parameters集合发送参数化查询或存储过程,或将查询的结果返回到DataSet对象,通过Execute方法运行查询。Command对象还有其他几个方法可用于与其他对象交互,例如Stream、RecordSet或Connection对象。
- Recordset:Recordset是一组记录,可以来自基表或查询结果。RecordSet对象包含一个Fields集合和一个Properties集合。Fields集合是一组Field对象,对应于表中的列。Properties集合是一组Property对象,定义OLE DB提供商的具体功能。RecordSet有许多方法和属性,可用于检查数据。记录可以通过更改记录中的值并通过调用Update或UpdateBatch方法来更新。添加新记录是通过AddNew函数完成的,然后通过调用Update或UpdateBatch方法。记录也是通过Delete方法删除的,然后通过调用Update方法。但是,如果由于违反参照完整性等原因无法发生删除,则记录集将在调用Update方法后保持编辑模式。程序员必须显式调用CancelUpdate函数来取消更新。此外,ADO还可以回滚事务(如果支持的话)并取消批量更新。Recordsets也可以通过三种方式进行更新:即时更新、批处理更新或通过事务:
- Instantaneous:记录集使用adLockOptimistic或adLockPessimistic锁锁定。数据在数据源更新后立即在数据源中更新,调用Update方法。
- Batch:记录集使用adLockBatchOptimistic锁定,并且每次调用Update时都会将数据更新到临时缓冲区中。最终,当调用UpdateBatch时,数据将完全更新回到数据源。
- Transaction:如果OLE DB提供商允许,可以使用事务。要开始事务,程序员调用BeginTrans方法并执行所需的更新。当所有更新都已完成时,程序员调用CommitTrans方法。RollbackTrans可以调用来取消任何在事务内部所做的更改,并将数据库回滚到事务开始前的状态。
- Record:此对象表示数据库中的一个记录,并包含一个字段集合。
- Stream:Stream主要用于RecordSet对象,是一种读写字节流的方式。它主要用于保存Recordset对象的XML格式,通过使用Stream对象向OLE DB提供商发送命令,以及包含二进制或文本文件的内容。
- Parameter:Parameter是改变常见功能的一种手段,例如存储过程可能会有不同的参数传递给它,具体取决于需要做什么;这些被称为参数化命令。
- Field:每个Record对象包含许多字段,RecordSet对象也有对应的Field对象。
- Property:此对象是OLE DB提供商特有的,定义了提供商实施的一项功能。Property对象可以是内置的属性——它是由ADO预先定义的属性,因此无法更改——或者是动态属性——由底层数据提供商定义,并且可以更改。
- Error:当OLE DB提供商在使用ADO期间产生错误时,将创建一个Error对象并在Errors集合中。其他错误不会放入Error对象中,然而。例如,当在RecordSet或Field对象中操纵数据时产生的错误将存储在Status属性中。
ADO.NET
ADO.NET是ADO(在ADO 2.8之后,现在常称为ADO Classic)的最新版本,是MDAC 2.8堆栈的一部分,与经典ADO并行。它构建在Microsoft .NET上。虽然有时被视为ADO的经典升级版,但Microsoft对其进行了根本性的结构性变化。ADO.NET通过.NET托管提供程序运行,这是一种修改过的OLE DB提供商,专门设计用于.NET。对象结构不再围绕Recordset对象构建。相反,使用Dataset对象来容纳从多个源收集的数据。这种透明性对程序员来说是隐藏的。与旧的ADO Recordset相比,Dataset的设计促进了断开连接数据的使用。概念上,Dataset对象可以视为一个小的内存关系数据库,它可以独立地对数据进行任意方向的处理。为了将更改传播回数据库,使用DataAdapter对象,该对象将数据从数据源传输到DataSet对象。游标也被弃用了,取而代之的是DataReader对象,它用于高效地逐条处理大型结果列表,而无需将它们存储起来。
已废弃和过时的组件
MDAC是一个不断演进的组件框架。因此,有一些组件曾经是其一部分,但后来被废弃或完全从框架中删除。
Jet数据库引擎和JRO
Jet代表Joint Engine Technology,是Microsoft Access、Microsoft Exchange Server和Visual Basic使用的数据库引擎。Jet是Relational Database Management System(RDBMS)的一部分,提供单一接口,其他软件可以使用该接口访问Microsoft数据库。Jet还提供了对安全性、参照完整性、事务处理、索引、页锁定和数据复制的支持。在较晚的Jet版本中,引擎得到了扩展,可以运行SQL查询,存储字符数据为Unicode格式,创建视图,并允许与Microsoft SQL Server的双向复制。它被MSDE取代,MSDE又被SQL Server Express取代。
Jet有三个模块。一个是Native Jet ISAM Driver,这是一个Jet动态链接库(DLL),可以直接操作Microsoft Access数据库文件(MDB),这是一种修改过的Indexed Sequential Access Method(ISAM)数据库。另一个模块是ISAM Drivers,DLLs允许访问ISAM数据库,其中包括Xbase、Paradox、Btrieve和FoxPro文件。最后一个模块是Data Access Objects(DAO)DLL,DAO允许Access Basic和Visual Basic应用程序开发人员访问Jet数据库引擎。在版本3.5中,DAO能够绕过Jet引擎,直接访问ODBC数据源。
同样,Microsoft Jet OLE DB Provider和Replication Objects(JRO)允许Jet数据源之间的复制,但在MDAC 2.6中被删除。
MSDASQL和Oracle ODBC
Microsoft OLE DB Provider for ODBC,或MSDASQL,是一个OLE DB提供商,允许ActiveX Data Objects通过任何ODBC驱动程序访问数据库。Microsoft提供了几个OLE-DB提供商(用于Indexing Service、Active Directory、Jet、SQL Server和Oracle(MSDAORA)),除非另有说明,否则ADO默认使用MSDASQL作为默认提供商。Microsoft最初计划在他们的64位操作系统中停用MSDASQL,并且Microsoft Oracle ODBC驱动程序随后被.NET Managed Oracle Provider取代,该驱动程序支持Oracle 9i。然而,Windows Server 2008和Windows Vista SP1带有64位版本的MSDASQL。
Remote Data Services(RDS)
Remote Data Services(RDS)允许从服务器检索一组数据,客户端对其进行某种方式的更改,然后将其发送回服务器进行进一步处理。随着Transact-SQL的流行,它扩展了SQL,增加了循环和条件语句等编程构造,这种情况变得不太必要,最终在MDAC 1.5中被废弃。Microsoft发布了SOAP Toolkit 2.0,允许客户端通过开放的XML标准进行此类操作。
SQLXML
SQLXML是为了支持SQL Server 2000而设计的,但在MDAC 2.6中被废弃。它允许Microsoft的relational数据库通过XPath查看,并允许数据以XML文件的形式查看。它实际上并没有被废弃,而是从MDAC中删除,尽管Microsoft确实提供了它作为一个可下载的组件,并且将继续在其64位操作系统上提供支持。
历史
Microsoft发布了多个MDAC版本,每个版本的时间分布和特性集各不相同。
MDAC 1.0
MDAC 1.0于1996年8月首次发布。据Microsoft称,“MDAC 1.0更多地存在于概念层面,而非协调一致的独立安装程序。”MDAC 1.0堆栈包括ODBC 3.0、OLE DB 1.1、ADO 1.0和Advanced Data Connector(ADC)1.0——据Microsoft称,这是MDAC 1.5远程数据服务的前身。它还包含在Internet Explorer 4.0和Internet Client SDK 4.0中,以及CD-ROM,该CD-ROM在1997年专业开发人员大会上分发。共有五个MDAC 1.5版本:
- MDAC 1.5(初始发布):随Internet Explorer 4.0和Internet Client SDK一同发布。
- MDAC 1.5a:可以从Microsoft网站下载。
- MDAC 1.5b:随Windows NT 4.0 Option Pack & Office 97一同发布。
- MDAC 1.5c:修复了ADO线程和ODBC连接池的问题,并通过Microsoft网站发布。它仅包含ADO/MDAC运行时组件。
- MDAC 1.5d:随Windows 98和Internet Explorer 4.01服务包1一同发布。
MDAC 1.0包含的组件包括:
- ODBC 3.0
- OLE DB 1.1
- ADO 1.0
- Remote Data Service 1.0,取代了Advanced Data Connector。
- 此版本的MDAC有一个安全漏洞,使得具有IIS和MDAC的系统的未经授权的Web用户能够以特权用户身份执行shell命令。这一漏洞导致多宿主IIS系统上的MDAC用户能够通过公共连接隧道SQL和其他ODBC数据请求,从而访问未发布的内容。它还允许攻击者未经授权访问IIS系统上的保护文件。它还允许用户获得未经授权访问受限、未发布文件的权限。
MDAC 1.0是Windows NT 3.51 SP5之前支持的最后一版MDAC。
MDAC 1.5
MDAC 1.5于1997年9月至1998年3月发布,并采用了比MDAC 1.0更集中式的分发机制。它随Internet Explorer 4.0、Internet Client SDK 4.0和CD-ROM一同发布,该CD-ROM在1997年专业开发人员大会上分发。共有五种MDAC 1.5版本:
- MDAC 1.5(初始发布):随Internet Explorer 4.0和Internet Client SDK一同发布。
- MDAC 1.5a:可以从Microsoft网站下载。
- MDAC 1.5b:随Windows NT 4.0 Option Pack & Office 97一同发布。
- MDAC 1.5c:修复了ADO线程和ODBC连接池的问题,并通过Microsoft网站发布。它仅包含ADO/MDAC运行时组件。
- MDAC 1.5d:随Windows 98和Internet Explorer 4.01服务包1一同发布。
MDAC 1.5包含的组件包括:
- ODBC 3.5
- OLE DB 1.5
- ADO 1.5
- Remote Data Service 1.5,取代了Advanced Data Connector。
- 此版本的MDAC有一个安全漏洞,使得具有IIS和MDAC的系统的未经授权的Web用户能够以特权用户身份执行shell命令。这一漏洞导致多宿主IIS系统上的MDAC用户能够通过公共连接隧道SQL和其他ODBC数据请求,从而访问未发布的内容。它还允许攻击者未经授权访问IIS系统上的保护文件。它还允许用户获得未经授权访问受限、未发布文件的权限。
MDAC 2.0
MDAC 2.0于2000年2月17日发布,并通过Microsoft网站分发。三个服务包已发布。MDAC 2.0包含的组件包括:
- ADO 2.0
- ADO MD 2.0
- ADOX 2.0
- RDS 2.0
- OLE DB 2.0
- 多个OLE DB提供商
- JRO 2.0
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
MDAC 2.1
MDAC 2.1于2000年9月至2001年3月发布,并通过Microsoft网站分发。共有四种MDAC 2.1版本:
- MDAC 2.1(初始发布):随SQL Server 7.0和SQL Server 6.5 SP5一同发布。
- MDAC 2.1 SP1(2001年6月20日发布):随SQL Server 2000一同发布。
- MDAC 2.1 SP2(2002年6月11日发布):随SQL Server 2000一同发布。
MDAC 2.1包含的组件包括:
- ADO 2.1
- ADO MD 2.1
- ADOX 2.1
- RDS 2.1
- OLE DB 2.1
- 多个OLE DB提供商
- JRO 2.1
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
MDAC 2.5
MDAC 2.5于2000年2月17日发布,并通过Microsoft网站分发。三个服务包已发布。MDAC 2.5包含的组件包括:
- ADO 2.5
- ADO MD 2.5
- ADOX 2.5
- RDS 2.5
- OLE DB 2.5
- 多个OLE DB提供商
- JRO 2.5
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
MDAC 2.6
MDAC 2.6于2000年9月发布,并通过Microsoft网站分发。共有四次MDAC 2.6发布:
- MDAC 2.6(初始发布):随SQL Server 2000一同发布。
- MDAC 2.6 SP1(2001年6月20日发布):随SQL Server 2000一同发布。
- MDAC 2.6 SP2(2002年6月11日发布):随SQL Server 2000一同发布。
MDAC 2.6包含的组件包括:
- ADO 2.6
- ADO MD 2.6
- ADOX 2.6
- RDS 2.6
- OLE DB 2.6
- 多个OLE DB提供商
- JRO 2.6
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
MDAC 2.7
MDAC 2.7于2001年10月发布,并通过Microsoft网站分发。有两个MDAC 2.7发布:
- MDAC 2.7(初始发布):随Windows 2000一同发布。
- MDAC 2.7 SP1(2002年4月发布):随Windows XP一同发布。
MDAC 2.7包含的组件包括:
- ADO 2.7
- ADO MD 2.7
- ADOX 2.7
- RDS 2.7
- OLE DB 2.7
- 多个OLE DB提供商
- JRO 2.7
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
MDAC 2.8
MDAC 2.8于2003年8月发布,并通过Microsoft网站分发。MDAC 2.8包含的组件包括:
- ADO 2.8
- ADO MD 2.8
- ADOX 2.8
- RDS 2.8
- OLE DB 2.8
- 多个OLE DB提供商
- JRO 2.8
- ODBC 3.51
- 多个ODBC驱动程序
- 多个Jet驱动程序。
Windows DAC 6.0
Windows Vista及其更高版本的操作系统不再使用MDAC,而是使用Windows DAC,后者包含更新版本的ADO、OLE DB和ODBC组件。据Microsoft称,“Windows DAC包括了一些与Windows Vista兼容的变化,但从功能上讲,它几乎与MDAC 2.8完全一样。”
版本检查
有两种检查计算机上安装的MDAC版本的方法。对于Windows 2000、Windows XP和Windows Server 2003,一种方法是使用Microsoft的Component Checker程序,该程序将计算机上的文件与每个MDAC版本的DLL文件列表进行比较,并报告最接近的匹配项。另一种方法是检查注册表中的以下键:HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\FullInstallVer。要查看注册表,请按照以下步骤操作:
1. 单击“开始”,然后单击“运行”。
2. 在“打开”文本框中,键入regedit,然后单击“确定”。启动注册表编辑器。
3. 在导航窗口中,找到以下注册表项:HKEY_LOCAL_MACHINE\Software\\Microsoft\\DataAccess。
4. 在详细信息窗格中,在名称栏中找到FullInstallVer和版本。其中的每个注册表项在数据列中都有相应的版本信息。请将此信息与下表中的版本信息进行比较。
5. 完成后,单击“注册表”菜单上的“退出”以关闭注册表编辑器。
MDAC版本 完全安装版本
MDAC 2.5 RTM 2.50.xxxx.x
MDAC 2.5 SP1 2.51.xxxx.x
MDAC 2.5 SP2 2.52.xxxx.x
MDAC 2.5 SP3 2.53.xxxx.x
MDAC 2.6 RTM 2.60.xxxx.x
MDAC 2.6 SP1 2.61.xxxx.x
MDAC 2.6 SP2 2.62.xxxx.x
MDAC 2.7 RTM 2.70.xxxx.x
MDAC 2.7 SP1 2.71.xxxx.x
MDAC 2.8 RTM 2.80.xxxx.x[3]