什么是DAO Database Access Object

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文件)时具有很好的性能。

10.8.2 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函数。

10.8.3 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 );

 

  参数bExclusive如果为TRUE,则函数以独占方式打开数据库,否则就用共享方
式。如果bReadOnly为TRUE,那么就以只读方式打开数据库。如果要打开一个
Access数据库,则可以在lpszName参数中指定MDB文件名。如果要访问非Access数
据库,则应使该参数为“”,并在lpszConnect中说明一个连接字符串。连接字符
串的形式一般为 “数据库类型;DATABASE=路径(文件)”,例如 “dBASE III;
DATABASE=c:\\MYDIR”

  Open函数也可以打开一个ODBC数据源,但这需要相应的ODBC驱动程序,并需要
在ODBC管理器中注册DSN。此时lpszConnect的形式为 “ODBC;DSN=MyDataSource”
。显然,用DAO访问象FoxPro这样的数据库时,直接打开比把它当作ODBC数据源打
开要省事。

  支持DDL是DAO对数据库编程良好支持的一个重要体现。DDL(Data 
Definition Language)在SQL术语中叫做“数据定义语言”,它用来完成生成、修
改和删除数据库结构的操作。ODBC类只支持DML(Data Manipulation Language,数
据操作语言),不支持DDL,所以用ODBC类只能完成数据的操作,不能涉及数据库的
结构。要执行DDL操作,只有通过ODBC API。而DAO类同时提供了对DML和DDL的支持
,这意味着程序可以使用DAO类方便的创建数据库及修改数据库的结构。

  与ODBC相比,DAO提供了一些新类来加强其功能,这些新类包括:

CDaoTableDef类提供了对表的结构的定义。调用CDaoTableDef::Open可以获得表的
结构定义。调用CDaoTableDef::Create可以创建一张新表,调用CDaoTableDef:: 
CreateField可为表添加字段,调用CDaoTableDef::CreateIndex可以为表添加索引
。调用CDaoTableDef::Append可以把新创建的表保存到数据库中。

CDaoQueryDef类代表一个查询定义(Query definition),该定义可以被存储到数据
库中。

CDaoWorkspace提供了数据工作区(Workspace)。一个工作区可以包含几个数据库,
工作区可以对所属的数据库进行全体或单独的事务处理,工作区也负责数据库的安
全性。如果需要,程序可以打开多个工作区。

  DAO的另一个重要特色在于它对Access数据库提供了强大的支持。由于DAO是基
于Microsoft Jet引擎的,所以DAO肯定要在Access数据库上多作一些文章。例如,
调用CDaoDatabase::Create可以直接建立一个MDB文件,代码如下所示:
m_db.Create(“C:\\MYDIR\\MYDB.MDB”);

利用AppWizard和ClassWizard,用户可以方便地开发出性能优良的基于DAO的
Access数据库应用程序。

10.8.4 ODBC还是DAO

由于DAO可以访问ODBC数据源,下面几条可以作为DAO替代ODBC的理由:

在某些情况下可以获得更好的性能,特别是在访问Microsoft Jet(.MDB)数据库
时。

与ODBC兼容

DAO允许数据有效检查

DAO允许用户说明表与表之间的关系

  当然,DAO的出现并不意味着ODBC已经过时了。如果用户的工作必须严格限于
ODBC数据源,尤其是在开发Client/Server结构的应用程序时,用ODBC有较好的性
能。

(0)

相关推荐

  • 什么是DAO Database Access Object

    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类更广 泛的支持.一

  • Spring中数据访问对象Data Access Object的介绍

    在Spring中,DAO是Data Access Object的简称,即,数据访问对象. 它的名称虽然叫对象,但其实DAO是接口.这个名称很好的描述了DAO在程序中的角色.DAO的作用在于提供一种手段,来读取和写入数据库,他们应该通过接口的方式来提供这种功能,让程序的其他部分可以访问他们,而不必与特定的读取和写入数据库的实现方式进行绑定. 在程序中,与DAO相关的类的关系一般如下图所示. 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们

  • Python实现的登录验证系统完整案例【基于搭建的MVC框架】

    本文实例讲述了Python实现的登录验证系统.分享给大家供大家参考,具体如下: 小型登录注册验证系统 一.概述 ​ 使用Redis+MySQL数据库实现一个小型的登录注册验证系统.在这个系统中初步了解认识MVC框架. ​ 具备功能:登录.注册.改密.注销. ​ 数据库:Redis,MySQL.使用Redis把用户信息存储在内存中,查询数据快.MySQL存储空间更大,对表之间的关系管理更好.两者结合使用发挥各自的优势已是当下流行的数据库使用方式. ​ 开发语言:Python. ​ MVC框架:MV

  • 基于java中的PO VO DAO BO POJO(详解)

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的ava对象. 最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合PO中应该不包含任何对数据库的操作. 二.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象可以和表对应也可以不这根据业务的需要 三.DAO:data access object 数据访问对象,此对象用于访问数据库.通常和PO结合使用,DAO中包含了各种

  • Java之dao模式详解及代码示例

    什么是dao模式? DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作.在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中.用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法.在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储.DAO模式实

  • java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解

    O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在 O/R Mapping 的世界里,有两个基本的也是重要的东东需要了解,即 VO , PO . VO ,值对象 (Value Object) , PO ,持久对象 (Persisent Object) ,它们是由一组属性和属性的 get 和 set 方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来看是完全不同的.

  • springBoot controller,service,dao,mapper,model层的作用说明

    目录 零.业务逻辑 一.Dao(Data Access Object):数据存储对象 二.Service:服务 三.Controller:控制器 四.model:模型 五.View层 六.它们之间的关系 DAO层.Service层和Controller层的区别 1.dao层:数据访问层 2.service层:服务层 3.controller层 关系 零.业务逻辑 Controller-->service接口-->serviceImpl-->dao接口-->daoImpl-->

  • 详解Java基础知识——JDBC

    JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接口,然后不同数据库厂商去实现这个接口,到底底层如何去实现,不同的数据库不一样,不同的数据库厂商需要提供接口实现类(驱动类.驱动程序 Driver.驱动) 我们连接不同的数据库,我们只需要使用不同的驱动即可. J:Java:提供访问数据库的规范(接口), DBC:接口的实现,厂商去实现这个接口. JD

  • 手把手带你实现第一个Mybatis程序

    目录 环境说明: 学习前需要掌握: 什么是MyBatis? 持久化 持久层 为什么需要Mybatis? MyBatis第一个程序 搭建实验数据库 导入MyBatis相关 jar 包 编写MyBatis核心配置文件 编写MyBatis工具类 创建实体类 User实体类 编写Mapper接口类 编写Mapper.xml配置文件 编写测试类 Maven静态资源过滤 总结 环境说明: jdk 13MySQL 8.0.22maven 3.8.1开发工具:IDEA 学习前需要掌握: JDBCMySQLJav

  • Mysql实战练习之简单图书管理系统

    目录 一.梳理功能 二.准备数据库 三.构造和数据库相关的实体类 书籍 用户 NormalUser类 四.封装数据库相关操作 数据库链接操作 针对书籍表操作 针对用户表的操作 编写主逻辑(main方法和login方法) 编写operation各种细节 添加书籍操作 借书操作 删除书籍操作 查看书籍列表操作 退出系统操作 查找书籍操作 还书操作 一.梳理功能 1.能够表示书籍信息,针对每本书来说,序号,书名,作者,价格,类型. 2.能够表示用户信息,普通用户,管理员. 3.支持的操作: 对于普通用

随机推荐