ADO、ADO.net、DAO

本文详细介绍了ADO(ActiveX Data Object)和DAO(Data Access Object)这两种数据库访问接口的区别与联系。主要内容包括ADO作为统一数据访问层的发展历程及其提供的对象模型,DAO如何利用Microsoft Jet引擎访问数据库,以及两者在应用开发中的具体实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天参加CMMI访谈,在浏览一个项目的经验教训时,发现了ADO、DAO频繁出现,收集脑瓜里的信息,DAO算是想起来了,ADO半天没想起来,还是JAVA编程比较“傻瓜”式,一个JDBC搞定,呵哈。

从网络上找到对这两个的解释,总结汇总如下。

简介:

DAO(Data Acess Object)是基于Jet引擎的数据库访问接口,提供了一组API,类似于ODBC。  
ADO(ActiveX Data Object)是基于OLE DB的数据库访问接口,SQL知识不是必须的。

ADO

微软公司的ADO (ActiveX Data Object) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。

ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。

ADO包含一些顶层的对象:

连接,代表到数据库的连接
记录集,代表数据库记录的一个集合
命令,代表一个SQL命令
记录,代表数据的一个集合
流,代表数据的顺序集合
错误,代表数据库访问中产生的意外
字段,代表一个数据库字段
参数,代表一个SQL参数
属性,保存对象的信息
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。

ADO.net

在新的编程框架.NET Framework中, 微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。

ADO.NET为.NET构架提供了优化的数据访问模型,和基于COM的ADO是完全两样的数据访问方式。

1.ado.net遵循更通用的原则,不那么专门面向数据库。ado.net集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引,排序和视图)的数据容器对象。尽管ado.net是.net数据库应用程序的权威解决方案,但从总体设计上看,它不像ado数据模型那样以数据库为中心,这是ado.net的一大特点。
2.目前,ado.net提供了两种数据库访问类库:一种用于sql server 7.0 或更高版本,另一种用于其他所有您可能已经安装的ole db提供程序。在这两种情况下,您分别使用不同的类,但遵循相似的命名规则。除前缀,名称都是相同的。前一种情况前缀为sql,后一种情况则是oledb。同时,.net框架还提供了odbc .net的数据访问模式。odbc .net data provider是 .net 框架的增强组件,它可以访问原始的 odbc 驱动程序,就像 ole db .net data provider 可以访问原始的 ole db providers 一样。目前它仅在下列驱动程序中测试过:microsoft sql odbc driver,microsoft odbc driver for oracle,microsoft jet odbc driver。
3.ado.net提供了两个队形来处理从数据源中抽取数据,它们是dataset和datareader对象。前者是记录在内存中的缓存,您可以从任何方向随意访问和修改。后者是高度优化的对象,专为以仅向前方式滚动只读记录而设计。
4.ado.net统一了数据容器类编程接口,无论您打算编写何种应用程序,windows窗体,web窗体还是web服务,都可以通过同一组类来处理数据。不管在后端的数据源数sql server数据库,ole db,xml文件还是一个数组,您都可以通过相同的方法和属性来滚动和处理它们的内容。
5.在ado中,xml只不过是输入和输出格式。然而在ado.net中,xml是一种数据格式,提供了操作,组织,共享和传递数据的手段。


DAO

DAO(Database Access Object)使用Microsoft Jet数据库引擎来访问数据库。Microsoft Jet为象Access和Visual Basic这样的产品提供了数据引擎。

与ODBC一样,DAO提供了一组API供编程使用。MFC也提供了一组DAO类,封装了底层的API,从而大大简化了程序的开发。利用MFC的DAO类,用户可以编写独立于DBMS的应用程序。

DAO是从Visual C++4.0版开始引入的。一般地讲,DAO类提供了比ODBC类更广泛的支持。一方面,只要有ODBC驱动程序,使用Microsoft Jet的DAO就可以访问ODBC数据源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。


DAO和ODBC的相似之处

DAO类与ODBC类相比具有很多相似之处,这主要有下面几点:

二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。

DAO提供了与ODBC功能相似的MFC类。例如,DAO的CDaoDatabase类对应ODBC的CDatabase类,CDaoRecordset对应CRecordset,CDaoRecordView对应CRecordView,CDaoException对应CDBException。这些对应的类功能相似,它们的大部分成员函数都是相同的。

AppWizard和ClassWizard对使用DAO和ODBC对象的应用程序提供了类似的支持。

由于DAO和ODBC类的许多方面都比较相似,因此只要用户掌握了ODBC,就很容易学会使用DAO。实际上,用户可以很轻松地把数据库应用程序从ODBC移植到DAO。

Visual C++随盘提供了一个名为DaoEnrol的例子,该例实际上是Enroll的一个DAO版本。读者可以打开DaoEnrol工程看一看,它的源代码与Enroll的极为相似。读者可以按照建立Enroll的步骤来建立DaoEnrol,其中只有若干个地方有差别,这主要有以下几点:

选取的数据源不同。在用AppWizard创建DaoEnrol时,以及在用ClassWizard创建CDaoRecordset类的派生类时,在Database Options对话框中应该选择DAO而不是ODBC。而且DAO的数据源是通过选择一个.MDB文件来指定的,即点击“...”按钮后在文件对话框中选择要访问的.MDB文件。

记录集的缺省类型不同。ODBC记录集的缺省类型是快照(Snapshot),而DAO则是动态集(Dynaset)。

参数化的方式不同。DAO记录集的m_strFilter和m_strSort中的参数不是“?”号,而是一个有意义的参数名。例如,在下面的过滤器中有一个名为CourseIDParam的参数。
m_pSet->m_strFilter ="CourseID = CourseIDParam";
在DoFieldExchange函数中,有下面两行:
pFX->SetFieldType(CDaoFieldExchange::param);
DFX_Text(pFX, _T("CourseIDParam"), m_strCourseIDParam);
DFX函数的第二个参数也是CourseIDParam。

处理异常的方式不同。例如,在删除记录时,对异常的处理如下所示:

try

{

m_pSet->Delete();

}

catch(CDaoException* e)

{

AfxMessageBox(e->

m_pErrorInfo->m_strDescription);

e->Delete();

}

除了上述差别外,AppWizard和ClassWizard也隐藏了一些细微的不同之处,例如,DAO记录集是使用是DFX数据交换机制(DAO record field exchange)而不是RFX,在DAO记录集的DoFieldExchange中使用的是DFX函数而不是RFX函数。

DAO的特色

DAO可以通过ODBC驱动程序访问ODBC数据源。但DAO是基于Microsoft Jet引擎的,通过该引擎,DAO可以直接访问Access、FoxPro、dBASE、Paradox、Excel和Lotus WK等数据库。CDaoDatabase类可以直接与这些数据库进行连接,而不必在ODBC管理器中注册DSN。例如,下面的代码用来打开一个FoxPro数据库:

CDaoDatabase daoDb;

daoDb.Open( “”,FALSE,FALSE,"FoxPro 2.5;DATABASE=c://zyf");

CDaoDatabase::Open函数用来连接某个数据库,该函数的声明为:

virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
throw( CDaoException, CMemoryException );

ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。   在新的编程框架.NET Framework中, 微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。 ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性远程数据服务,支持“数据仓库”ActiveX 组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。   ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLE DB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLE DB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLE DB提供者(OLE DB provider)。目前,虽然OLE DB提供者比较少,但微软正积极推广该技术,并打算用OLE DB取代ODBC。   ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值