08 DAO

DAO

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

10.8.2 DAO ODBC的相似之处

DAO

类与 ODBC 类相比具有很多相似之处,这主要有下面几点:
  • 二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。

  • DAO

    提供了与ODBC功能相似的MFC类。例如,DAOCDaoDatabase类对应ODBCCDatabase类,CDaoRecordset对应CRecordsetCDaoRecordView对应CRecordViewCDaoException对应CDBException。这些对应的类功能相似,它们的大部分成员函数都是相同的。
  • AppWizard

    ClassWizard对使用DAOODBC对象的应用程序提供了类似的支持。

 

由于DAOODBC类的许多方面都比较相似,因此只要用户掌握了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_strFilterm_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();

}

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

10.8.3 DAO的特色

DAO可以通过ODBC驱动程序访问ODBC数据源。但DAO是基于Microsoft Jet引擎的,通过该引擎,DAO可以直接访问AccessFoxProdBASEParadoxExcelLotus 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,则函数以独占方式打开数据库,否则就用共享方式。如果bReadOnlyTRUE,那么就以只读方式打开数据库。如果要打开一个Access数据库,则可以在lpszName参数中指定MDB文件名。如果要访问非Access数据库,则应使该参数为“”,并在lpszConnect中说明一个连接字符串。连接字符串的形式一般为 “数据库类型;DATABASE=路径(文件)”,例如 “dBASE III;DATABASE=c://MYDIR

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

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

利用AppWizardClassWizard,用户可以方便地开发出性能优良的基于DAOAccess数据库应用程序。

10.8.4 ODBC还是DAO

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

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

  • ODBC兼容

  • DAO

    允许数据有效检查
  • DAO

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

 

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

你可能感兴趣的:(08 DAO)