📄 45901.htm
字号:
<P>最后,图 4 是关于 mfc 数据库类的完整图片。请注意,mfc 栏和 odbc 栏上的垂直线表示指派两个数据库类集用作“非此即彼”决策。您可以选择访问所有类型的数据源,但不能混合两个集合中的 mfc 数据库类。</P>
<TABLE class=ln cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
<TBODY>
<TR>
<TD bgColor=#ffffff><IMG src="/files/uploadimg/20070416/1154175.gif"></TD></TR>
<TR>
<TD class=it align=middle bgColor=#dddddd>图4:mfc 数据库类</TD></TR></TBODY></TABLE>
<P><STRONG>odbc 数据库类的数据源选择</STRONG></P>
<P>当您用 mfc odbc 类编写应用程序时,可以连接到任何数据源(只要您有它的 odbc 驱动程序)。odbc 驱动程序管理器和 odbc 驱动程序的操作在您用这些类编写的应用程序中是透明的,但个别驱动程序性能会影响应用程序的功能。</P>
<P>通常,mfc 动态集(但并非只向前滚动的记录集)要求 odbc 驱动程序具有 2 级 api 一致性。如果数据源的驱动程序符合 1 级 api 设置,您就仍可以使用可更新且只读的快照与只向前滚动的记录集,但不能使用动态集。然而,如果 1 级驱动程序支持扩展的提取和键集驱动游标,它就可以支持动态集。</P>
<P>odbc desktop driver pack 3.0 版支持 2 级 odbc api 调用 sqlextendedfetch。</P>
<P>appwizard 和 classwizard 会自动将数据源的列静态地绑定到您应用程序的成员变量中。这是在您应用程序与数据源之间建立连接的最简单的方法,但不是最灵活的方法。可以用类 cfieldexchange 将自定义的记录字段交换 (rfx) 调用添加到您的应用程序中。请参见“technical note 43:rfx routines”,以获取更多信息。</P>
<P>另外,还可以考虑动态地绑定数据库的列。在最普通的级别中可执行下列步骤:</P>
<P>◆构造您的主要记录集对象。然后,可以将指针传递给一个打开的 cdatabase 对象,或者也可以用其它方法向列记录集提供连接信息。 <BR>◆执行一些步骤,动态地添加列。 <BR>◆打开您的主要记录集。 <BR>◆记录集会选择记录,并使用记录字段交换 (rfx) 绑定“静态”列(映射到记录集字段数据成员的列)和动态列(映射到您分配的额外存储的列)。</P>
<P><STRONG>dao 数据库类的数据源选项</STRONG></P>
<P>现在我们要谈的是您可以用 dao 数据库类连接的数据源、列的静态绑定、列的动态绑定,以及记录的双缓冲。</P>
<P>既然 microsoft access 数据库是 jet 的本机数据库,您自然就可以以最快速度访问它们。microsoft access 97 具有的数据库格式是 dao 3.5 版的本机数据库格式。如果使用 microsoft access 97 数据库,将获得最为快速的性能。</P>
<P>jet 使用单独的 dll 提供对 microsoft jet 1.x 和 2.0 版数据库的访问权限。存储引擎和格式完全是用 microsoft jet 3.0 版修订的。假如更改之处很多,microsoft jet 3.0 版就会将 2.0 版数据库视为外部 isam,这会影响性能。因此,这也是促使您应该考虑将 microsoft access 数据库升级的合理原因。</P>
<P>另外,您还可以访问可安装的 isam 数据库和 odbc 数据源。isam(基于索引的连续访问方法)数据库,如 foxpro 和 dbase,可以直接打开,也可以链接到 access 数据库以实现最佳性能。下面是 dao 可以访问的数据源的列表:</P>
<P>◆microsoft foxpro 的 2.0、2.5 和 2.6 版。在 3.0 版中可以导入与导出数据,但不能创建对象。 <BR>◆dbase iii、dbase iv 和 dbase 5.0 <BR>◆paradox 的 3.x、4.x 和 5.x 版 <BR>◆btrieve 的 5.1x 和 6.0 版 <BR>◆microsoft excel 的 3.0、4.0、5.0、7.0 和 8.0 版工作表 <BR>◆lotus wks、wk1、wk3、wk4 电子表格</P>
<P><STRONG>文本文件</STRONG></P>
<P>请记住,microsoft access 的 1.x、2.0 和 7.0 版数据库都属于此类别。</P>
<P>可以通过 odbc 访问 odbc 数据源,如 sql server 和 oracle,因此您可以选择针对这些数据源使用 dao。一个 odbc 数据源可以来自任何 dbms,只要您拥有该 dbms 的适当的 odbc 驱动程序。对于 visual c++ 2.0 版或更高版本,您需要 32 位的 odbc 驱动程序(但 win32 除外,在 win32 中需要 16 位的 odbc 驱动程序)。下面是此版本 visual c++ 所包含的 odbc 驱动程序列表。</P>
<P>◆sql server <BR>◆microsoft access <BR>◆microsoft foxpro <BR>◆microsoft excel <BR>◆dbase <BR>◆paradox <BR>◆文本文件</P>
<P>microsoft desktop database drivers 3.0 版(它包含列表中的最后六项)为这些数据源提供最佳性能。这些只限 32 位驱动程序。</P>
<P>#p#</P>
<P>将外部数据源(如 sql server)链接到 microsoft access 表是最有效的处理数据访问的方法。在将应用程序连接到远程数据源以前,必须先确保应用程序的用户可以访问远程数据,并且确保正确地设计您的应用程序,以解决远程数据源安全性难题。另外,您还必须确保应用程序能够正确地与区分大小写的数据源进行交流,并且确保正确地初始化可安装的 isam,以用于您想访问的数据源。最后,您必须检查您的代码,以确保在访问非 jet 数据源时,代码没有使用 microsoft jet 数据源专用的对象或调用。</P>
<P>设置链接最简捷的方法是:进入 microsoft access。如果用的是 microsoft access 2.0 版,则使用“文件”/“附加表”命令;如果用的是 microsoft access 95 和 microsoft access 97,则使用“文件”/“获取外部数据”/“链接表”命令。</P>
<P>连接信息存储在您所使用的基本表 (.mdb) 中。如果移动了外部数据的位置,就必须在 microsoft access 中或从代码中调用 cdaotabledef::refreshlink,重新建立链接。</P>
<P>dao 记录字段交换机制与在基于 odbc 的数据库类中的 rfx 有着相同的工作方式。记录集对象的字段数据成员如果联系在一起,就形成一个“编辑缓冲区”,以保存一个记录的选定列。当记录集第一次打开并要读取第一条记录时,dfx 就会将每个选定列与适当字段数据成员的地址绑定(关联)在一起。当记录集更新一条记录时,dfx 调用 dao 以向数据库引擎发送适当的命令。dfx 利用它对字段数据成员所了解的内容,指定要写入的数据源中的列(字段)。</P>
<P>向导支持列的静态绑定。您可以添加自己的 dfx 调用,就象使用基于 odbc 的类时那样。首先,对于每个绑定字段和参数,都必须将成员添加到 cdaorecordset 派生的类中。接下来,cdaorecordset::dofieldexchange 应被替代。请注意,成员的数据类型很重要。它应与来自数据库字段中的数据匹配,或者至少可转换成那种类型。mfc technical #53 更详细地讲述了此过程。</P>
<P>cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。如果您正在编写自定义数据类型的数据交换例程,则使用该类。cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。</P>
<P><STRONG>dao 数据库类中的动态绑定</STRONG></P>
<P>如果可以用基于 odbc 的类动态绑定列,对这种行为的支持就不会内置于 mfc 类中。动态绑定会内置在 dao 数据库类中,而且执行起来相当容易。</P>
<P>还可以做一些其它的事情以优化性能,如检索记录的一部分而不是整个记录。在本陈述的稍后部分中,我们将提供一些可以优化应用程序的方法。</P>
<P>dfx 和动态绑定不是互相排斥的选择方案。通过 dao 数据库类,可以将静态和动态绑定调用混合,以实现最大效率。</P>
<P><STRONG>dao 数据库类中的双缓冲</STRONG></P>
<P>在 mfc 的 cdaorecordset 类中,双缓冲是一种当记录集内的当前记录发生更改时简化检测的机制。当添加新记录和编辑现有记录时,对您的 dao 记录集使用双缓冲会减少必需的工作量。默认情况下,您的 mfc dao 记录集保留编辑缓冲区的第二份副本(记录集类的字段数据成员,全体复制;dao“帮助”中称相应的缓冲区为“复制缓冲区”)。当您对数据成员进行更改时,mfc 会拿它们与副本(“双缓冲区”)进行比较以检测更改。</P>
<P>双缓冲的代用方法 - 不保留数据的副本 - 当编辑当前记录的字段时,要求您进行其它函数调用。</P>
<P>双缓冲一直是基于 odbc 的数据库类的一部分。对于 dao 数据库类,如果需要,您可以停用该机制以提高效率。</P>
<P>该机制的主开关名为 m_bcheckcachefordirtyfields,dirty 意思是“已更改”。如果将此开关置于 on(开),就可以对全部或部分字段启用双缓冲。如果该主开关是 off(关),就会禁用整个双缓冲机制。</P>
<P>您最想关闭其双缓冲的字段包括备注字段、图片字段,以及其它 blob(大型二进制对象)。</P>
<P>dao sdk 中含有一些 c++ 数据库类,这些类彼此独立,而且不同于 mfc dao 数据库类。这些 c++ 类将单个对象封装到 dao 层次结构中。虽然您可以将 dao sdk c++ 类与 mfc dao 数据库类混合,但 dao sdk c++ 类不遵循操作符超载的 mfc 准则,并且在混合使用这些类时您必须当心。</P>
<P>mfc odbc 数据库类使用 microsoft access 和 visual basic 中的记录集模型。您可以用内置于类中的成员函数对记录进行筛选、分类、滚动以及其它处理。基础 odbc 驱动程序会影响特殊应用程序的功能。因此,若要使可移植性更强,您的应用程序就必须更具有通用性,或者必须依赖于更低级别的 odbc 功能。如有必要,可以直接调用 odbc,以完成特殊任务。现在,让我们检查该集合中的单个类。</P>
<P>就象使用 mfc 那样,必要时可以调用基础 api(在此情况下为 odbc)。</P>
<P>一个 cdatabase 对象代表一个到数据源的连接,通过此连接您可以在数据源上进行操作。数据源是指以某些数据库管理系统 (dbms) 作为宿主的指定数据实例。具体示例包括 microsoft sql server、microsoft access、borland dbase 和 xbase。您可以在自己的应用程序中同时让一个或多个 cdatabase 对象处于活动状态,并且可以保持到一个数据库对象的多个连接。</P>
<P>一个 crecordset 对象代表从数据源中选择的一个记录集合。称为“记录集”的 crecordset 对象有三种可用的形式:动态集、快照、动态记录集。动态集是与其他用户的更新保持同步的记录集。快照是静态记录集,它反映的是抓拍快照时数据库的状态。动态记录集类似于动态集,但通常只用于 microsoft sql server。每种形式都代表在打开记录集时确定的记录集合,但当您在动态集内或动态记录集内滚动到一条记录时,它反映后来由其他用户或您应用程序中的其它记录集对记录所做的更改。</P>
<P>mfc 4.2 以书签的形式向 crecordset 类中添加新的导航功能,并添加标识及导航到记录的 absoluteposition 的能力。书签是唯一的标识符,通过调用该标识符可返回指定的记录。</P>
<P><FONT size=4>【相关文章】</FONT></P>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200702/41186.htm" target=_blank><U><FONT color=blue>SQL Server 2005性能排错</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://developer.51cto.com/art/200702/40439.htm" target=_blank><U><FONT color=blue>如何使用SQL Server 2000中的XML功能</FONT></U></A></LI></UL>
<UL type=disc>
<LI><A href="http://database.51cto.com/art/200702/39399.htm" target=_blank><U><FONT color=blue>用SQL Server HAVING子句计算列和平均值</FONT></U></A></LI></UL>
<DIV align=right>【责任编辑:<A class=ln href="mailto:sunsj@51cto.com">火凤凰</A> TEL:(010)68476606-8007】</DIV></td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -