当前位置: 首页 > 图文教程 > Java技术 > 数据库持久层 > 数据库持久层:DAO和ODBC的相似之处

数据库持久层
数据库持久层:Hibernate中cascade和inverse的用法
数据库持久层:hibernate的配置信息
数据库持久层:谈hibernate的持续性
数据库持久层:小议Hibernate查询及数据检索
数据库持久层:浅谈hibernate中的Session
数据库持久层:小编浅谈hibernate中抓取策略
数据库持久层:iBATIS框架中Serializable可读写缓存及存储类型
数据库持久层:ibatis高级特性
数据库持久层:为持久层编写单元测试
数据库持久层:小编浅谈ibatis基础语义
数据库持久层:Hibernate中与关联有关的问题
数据库持久层:浅谈ORM(对象关系映射)
总结JDBC连接SQLServer的错误Error establishing socket
数据库持久层:iBATIS的OR 映射
数据库持久层:DAO和ODBC的相似之处
数据库持久层:小编浅谈DAO的特色
数据库持久层:小编浅谈XDoclet 与Hibernate 映射
数据库属性hibernate.dialect的设置

数据库持久层:DAO和ODBC的相似之处


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 258 ::
收藏到网摘: n/a

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

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

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

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

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

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

·         AppWizardClassWizard对使用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函数。