常用数据库访问接口
1 常见数据库访问接口
1.1 ODBC
ODBC:开放式数据库互连(Open Database Connectivity),是微软公司推出的一种实现应用程序和关系数据库之间通讯的方法标准,是一个接口标准。所以它实际上是一种标准,符合标准的数据库就可以通过SQL语言编写的命令对数据库进行操作,但只能针对关系数据库进行操作(如SQL Server,Oracle,Access,Excel等),目前所有的关系数据库都符合该标准。ODBC本质上是一组数据库访问API(应用程序编程接口),由一组函数调用组成,核心是SQL语句。
一个基于ODBC的应用程序对数据库进行操作时,用户直接将SQL语句传送给ODBC,同时ODBC对数据库的操作也不依赖任何DBMS,不直接与DBMS打交道,它将所有的数据库操作由对应的DBMS的ODBC驱动程序完成,由对应DBMS的ODBC驱动程序对DBMS进行操作。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的关系数据库。 具体见图1所示。
图1 ODBC组件图
在具体操作时,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
不过直接使用ODBC API比较麻烦,所以微软后来又发展出来DAO、RDO、ADO这些数据库接口,使用这些数据库接口开发程序更容易。这些接口都支持ODBC,所以即使你所访问的数据库没有提供ADO的驱动,只要有ODBC驱动一样可以使用ADO进行访问。但由图2可以看出,ODBC实际上是一种相当底层的访问技术,因此它可以从底层设置和控制数据库,完成一些高级数据库技术无法完成的功能。
图2 ODBC网络结构图
1.2 DAO
DAO:数据库访问对象(Database Access Object),所谓数据访问对象,顾名思义就是与数据库打交道,夹在业务逻辑层与数据资源层之间。是Microsoft一种用来访问Jet引擎的方法,主要适用于单系统应用程序或在小范围本地分布使用,访问所谓桌面数据库(如Access、FoxPro、dBase等)。DAO在设计时是专门用来处理MDB数据库的,由于其内部已经对Jet数据库的访问进行了加速优化,因此访问Access数据库时性能很好,也很方便,所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式。它也可以通过ODBC访问远程数据库,但效率较低,一般不采用这种方式。它是第一个面向对象的数据库访问接口。DAO可以访问非关系型数据库。DAO的网络结构图和对象层次图分别如图3和图4所示。
图3 DAO网络结构图
图4 DAO对象层次图
1.3 RDO
RDO:远程数据库对象(Remote Database Object)。为了弥补DAO访问远程数据库能力的不足,微软推出了RDO数据库访问接口,可以方便的用来访问远程数据库(网络数据库)。它封装了ODBC API的对象层,因此在访问ODBC兼容数据库时,具有比DAO更高的性能,而且比ODBC更易用。但同样由于这种和ODBC紧密的结合,使得它只能以ODBC的方式访问关系型数据库,同时也在访问Jet或ISAM数据库方面受到限制,而且无法访问非关系型数据库(?)。RDO提供了访问存储过程和复杂结果集的更多和更复杂的对象、属性以及方法,但它只是从DAO向ADO迈进的一个过度产品,在大多数情况下,ADO的性能都要优于它。RDO的网络结构图和对象层次图如图5和图6所示。
图5 RDO网络结构图
图6 RDO对象层次图
1.4 OLE DB
OLE DB:数据库链接和嵌入对象(Object Linking and Embedding DataBase)。OLE DB是微软提出的基于COM思想且面向对象的一种技术标准,目的是提供一种统一的数据访问接口访问各种数据源,这里所说的"数据"除了标准的关系型数据库中的数据之外,还包括邮件数据、Web上的文本或图形、目录服务(Directory Services)、以及主机系统中的文件和地理数据以及自定义业务对象等。OLE DB标准的核心内容就是要求对以上这些各种各样的数据存储(Data Store)都提供一种相同的访问接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。
OLE DB 标准的具体实现是通过一组C++ API 函数, 就像ODBC 标准中的ODBC API 一样, 不同之处只是在于OLE DB 的API 是符合COM 标准、 基于对象的。由于OLE DB可以访问各种类型的数据源,包括关系型数据库,所以说,符合ODBC 标准的数据源是符合OLE DB标准的数据源的子集。但是符合ODBC的数据源要能够被OLE DB访问,符合OLE DB标准,还必须提供相应的OLE DB服务提供程序,就像SQL Server要符合ODBC标准,必须提供SQL Server ODBC驱动程序一样。实际上,微软已经为所有的ODBC数据源提供了一个统一的OLE DB服务程序,叫做Microsoft OLE DB Provider for ODBC drivers。这个东西允许你通过OLE-DB或ADO 访问ODBC提供的所有功能。换言之,ODBC和OLEDB这两种技术是互补的,不能完全互相替换。但在访问SQL Server数据库时,不通过ODBC驱动,而是通过一个专门的OLE DB Provider for SQL Server直接调用,具体参见图7(?)。对于非关系型数据源,只要它提供相应的OLE DB访问接口,就可以同其他关系型数据源一样进行操作。
ODBC OLE DB Provider发布之后,有人又担心ODBC Provider是不是在ODBC之上的新的层次?如果是,那么使用OLE DB访问ODBC数据源是否将影响性能?答案也是否定的。实际上,ODBC Provider的作用是替换ODBC Driver Manager,作为应用程序与ODBC驱动程序之间的桥梁,理论上不会增加任何开销。具体参见图1所示。
1.5 ADO
ADO:(ActiveX Data Object)ActiveX数据对象。ADO是微软于1996年冬推出的一种面向对象的、基于COM思想的数据库访问接口。由于OLE DB标准的API是C++ API,只能供C++语言调用(这也是OLEDB没有改名为ActiveX DB的原因,ActiveX是与语言无关的组件技术)。为了使流行的各种编程语言都可以编写符合OLE DB标准的应用程序,微软在OLE DB API之上,提供了一种面向对象、与语言无关的应用编程接口,这就是ActiveX Data Objects,简称ADO。实质上,ADO就是将OLE DB的面向C++的复杂接口封装起来,提供了便于操作的接口。还可以说ADO其实只是一个应用程序层次的界面,它用OLE DB来与数据库通信,ADO为OLEDB提供高层应用API函数。具体见图7所示。
图7 ADO网络结构图
ADO是DAO和RDO的后继产品,它扩展了DAO和RDO所使用的对象模型,因为它包含
更少的对象,更多的属性、方法(和参数)以及事件。微软是打算用它来代替DAO和
RDO的,但实际上AOD 2.0与RDO更为相似,并不包含DAO的所有功能。在使用上一般
具有以下两种层次关系:应用程序 -> ADO -> OLE DB -> ODBC -> 数据源或者应
用程序 -> ADO -> OLE DB -> 数据源。ADO的对象层次图如图8所示。
![](http://119.img.pp.sohu.com/images/blog/2008/3/4/19/16/1191788256f.jpg)
图8 ADO对象层次图
2 数据库访问接口的发展历程
早期的程序员在程序中要连接数据库是非常困难的,每种DBMS产生的数据库文件的格式都不一样,程序员要对他们访问的DBMS的底层API有相当程度的了解,通过API来访问特定的DBMS。这就产生了一个问题,当使用的DBMS改变后,或者用户习惯使用的DBMS与开发程序使用DBMS的不符合时,应用软件便无法正常访问DBMS。因此,能处理各种数据文件的API便产生了,这就是大家都知道的ODBC。ODBC是通用API的早期产物,是基于结构查询语言 (sql) 的,以此作为访问数据的标准。这时大多数DBMS提供了面向ODBC的驱动程序,遵从了这个标准的DBMS被称为ODBC兼容的DBMS。ODBC兼容的数据库包括Access, MS-SQL Server, Oracle, Informix等。 但是ODBC并不完美,他虽然统一了对多种常用DBMS的访问,但是这个“访问”的过程是非常困难的,他仍然存在大量的低级调用,程序员必须将大量的精力放在底层的数据通信中,而不能专注于所要处理的数据。为了改善这种极其不友好的接口,使得在程序开发中,数据库访问的工作更加容易,微软提出里一个解决方案:DAO (Data Access Objects),DAO的代码看起来是这样的:
objItem.AddNew
objItem.Name = "StudentDB"
objItem.Price = 10
objItem.Update
这说明他的代码更易于掌握,因为它更像是一种面向对象的语言,建立想要使用对象后,可以给他的各种属性赋值,提取各种属性的值,或者使用该对象提供的方法。总之,DAO是第一个面向对象的接口。DAO 最适用于单系统应用程序或小范围本地分布使用。于是为了访问远程DBMS,更好地实现数据共享,或数据的交互操作,比如想要联接查询位于不同地方的主机中的两个数据表,这时产生了一个新的数据库访问接口:RDO(Remote Data Objects),远程数据对象。当然,RDO也是一个面向对象的接口。它同易于使用的 DAO style组合在一起,形式上展示出所有 ODBC 的底层功能和灵活性。RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。但是随着需求的发展,又引出了新的问题。ODBC和RDO数据库接口都需要数据以SQL(Structured Query Language)的格式存储,或者说,要求访问的数据文件都必须是关系类型的,也就是说产生这些文件的DBMS必须是关系数据库。而在平时,我们经常要处理一些非关系数据源,例如Excel电子表格,有规则或无规则的文本文件,XML文件等。针对这个问题,微软提出了OLEDB,一个基于COM标准的数据存取对象。他能提供对所有数据类型的操作,甚至是没有规则的文本文件。
可能是由于两个原因,产生了ADO----微软最新的数据库接口。这两个原因是:1,为了大幅减少数据库访问工作量,提供一个更易于操作,更友好的接口。因为ADO是基于OLEDB的技术,他将OLEDB的功能封装,对用户透明。2,为了整合各种功能于一身,因为ADO是DAO和RDO的后继产物。包含在 DAO 和 RDO 模型中的许多功能被合并为单个对象,这样就生成了一个简单得多的对象模型。ADO “扩展”了 DAO 和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。
另外还有一种数据访问接口ADO.NET。它与ADO的数据访问方式在思想上是没有继承关系的,ADO是基于COM思想,而ADO.NET是基于.NET框架体系,主要用于基于WEB的应用程序,善于处理XML类型的数据。
由以上论述可以看出:ODBC和OLEDB是底层的数据库接口,他们通过驱动程序访问数据文件,而DAO,RDO,ADO是上层数据库接口,他们向上与应用程序交互,向下与ODBC或OLEDB对话。另外,DAO也可以通过JET引擎访问数据文件。ADO是对OLEDB的封装。
3 常见数据库访问接口的比较
3.1 ODBC与DAO
ODBC类只支持DML(Data Manipulation Language,数据操作语言),不支持DDL,所以用ODBC类只能完成数据的操作,不能涉及数据库的结构。支持DDL是DAO对数据库编程良好支持的一个重要体现。DDL(Data Definition Language)在SQL术语中叫做"数据定义语言",它用来完成生成、修改和删除数据库结构的操作。只要有ODBC驱动程序,DAO就可以访问ODBC数据源。二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。另外,DAO可以用Jet引擎访问两类数据库而无需通过ODBC驱动,一是*.MDB数据库,Microsoft Access 就是这类数据库,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。二是ISAM数据库,包括Btrieve、dBASEIII、dBASEIV、Microsoft FoxPro。
但DAO是针对VB/Access设计的,它所支持的数据库类型就是VB的那几种,很少见第三方驱动程序。ODBC是开放的数据库接口,几乎支持所有数据库类型,对于很多VB不能很好地支持的数据库类型,如Visual FoxPro 5.0,都可以使用ODBC驱动。一般来说DAO支持本机Access数据库比较理想,但在客户/服务器体系上不如ODBC功能强大。
3.2 DAO、RDO与ADO
ADO在编程难易程度方面比DAO和RDO都好 (主要得益于简单的对象模型),但是在利用数据库的特性方面与RDO不相上下,但是ADO新版本的性能会比RDO更强。与DAO,RDO模型的层次结构不同,ADO 基本上是一种平板结构:Command 和Recordset 与Connection 之间并没有上下层次关系。换一种说法,DAO或RDO在定义Recordset对象时,必须先定义Connection对象,而ADO则可以不通过Connection而直接定义Recordset对象。ADO是DAO和RDO的后继产物,但是ADO目前还没有包含DAO的所有功能,目前的ADO并不支持数据定义语言(DDL),而我们已经知道DAO是支持DDL的。最终Microsoft承诺将提供一个ADO DDL 部件来帮助进行DAO到ADO的移植,并为OLE DB供应商提供一般的DDL支持。微软已公开表示,今后的微软产品数据访问的接口方面,将统一到OLE DB和ADO 标准上来。
3.3 ADO与ADO.NET
ADO使用OLE DB接口并基于微软的COM技术,而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。这也就是说ADO.NET和ADO的数据访问方式是不同的。在ADO 中,数据的内存中表示形式为记录集Recordset,而在 ADO.NET 中,数据在内存中的形式为数据集Dataset。记录集看起来像单个表,如果要获得几个表的相关数据,必须使用JOIN查询。相反,数据集是一个或多个表的集合。这样,数据集可以模仿基础数据库的结构。ADO 的运作是一种在线方式,他对数据的操作必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线。优点是效率高,在Web上,有上千个并行用户,系统资源是非常昂贵的。
图9 常用数据库访问接口比较图
区分你的程序是DAO、RDO,还是ADO的,可以看看打开数据库的方式。DAO使用OpenDatabase方法,RDO使用OpenConnection方法,而ADO一般通过一个ConnectionString来确定数据库的类型和位置。