DAO、RDO、ADO、OLE DB 、ODBC and JDB
:ADO、DAO、RDO、ODBC、OLEDB、JDBC、BDE、数据库访问技术
摘自:http://topic.csdn.net/t/20010806/17/226006.html先解释一下这几个名词先:
ADO---Active Data Objects,活动数据对象
DAO---Data Access Objects,数据访问对象
RDO---Remote Data Objects,远程数据对象
ODBC---Open Database Connectivity,开放式数据库连接性
DSN---Data Source Name,数据源名
BDE---Borland Database Engine,Borland数据库引擎
JET---Joint EngineTechnology,数据连接性引擎技术
OLEDB---Objects Link Embed DataBase对象链接嵌入数据库
ado的效率不是最佳,但是使用极为方便,而且通过压缩传输recrodset然后使用updatebatch功能极大的降低了网络的负载。这是我坚持使用ADO的原因。同时ADO支持将recordset用XML的方式储存、读取(读取需通过Stream对象),对于通过HTTP协议传输recordset极为方便。只需100行左右的代码就可以实现基于HTTP的recordset的远程传输。
RDO和DAO微软已经放弃,我就不多说了。但是必须承认,连接SQL Server的时候RDO的效率超过ADO。
ODBC作为一个标准,地位正在受到OLEDB的挑战。OLEDB的可扩展性和与ADO完美的结合使得我们可以访问任意位置的数据,从SQL Server、DB2、informix标准DBMS到EXCEL,outlook通讯簿,AD等等非传统的数据系统,而且OLEDB的SDK可以从MS站点免费下载,使用VC既可开发(VB的数据模块基于OLE Provider,功能上也类似,但是不能算真正的OLE Provider)。但是作为一个跨平台的标准,由于有IBM的支持,在unix品台商ODBC仍然是最大的赢家。
BDE,JDBC没有用过
1、ODBC
1992年Microsoft和Sybase、Digital共同制定了ODBC标准接口,以单一的ODBC
API 来存取各种不同的数据库。随后ODBC便获得了许多数据库厂商和Third-Party的支持而逐渐成为标准的数据存取技术。
ODBC以当时的业界标准规范X/Open Call-Level
Interface(CLI)和ISO/IEC9075-3 Call-Level
Interface(SQL/CLI)为涵盖的范围,因而支持了广阔的数据库。
虽然ODBC在初期的版本中执行效率不佳,而且功能有限,因此也为人们所贬低。但是,随着Micr osoft不断地改善ODBC,使ODBC的执行效率不断增加,ODBC驱动程序的功能也日渐齐全。到目前,ODBC已经是一个稳定并且执行效率良好的数据存取引擎。
不过ODBC仅支持关系数据库,以及传统的数据库数据类型,并且只以C/C++语言API 形式提供服务,因而无法符合日渐复杂的数据存取应用,也无法让脚本语言使用。因此Microsoft除了ODBC 之外,也推出了其他的数据存取技术以满足程序员不同的需要。
2. DAO
1993年Microsoft为了让程序员能够存取Access数据库,使用OLE
Automation技术封装了Jet Engine 。这些使用Jet Engine 存取Access数据库的OLE Automation Object便称为Data Access Object(DAO)。
DAO能够存取xBase的数据库以及Excel文件,并且能够结合ODBC存取关系数据库。但是DAO毕竟主要的设计目的是存取Access数据库,因此DAO在存取Access数据库时非常有效率,但是在存取其他的数据源时却表现得不怎么好。目前DAO已经慢慢接近维护的状态,因此建议各位尽量不要在新的项目中使用DAO。
3. RDO
由于DAO在结合ODBC存取关系数据库时表现得并不好,因此在1995年Microsoft同样以OLE Automation 技术直接封装ODBC API ,让程序员能够存取关系数据库。这种数据存取技术便称为Remote Data
Object(RDO)。
Microsoft之所以推出RDO,是因为ODBC API 是非常复杂的API,许多程序员无法直接使用ODBC API 来开发应用程序,因此Microsoft以简化的RDO对象让程序员能够较为简单存取数据。此外,通过RDO,VB和脚本语言也能够存取各种关系数据库。不过目前RDO也已经逐渐地被放弃了,因此建议各位也不要在新的项目中使用RDO,毕竟RDO只能算是一个过渡性质的数据存取解决方案。
4. OLE-DB
随着数据源日益复杂化,现今的应用程序很可能需要从不同的数据源取得数据,加以处理,再把处理过的数据输出到另外一个数据源中。更麻烦的是这些数据源可能不是传统的关系数据库,而可能是Excel文件,Email或Internet/Intranet上的电子签名信息。Microsoft为了让应用程序能够以统一的方式存取各种不同的数据源,在1997年提出了Universal Data Access(UDA)架构。UDA以COM技术为核心,协助程序员存取企业中各类不同的数据源。
UDA以OLE-DB(属于操作系统层次的软件)做为技术的骨架。OLE-DB定义了统一的COM接口做为存取各类异质数据源的标准,并且封装在一组COM对象之中。藉由OLE-DB,程序员就可以使用一致的方式来存取各种数据。
5. ADO
虽然OLE-DB允许程序员存取各类数据,是一个非常良好的架构,但是由于OLE-DB太底层化,而且在使用上非常复杂,需要程序员拥有高超的技巧,因此只有少数的程序员才有办法使用OLE-DB。这让OLE-DB无法广为流行。为了解决这个问题,并且让VB和脚本语言也能够藉由OLE-DB存取各种数据源,Microsoft同样以COM技术封装OLE-DB为ADO对象,简化了程序员数据存取的工作。由于
ADO成功地封装了OLE-DB大部分的功能,并且大量简化了数据存取工作,因此ADO也逐渐被愈来愈多的程序员所接受。
6. ADO 的架构
ADO主要是让应用程序或Web 应用程序存取各种不同的数据源。ADO封装了OLE-DB复杂的接口,以极为简单的COM接口存取数据。ADO能够藉由OLE-DB存取传统的关系数据库,或Flat-File类型的数据库;也可以存取非传统的数据,例如文字、Email、声音、图形、影像等。更可以通过OLE-DB,藉由Connector来存取大型的数据源,例如CICS等。但是不管应用程序要存取哪一种数据源,应用程序都只需要使用ADO,而不需要使用各种不同的复杂API来存取不同的数据,这样就可以大大简化应用程序员的工作。
1.DAO 数据访问对象(DAO)方式是允许程序员操纵Microsoft Jet数据库引擎的第一个面向对象的接口。Jet数据库引擎是一种用来访问MicrosoftAccess表和其它数据源的记录和字段的技术。对于单一系统的数据库应用程序来说,DAO依然很受欢迎并且非常有效;在中等规模工作组的网络中,DAO也有少量的应用。
2.RDO 远程数据对象(RDO)方式是提供给开放数据库互连(ODBC)数据源的面向对象的接口。RDO是开发Microsoft SQL Server、Oracle、和其它大型关系数据库应用程序的绝大多数数据库开发者使用的对象模型。
3.ADO ActiveX数据对象(ADO)方式是DAO和RDO方式的继承者,它也有一个类似的对象模式。在ADO方式中,可编程对象展示了你的计算机上所有可获取的本地和远程数据源。
--------------------------------------------------------------------------------------------------------------------------------------------
:OLE DB,
一、
ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open
Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
二、
OLE DB(OLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化问题语言(SQL)能力,还具有面向其他非SQL数据类型的通路。 作为微软的组件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLD DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。使用OLE DB的应用程序会用到如下的请求序列: 初始化OLE 连接到数据源 发出命令 处理结果 释放数据源对象并停止初始化OLE
OLE DB标准中定义的新概念----OLE DB将传统的数据库系统划分为多个逻辑组件,这些组件之间相对独立又相互通信。这种组件模型中的各个部分被冠以不同的名称:数据提供者(Data Provider)。 提供数据存储的软件组件,小到普通的文本文件、大到主机上的复杂数据库,或者电子邮件存储,都是数据提供者的例子。有的文档把这些软件组件的开发商也称为数据提供者。
我们要开启如Access 数据库中的数据,必须用ADO.NET 透过OLE DB 来开启。ADO.NET 利用OLE DB 来取得数据,这是因为OLE DB 了解如何和许多种数据源作沟通,所以对OLE DB有相当程度的了解是很重要的。
三、
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote
Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。
--------------------------------------------------------------------------------------------------------------------------------------------
:什么是OLE DB,ODBC,DAO,RDO,ADO,DB-Library,都有什么区别
1.DB-Library 是SQL SERVER提供的一系列的操作数据库的函数库,是C的,用过,其他的是接口,
2.ADO是指ActiveX Data Objects。ADO是VB6推荐操作数据库的方式
3.
ODBC最先出来,是用来连接oracle、sql server、access等数据库的一种接口标准(后来随着各厂商的扩充,也就都不标准了),各数据库提供实现ODBC的“驱动程序”
OLE DB是微软“发明”的,用来淘汰ODBC的,OLE DB不光可以连接各种数据库,还可以连接exchange、活动目录、甚至操作系统文件目录等各种数据库源(也需要分别使用不同的“驱动程序”)
ADO也是微软的,是用来淘汰早起微软的RDO、DAO的(ADO可以做RDO、DAO能做的所有事),ADO在上层,通过下面的ODBC或者OLE DB来访问数据源(注意不是数据库,因为可访问范围包括活动目录等各种数据)。不过微软目前的ODBC实际是通过OLE DB访问数据源的。
层次关系:
应用程序 -> ADO -> ODBC -> OLE DB -> 数据源
或者
应用程序 -> ADO -> OLE DB -> 数据源
4.ODBC的本意是“ODBC的最大优点是能以统一的方式处理所有的数据库”,其实都是扯淡,因为各数据库对标准SQL都做了大量的扩充,除非你只使用标准的SQL,不然“统一”根本太不上。
5.其实这些都东西可以理解为是和驱动差不多.
--------------------------------------------------------------------------------------------------------------------------------------------
: DAO、RDO、ADO、OLE DB 、ODBC and JDBC relation
1.DAO: Data Access Object 数据访问对象
1993年Microsoft为了让程序员能够存取Access数据库,使用OLE Automation技术封装了Jet Engine 。这些使用Jet Engine 存取Access数据库的OLE Automation Object便称为Data Access Object(DAO)。
是微软的VB3.0中提供的数据访问技术,它允许访问和处理本地数据库,象access,缺点是不能访问远程数据库。因此DAO在存取Access数据库时非常有效率,但是在存取其他的数据源时却表现得不怎么好。DAO是Microsoft一种用来访问Jet引擎的方法,主要用来访问Access数据库,使用起来比较简单。
于是乎微软在vb4.0中提供了RDO远程数据访问技术,它可以有效的访问象oracle&sql server这样的远程数据库,但也有问题就是它对本地数据库访问效果很差,所以在vb6.0中才出现了ADO,综合了前两个版本的优点,支持对关系和非关系数据库的访问,也支持访问其他的数据源,如:电子表格、email等。
2. RDO(Remote Data Objects,远程数据对象)
是微软的一个应用程序接口 (application program interface, API) ,让写Windows应用程序的程序师能够进入微软和其他的数据库供给者的数据库。然后,程序中 RDO 陈述使用微软的底层数据存取对象 (DAO) 来实际进入数据库。 数据库供给者写入 DAO接口。 RDO 已经发展到微软为新的程序推荐的程序接口--- ActiveX 数据对象。 ADO也提供进入非关系数据库的接口而且比较容易使用。
RDO (Remote Data Objects) 远程数据对象是一个到 ODBC的、面向对象的数据访问接口,它同易于使用的 DAO style组合在一起,提供了一个接口,形式上展示出所有 ODBC 的底层功能和灵活性。尽管 RDO 在很好地访问 Jet 或 ISAM 数据库方面受到限制,而且它只能通过现存的 ODBC 驱动程序来访问关系数据库。但是,RDO 已被证明是许多 SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO 提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。
RDO(Remote Data Objects)处理一组对象以完成远程资料的存取,它是在ODBC API和驱动程序之上的一个可程序的薄层(thin code layer),用以建立资料结果集(result set)和光标,以及用最小的工作站资源执行复杂的程序。
注意RDO只能在32位的操作系统上执行
3.ADO (ActiveX Data Objects,ActiveX数据对象)
是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据
由于OLE DB位于底层,只能由C++这样的OO语言直接实现,而不能用VB这样的高层
ADO是一种基于COM的数据库访问技术,可以访问关系数据库与非关系数据库,由于它是基于COM的,访问速度也较快,占用资源较小。
发展历程看是:dao--rdo--ado,dao主要是为单机环境准备其中的一些概念很好理解,这也是它比较容易使用的原因。
RDO是专门为网络环境开发的一组对象,是基于odbc的一组接口,使用起来只能用于结构型数据库。而ADO是ACTIVEX数据对象,基于OLE DB的编程接口,而且能支持结构型数据库和非结构型数据库,而且微软将来的. NET平台的数据库也是基于OLE DB和ADO的,所以ADO有很强的适用性
ADO 对象总结
对象 |
说明 |
Command |
Command 对象定义了将对数据源执行的指定命令。 |
Connection |
代表打开的、与数据源的连接。 |
DataControl (RDS) |
将数据查询 Recordset 绑定到一个或多个控件上(例如,文本框、网格控件或组合框),以便在 Web 页上显示 ADOR.Recordset 数据。 |
DataFactory (RDS Server) |
实现对客户端应用程序的指定数据源进行读/写数据访问的方法。 |
DataSpace (RDS) |
创建客户端代理以便自定义位于中间层的业务对象。 |
Error |
包含与单个操作(涉及提供者)有关的数据访问错误的详细信息。 |
Field |
代表使用普通数据类型的数据的列。 |
Parameter |
代表与基于参数化查询或存储过程的 Command 对象相关联的参数或自变量。 |
Property |
代表由提供者定义的 ADO 对象的动态特性。 |
RecordSet |
代表来自基本表或命令执行结果的记录的全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。 |
ADO 事件
ActiveX 数据对象 (ADO) 是添加到 Microsoft Active Server Pages
(ASP) 的一套高级别接口,有利于服务器端与数据库的连接。ADO 与低级别接口 (OLE DB) 一起使用则有利于 Microsoft Universal Data Access 策略。ADO 2.0 版可生成 Visual Studio Analyzer 事件。可使用这些事件跟踪分布式应用程序中的 ADO 交互。
ADO 生成的 Visual Studio Analyzer 事件
事件 |
事件描述 |
事件数据 |
ConnectionClose |
指示 ADO 要与 OLE DB 数据源断开连接。 |
无。 |
ConnectionOpen |
指示 ADO 正在连接到 OLE DB 数据源。 |
如果客户端提供,则为连接到数据源所用的连接字符串。 |
Find |
指示 ADO 客户端已调用 ADO Recordset.Find 函数。 |
“查找”操作的判据;根据该判据匹配记录。 |
GetRows |
指示 ADO 客户端已调用 ADO Recordset.GetRows 函数。 |
提取的行数。 |
QueryResult |
指示数据库已返回响应查询的结果集。 |
无。 |
QuerySend |
指示 ADO 正在执行命令。该事件可由下列函数触发: Connection.Execute |
构成查询的 SQL 语句。 |
RecordsetOpen |
指示 ADO 正在打开远程服务器上的记录集。仅适用于三层方案。 |
打开记录集的源(通常为行返回的命令文本)。 |
Sort |
指示 ADO 准备筛选或对数据排序。 |
排序或筛选应用于记录集数据的判据。 |
Transaction Rollback |
指示 ADO 要中止当前本地事务。 |
返回真或假。如果为真,则保持中止,即该事务中止后紧跟着开始另一事务。如果为假,则不保持中止。 |
TransactionCommit |
指示 ADO 正在提交 OLE DB 提供程序上的本地事务。 |
返回真或假。如果为真,则保留提交,即该事务提交后紧跟着开始另一事务。如果为假,则不保留提交。 |
TransactionStart |
指示 ADO 正在开始 OLE DB 提供程序上的本地事务。 |
ADO 开始事务所基于的隔离级别。隔离级别指示可看到其他事务所做更改的哪一级别。 |
UpdateBatch |
指示 ADO 正在向提供程序发送更新批处理。仅适用于三层方案。 |
如果有,为 ADO 将更新发送到的远程服务器名。 |
4.ODBC(Open Database Connectivity,开放数据库互连)
它定义了一个标准的方法来实现应用程序和数据库之间的通讯,它实际上是通过一组系统API来实现的。实际上起到了对sql语句的翻译作用,使之可以在不同的数据库上运行。
ODBC是Microsoft的基于关系数据库一种互连技术,它只能访问关系数据库。
全称为开放式数据库互联,它定义了一个标准的方法来实现应用程序和数据库之间的通讯,它实际上是通过一组系统API来实现的。实际上起到了对sql语句的翻译作用,使之可以在不同的数据库上运行。
ODBC是Microsoft的基于关系数据库一种互连技术,它只能访问关系数据库。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
5.OLE DB(Objects Link Embed DataBase对象链接嵌入数据库)
它是一种数据库结构,它可以使程序具有对存储于不同信息源的数据的一致访问。说白了就是能用select * from table这样的语句来访问不同类型的数据库,如access,sql server。
OLE DB是微软“发明”的,用来淘汰ODBC的,OLE DB不光可以连接各种数据库,还可以连接exchange、活动目录、甚至操作系统文件目录等各种数据库源.
层次关系:
应用程序 -> ADO -> ODBC -> OLE DB -> 数据源
或者
应用程序 -> ADO -> OLE DB -> 数据源
6.JDBC(Java Data Base Connectivity,java数据库连接)
它是专门针对java的一种数据库访问技术,可以实现java对不同数据源的一致性访问。全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库。我们先来看看第一种JDBC<-->ODBC访问的流程:JDBC Driver Mannager->局部JDBC驱动->客户端数据库->数据库服务器->返回查询结果,这种访问事实上是转换JDBC调用为相应的数据库(Oracle, Sybase, Informix, DB2, 和其他的数据库数据库管理系统)的客户端API调用(说简单点就好像ASP不是通过DSN对数据库访问而是通过OLEDB访问)。
JDBC的最大特点是它独立于具体的关系数据库。与ODBC (Open Database Connectivity)类似, JDBC API 中定义了一些Java类分别用来表示与数据库的连接(connections), SQL语句(SQL statements), 结果集(result sets)以及其它的数据库对象, 使得Java程序能方便地与数据库交互并处理所得的结果。使用JDBC, 所有Java程序(包括Java applications , applets和servlet)都能通过SQL语句或存储在数据库中的过程(stored procedures)来存取数据库。
要通过JDBC来存取某一特定的数据库,必须有相应的JDBC driver,它往往是由生产数据库的厂家提供,是连接JDBC API与具体数据库之间的桥梁。
通常,Java程序首先使用JDBC API来与JDBC Driver Manager交互,由JDBC Driver Manager载入指定的JDBC drivers, 以后就可以通过JDBC API来存取数据库。
JDBC driver 是用于特定数据库的一套实施了JDBC接口的类集。共有四种类型的JDBC driver:
类型1的driver称为"JDBC-ODBC bridge driver", 这种类型的driver能使客户端通过JDBC调用连接到一个使用ODBC driver的数据库。使用这类driver需要每个客户端机器都装上数据库对应的ODBC driver,但该ODBC driver不一定要跟Java兼容。
类型2的driver将JDBC调用转换为特定的数据库调用。这类driver通常称为"native-API, partly Java driver"。与类型1的driver一样,这类driver也要求客户端的机器安装相应的二进制代码。所以这类driver不太适合于使用数据库的Applet。
类型3的driver称为 "JDBC-Net pure Java driver", 它能将JDBC的调用转换为独立于数据库的网络协议。这种类型的driver特别适合于具有中间件(middle tier)的分布式应用,但目前这类driver的产品不多。
类型4的driver, 又称 "native protocol, pure Java driver",它能将JDBC调用转换为数据库直接使用的网络协议。类型4的driver不需要安装客户端软件,它是100%的Java程序,使用Java sockets来连接数据库,所以它特别适合于通过网络使用后台数据库的Applet。
JDBC 的用途
简单地说,JDBC 可做三件事:与数据库建立连接、发送 SQL 语句并处理结果。下列代码段给出了以上三步的基本示例:
Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login",
"password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}
上述代码对基于JDBC的数据库访问做了经典的总结,当然,在本小节的后续部分会对它做详尽的分析讲解。
补充:
DSN---Data Source Name,数据源名
BDE---Borland Database Engine,Borland数据库引擎
JET--- Joint EngineTechnology,数据连接性引擎技术