1 DAO简介
DAO(数据访问对象)是一种应用程序编程接口(API),存在于微软的Visual Basic中,它允许程序员请求对微软的Access数据库的访问。DAO是微软的第一个面向对象的数据库接口。DAO对象封闭了Access的Jet函数。通过Jet函数,它还可以访问其他的结构化查询语言(SQL)数据库。在VC中,它是从Visual C++4.0版开始引入的。
2 DAO和ODBC的比较
2.1 相似点
MFC的DAO类和ODBC类有很多相似之处,主要有两点:
1) 都支持对各种ODBC数据源的访问。
2) 提供了功能相似的MFC类。例如DAO的CDaoDatabase类对应于ODBC的CDatabase类,DAO的CDaoRecordset类对应于ODBC的CRecordset类等。这些类所提供的程序函数大部分也相同。
2.2 不同点
尽管两者非常相似,但访问数据库的机制完全不同。ODBC的工作依赖于数据库制造商提供的驱动程序,而DAO直接利用Microsoft Jet引擎提供的数据库访问对象集进行工作。
3 DAO主要类
CDaoDatabase、CDaoRecordset、 CDaoTableDefInfo、CDaoFieldInfo、COleVariant 是使用MFC进行DAO编程的最基本和最常用的类。
使用MFC进行DAO编程,首先要为每一个打开的数据库文件提供一个数据库对象──CDaoDatabase,由这个对象管理数据库的连接。然生成记录集对象──CDaoRecordset,通过它来进行查询、操作、更新等等的工作。如果需要在程序中管理数据库的结构,则需要使用DAO当中的表结构信息对象CDaoTableInfo及字段定义对象 CDaoFieldInfo来进行获得或者改变数据库表结构的工作。
3.1 CDaoDatabase
类CDaoDatabase代表了一个数据库连接。使用它可以操纵数据库中的数据。在一个给定工作区(由CDaoWorspace对象代表)中,同时可以有多个活动的CDaoDatabase对象。工作区维护了一组开放数据库对象——数据库连接。
MFC DAO数据库类与那些基于ODBC的MFC数据库类是不同的。所有的DAO数据库类的名字都有CDao前缀。类CDaoDatabase提供了一个类似于ODBC类CDabase的接口。二者主要的不同在于:CDatabse是通过ODBC和ODBC驱动程序存取数据库的,而CDaoDatabase则是通过数据存取对象(Data Acess Object,DAO)存取数据库的。DAO基于Microsoft Jet数据库引擎。一般说来,基于DAO的MFC类比基于ODBC的类处理能力更强。基于DAO的类可以通过ODBC驱动也可以经由自己的数据库引擎存取数据。基于DAO的类也支持数据定义操作(DDL),比如不用直接调用DAO而通过类建立表。
建立一个新的Microft Jet数据库(.MDB),要构造一个CDaoDatabase对象并且调用它的成员函数Create。 在调用Create之后不要再调用Open。打开一个现有的数据库,要构造一个CDaoDatabase对象并且调用它的成员函数Open。上面的这些方法都把DAO数据库对象添加到工作区的Databases集合中,并在数据上建立一个连接。以后需要构造CDaoRecordset,CDaoTableDef或CDaoQueryDef来操纵连接上的数据库,要向它们的构造函数传送CDaoDatabase对象的指针。使用完连接之后,要调用成员函数Close并撤消CDaoDatabase对象。Close会关闭所有没有关闭的记录集。
3.2 CDaoRecordset
一个CDaoRecordset对象表示从数据源中选择的一组记录。作为“记录集”,CDaoRecordset对象在以下三种窗体中有效:
3.2.1 表型记录集表示一个基本表,可以用它从单个数据库表中检查、添加、改变或删除记录。
3.2.2 动态集型记录是一个查询的结果,可以包含可更新的记录。这个数据集是一组记录,可以用它从一个或多个基本数据库表中检查、添加、改变或删除记录。动态集型记录集包含来自一个数据库中一个或多个表的字段。
3.2.3 快照型记录集是一组记录的一个静态拷贝,可以用它查找数据或生成报表。这些记录集可以包含来自一个数据库中一个或多个表的字段,不过不可更新。
3.3 CDaoTableDefInfo
COleVariant 这个类封装了WIN32提供的VARIANT这个结构以及对它的操作。这个类当中可以存储多种类型的数据。需要注意的是这种包容能力是通过C语言当中的UNION提供的,就是说一个COleVariant 对象只能保存一种类型的数据。我们先把字段的值装入OLE变体对象,再使用这个变体对象对记录中的字段进行赋值。VT_BSTRT参数的作用是在生成OLE变体对象的时候指示将要封入的数据的类型为字符串。当对所有的字段都结束赋值后,调用Update 函数来保存刚才的修改。