⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap10_8.htm

📁 VC++编程实例。非常详细
💻 HTM
字号:
<html>

<head>
<title>10.8 DAO</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<link rel="stylesheet" href="../../../cpcw.css"></head>

<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<div align="center"><center>
    <table width="85%" border="0">
      <tr bgcolor="#FFFFFF"> 
        <td> 
          <div align="center">
            <center>
            </center>
          </div>
          <p align="CENTER"><b><font face="Times New Roman" color="red">10.8 DAO</font></b></p>
          <p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.8.1 
            </font><font size="3" color="#3973DE">什么是</font><font color="#3973DE" face="Times New Roman" size="3">DAO</font></p>
          <p align="JUSTIFY">  DAO(Database Access Object)使用Microsoft Jet数据库引擎来访问数据库。Microsoft 
            Jet为象Access和Visual Basic这样的产品提供了数据引擎。</p>
          <p align="JUSTIFY">  与ODBC一样,DAO提供了一组API供编程使用。MFC也提供了一组DAO类,封装了底层的API,从而大大简化了程序的开发。利用MFC的DAO类,用户可以编写独立于DBMS的应用程序。</p>
          <p align="JUSTIFY">  DAO是从Visual C++4.0版开始引入的。一般地讲,DAO类提供了比ODBC类更广泛的支持。一方面,只要有ODBC驱动程序,使用Microsoft 
            Jet的DAO就可以访问ODBC数据源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库(即*.MDB文件)时具有很好的性能。</p>
          <p align="JUSTIFY"><font color="#3973DE" face="Times New Roman" size="3">10.8.2 
            DAO</font><font color="#3973DE" size="3">和ODBC的相似之处</font></p>
          <p align="JUSTIFY">DAO类与ODBC类相比具有很多相似之处,这主要有下面几点:</p>
          <ul>
            <li>
              <p align="JUSTIFY">二者都支持对各种ODBC数据源的访问。虽然二者使用的数据引擎不同,但都可以满足用户编写独立于DBMS的应用程序的要求。</p>
            </li>
            <li>
              <p align="JUSTIFY">DAO提供了与ODBC功能相似的MFC类。例如,DAO的CDaoDatabase类对应ODBC的CDatabase类,CDaoRecordset对应CRecordset,CDaoRecordView对应CRecordView,CDaoException对应CDBException。这些对应的类功能相似,它们的大部分成员函数都是相同的。</p>
            </li>
            <li>
              <p align="JUSTIFY">AppWizard和ClassWizard对使用DAO和ODBC对象的应用程序提供了类似的支持。</p>
            </li>
          </ul>
          <p>  由于DAO和ODBC类的许多方面都比较相似,因此只要用户掌握了ODBC,就很容易学会使用DAO。实际上,用户可以很轻松地把数据库应用程序从ODBC移植到DAO。</p>
          <p align="JUSTIFY">  Visual C++随盘提供了一个名为DaoEnrol的例子,该例实际上是Enroll的一个DAO版本。读者可以打开DaoEnrol工程看一看,它的源代码与Enroll的极为相似。读者可以按照建立Enroll的步骤来建立DaoEnrol,其中只有若干个地方有差别,这主要有以下几点:</p>
          <blockquote> 
            <p align="JUSTIFY">选取的数据源不同。在用AppWizard创建DaoEnrol时,以及在用ClassWizard创建CDaoRecordset类的派生类时,在Database 
              Options对话框中应该选择DAO而不是ODBC。而且DAO的数据源是通过选择一个.MDB文件来指定的,即点击“...”按钮后在文件对话框中选择要访问的.MDB文件。</p>
            <p align="JUSTIFY">记录集的缺省类型不同。ODBC记录集的缺省类型是快照(Snapshot),而DAO则是动态集(Dynaset)。</p>
            <p align="JUSTIFY">参数化的方式不同。DAO记录集的m_strFilter和m_strSort中的参数不是“?”号,而是一个有意义的参数名。例如,在下面的过滤器中有一个名为CourseIDParam的参数。<br>
              m_pSet-&gt;m_strFilter =&quot;CourseID = CourseIDParam&quot;;<br>
              在DoFieldExchange函数中,有下面两行:<br>
              pFX-&gt;SetFieldType(CDaoFieldExchange::param);<br>
              DFX_Text(pFX, _T(&quot;CourseIDParam&quot;), m_strCourseIDParam);<br>
              DFX函数的第二个参数也是CourseIDParam。</p>
            <p align="JUSTIFY">处理异常的方式不同。例如,在删除记录时,对异常的处理如下所示:</p>
            <p align="JUSTIFY">try</p>
            <p align="JUSTIFY">{</p>
            <p align="JUSTIFY">m_pSet-&gt;Delete();</p>
            <p align="JUSTIFY">}</p>
            <p align="JUSTIFY">catch(CDaoException* e)</p>
            <p align="JUSTIFY">{</p>
            <p align="JUSTIFY">AfxMessageBox(e-&gt;</p>
            <p align="JUSTIFY">m_pErrorInfo-&gt;m_strDescription);</p>
            <p align="JUSTIFY">e-&gt;Delete();</p>
            <p align="JUSTIFY">}</p>
          </blockquote>
          <p align="JUSTIFY">  除了上述差别外,AppWizard和ClassWizard也隐藏了一些细微的不同之处,例如,DAO记录集是使用是DFX数据交换机制(DAO 
            record field exchange)而不是RFX,在DAO记录集的DoFieldExchange中使用的是DFX函数而不是RFX函数。</p>
          <p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.8.3 
            DAO</font><font size="3" color="#3973DE">的特色</font></p>
          <p align="JUSTIFY">  DAO可以通过ODBC驱动程序访问ODBC数据源。但DAO是基于Microsoft Jet引擎的,通过该引擎,DAO可以直接访问Access、FoxPro、dBASE、Paradox、Excel和Lotus 
            WK等数据库。CDaoDatabase类可以直接与这些数据库进行连接,而不必在ODBC管理器中注册DSN。例如,下面的代码用来打开一个FoxPro数据库:</p>
          <p align="JUSTIFY">CDaoDatabase daoDb;</p>
          <p align="JUSTIFY">daoDb.Open( “”,FALSE,FALSE,&quot;FoxPro 2.5;DATABASE=c:\\zyf&quot;);</p>
          <p align="JUSTIFY">CDaoDatabase::Open函数用来连接某个数据库,该函数的声明为:</p>
          <blockquote> 
            <blockquote> 
              <blockquote> 
                <p align="JUSTIFY">virtual void Open( LPCTSTR lpszName, BOOL bExclusive 
                  = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T(&quot;&quot;) 
                  );<br>
                  throw( CDaoException, CMemoryException );</p>
              </blockquote>
            </blockquote>
          </blockquote>
          <p> </p>
          <p align="JUSTIFY">  参数bExclusive如果为TRUE,则函数以独占方式打开数据库,否则就用共享方式。如果bReadOnly为TRUE,那么就以只读方式打开数据库。如果要打开一个Access数据库,则可以在lpszName参数中指定MDB文件名。如果要访问非Access数据库,则应使该参数为“”,并在lpszConnect中说明一个连接字符串。连接字符串的形式一般为 
            “数据库类型;DATABASE=路径(文件)”,例如 “dBASE III;DATABASE=c:\\MYDIR”</p>
          <p align="JUSTIFY">  Open函数也可以打开一个ODBC数据源,但这需要相应的ODBC驱动程序,并需要在ODBC管理器中注册DSN。此时lpszConnect的形式为 
            “ODBC;DSN=MyDataSource”。显然,用DAO访问象FoxPro这样的数据库时,直接打开比把它当作ODBC数据源打开要省事。</p>
          <p align="JUSTIFY">  支持DDL是DAO对数据库编程良好支持的一个重要体现。DDL(Data Definition 
            Language)在SQL术语中叫做“数据定义语言”,它用来完成生成、修改和删除数据库结构的操作。ODBC类只支持DML(Data 
            Manipulation Language,数据操作语言),不支持DDL,所以用ODBC类只能完成数据的操作,不能涉及数据库的结构。要执行DDL操作,只有通过ODBC 
            API。而DAO类同时提供了对DML和DDL的支持,这意味着程序可以使用DAO类方便的创建数据库及修改数据库的结构。</p>
          <p align="JUSTIFY">  与ODBC相比,DAO提供了一些新类来加强其功能,这些新类包括:</p>
          <blockquote> 
            <blockquote> 
              <p align="JUSTIFY">CDaoTableDef类提供了对表的结构的定义。调用CDaoTableDef::Open可以获得表的结构定义。调用CDaoTableDef::Create可以创建一张新表,调用CDaoTableDef:: 
                CreateField可为表添加字段,调用CDaoTableDef::CreateIndex可以为表添加索引。调用CDaoTableDef::Append可以把新创建的表保存到数据库中。</p>
              <p align="JUSTIFY">CDaoQueryDef类代表一个查询定义(Query definition),该定义可以被存储到数据库中。</p>
              <p align="JUSTIFY">CDaoWorkspace提供了数据工作区(Workspace)。一个工作区可以包含几个数据库,工作区可以对所属的数据库进行全体或单独的事务处理,工作区也负责数据库的安全性。如果需要,程序可以打开多个工作区。</p>
            </blockquote>
          </blockquote>
          <p>  DAO的另一个重要特色在于它对Access数据库提供了强大的支持。由于DAO是基于Microsoft Jet引擎的,所以DAO肯定要在Access数据库上多作一些文章。例如,调用CDaoDatabase::Create可以直接建立一个MDB文件,代码如下所示:<br>
            m_db.Create(“C:\\MYDIR\\MYDB.MDB”);</p>
          <p align="JUSTIFY">利用AppWizard和ClassWizard,用户可以方便地开发出性能优良的基于DAO的Access数据库应用程序。</p>
          <p align="JUSTIFY"><b></b><font color="#3973DE" face="Times New Roman" size="3">10.8.4 
            ODBC</font><font size="3" color="#3973DE">还是</font><font color="#3973DE" face="Times New Roman" size="3">DAO</font></p>
          <p align="JUSTIFY">由于DAO可以访问ODBC数据源,下面几条可以作为DAO替代ODBC的理由:</p>
          <ul>
            <li>
              <p align="JUSTIFY">在某些情况下可以获得更好的性能,特别是在访问Microsoft Jet(.MDB)数据库时。</p>
            </li>
            <li>
              <p align="JUSTIFY">与ODBC兼容</p>
            </li>
            <li>
              <p align="JUSTIFY">DAO允许数据有效检查</p>
            </li>
            <li>
              <p align="JUSTIFY">DAO允许用户说明表与表之间的关系</p>
            </li>
          </ul>
          <p>  当然,DAO的出现并不意味着ODBC已经过时了。如果用户的工作必须严格限于ODBC数据源,尤其是在开发Client/Server结构的应用程序时,用ODBC有较好的性能。</p>
          <div align="center">
            <center>
              <table border="0" cellpadding="0" cellspacing="0" width="615">
                <tr> 
                  <td><a href="chap10_7.htm">上一页</a></td>
                  <td>
                    <p align="right"><a href="chap10_9.htm">下一页</a>
                  </td>
                </tr>
              </table>
              <p><a href="http://www.cpcw.com">电脑报首页</a> <a href="../../index.htm">网络学院首页</a></p>
            </center>
          </div>
          <font size="5">
          <hr noshade color="#3973DE" size="1">
          </font>
          <p align="center"><font size="5"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual 
            C++王朝(Where programmers come together)</a>协助制作<br>
            未经许可,请勿以任何形式复制</font>
        </td>
      </tr>
    </table>
    </center>
</div>

</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -