IT技术网www.itjs.cn

当前位置:首页 > 数据库 > SQl Server > SQL Server MFC DAO类和MFC ODBC类(1)

SQL Server MFC DAO类和MFC ODBC类(1)

发布时间:2015-11-29 00:00 来源:未知

大多数 mfc 开发人员都熟悉开放式数据库连接 (odbc) 数据库类 - 它们早在三年半以前就出现了。在 mfc 4.2 中,对这些类有一些重要的改进。

身为 c++ 开发人员,您可能不熟悉 dao,因为到目前为止它还只可用于 microsoft access 和 visual basic® 程序设计系统。假如您熟悉 dao,就必须了解:dao 在 mfc 中的实现颇有不同,但包罗广泛。

了解 mfc odbc 类的开发人员必须知道:虽然 mfc dao 类比 odbc 类功能性更强,但 dao 类不能代替它们。

对于那些不怎么熟悉 mfc 的人,我想提醒一句:mfc 有一个适用于各种数据库类的设计原则。

mfc 像一张薄薄的包装纸那样,封装 windows® 操作系统 api,提供您想要的 c++ 性能,同时提供您需要的抽象概念。当基础 api 具有实际意义时,向其添加值。可是多数时候 mfc 力图保持不为人触及。

就如 mfc 封装更复杂的 api 一样,数据库类也封装更复杂的技术。因为 mfc 可以在 intel、unix 和 alpha 之间进行移值,所以数据库应用程序解决方案也是可移值的。

我们与 microsoft access、visual basic 使用相同的记录集模型,因此,已经使用那些产品的开发人员不必学习新的范例。另外,两个类集的体系结构基本相同,使用其中一个类集的开发人员可以轻松地切换到另一个类集并使用它。

mfc 数据库类

自从 1.5 版之后,mfc 中就已经包含 odbc 数据库类。visual c++ 2.0 版提供了含有相同类的 32 位版本。这些类基于一个工业认可标准,并已得到广泛应用,且因其 odbc 具有可移植性而受到其它数据库开发选择方案的青睐。这种可移植性是指能够将许多 odbc 数据源与用这些类创建的应用程序一起使用。近来的性能改进使得 odbc 数据库类成为一个吸引人的选择方案。

在多数情况下,mfc 4.0 中的 dao 数据库类允许您直接访问桌面数据源而无须使用 odbc。dao 数据库类所具有的同时打开多个数据库类型的能力、使用多数据源的能力以及数据定义语言能力,使其成为重要的开发选择方案。

现在,您已经准备好提出这个问题,自己应使用哪个数据库类集合。假如您所提供的有关自己项目的信息不多,就很难确定这个问题的答案。但是,第一件要考虑的事情是您使用什么数据源。假如您通常使用桌面数据,我们鼓励您考虑 mfc dao 数据库类,因为您将会发现它们极为有效且功能强大。假如您主要使用 odbc(基于服务器)的数据,则使用基于 odbc 的类会使您项目的进展更富成效。

其它考虑事项包括网络种类、可伸缩性要求,以及速度是否是最重要的因素。最好是用您认为工作得最好的数据库类集让应用程序保持原型。可以进行一些基准测试,以确定您的最佳性能选择。

真正的决定权在您

您可用来创建数据库应用程序的选项集合很大。它实际是完整的一系列选项,一端是桌面数据库应用程序,另一端是严格的客户/服务器数据库应用程序。仅有的两种看似明显的选择可能是:在 microsoft access 97 mdb 数据中使用 mfc dao 数据库类,而在 microsoft sql server ™ 6.5 中使用 mfc odbc 数据库类。这两种组合主要是互相配合使用的,均非常有效。但您可能已对这些选择有所了解,其它情况又该如何呢

简要地说,以下是您赖以决策的过程:

◆确定数据源需求

最为重要的是,dao 接口是基于 ole com 的,它很好地安置 dao 以适应不断发展的技术和操作系统。

SQL Server MFC DAO类和MFC ODBC类(1)
示意图1

此处是 dao 层次结构图表。在顶端,将看到 dbengine 对象,该对象中含有所有其它对象。这是唯一没有集合的对象,因为您只能有一个引擎。但可以有多个工作区 (workspace)、数据库 (database) 等等,这正是余下的对象都有自己所属集合的原因。

在工作区中,可以有多个数据库,一个基本表 (.mdb) 或一个附加/链接的表。在每个数据库中将有一个或多个表、查询、记录集,而其中的每个表、查询、记录集不仅包含字段和(或)索引,还有其它类型的对象。

另外,与工作区连接的是用户对象和组对象,它们形成了 dao 的安全模型。

独立但与引擎对象连接的是 errors 对象。

errors 集合中对象的附加方式不同于其它 dao 集合。最详细的错误放在集合的末尾,最常规的错误放在开头。

mfc 和 dao

现在要谈的是 mfc 如何实现 dao。因为我们不是分别包装每个 dao 对象,所以实际上 mfc 会平展 dao 的层次结构。我们为您提供 8 个对象而不是 21 个对象。

我们封装所有的 dao 功能,除 security 对象外 - users 对象、groups 对象以及新的 odbcdirect 对象。这是我们有意而为。例如,我们觉得在查看安全性对象时,围绕它们创建类将不会给 dao 的使用添加任何值,因此还是让您直接调用 dao,来处理那些对象。这也是与 mfc 原则一致的:应该在对添加值的立场而言有意义的地方创建类。但我们仍会在 mfc technical note 54 中提供关于如何实现安全性模型的指导。

另外,我们还管理 dao 要将对象追加到集合的要求。在 dao 中,您创建对象,然后将它追加到集合中。除一种例外情况外,这种添加是自动完成的。对于这种例外情况,可作为一个单独的步骤来设置开发人员能否追加对象,这是很用的。

虽然可能用 odbc 数据库类进行动态绑定,但实现这一目的的功能并非 mfc 类的内置功能。它被置入 dao 数据库类,您可以相当轻松地进行动态绑定。现在我们的第二个演示将更多地谈及这一点。

dao 提供来自 sql 的数据定义语言 (ddl),以便您创建数据库、表、记录集等。在 odbc 中没有 ddl。

最后,当您需要时,总是可以对基础 dao ole 对象进行直接调用。

mfc dao 数据库类的层次结构

SQL Server MFC DAO类和MFC ODBC类(1)
示意图2

五个由 cobject 派生的 mfc dao 类(cdaoworkspace、cdaodatabase、cdaotabledef、cdaoquerydef 和 cdaorecordset)具有该基础类的所有功能。

cdaoexception 由 cexception 派生得到,具备该类的优点,包括显示来自基础 dao errors 对象的错误消息的能力。

如前面提到的那样,cdaorecordview 由 cformview 派生得到,而 cformview 又由 cscrollview 派生得到,依次类推。可以看到 cdaorecordview 类在快速而轻松地实现基于窗体的数据显示方面所具有的全部优点。此外,还有对于 cdaorecordview 的向导支持。该类中的功能实质上是与 crecordview 类一样的。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如要创建自定义的 dfx 例程,只要直接调用该对象即可。

mfc dao 数据库类

cdaoworkspace 封装 dbengine 对象和 workspace 对象。mfc dao 类提供工作区的事实非常重要。odbc 数据库类不同时支持多个数据库连接。

事务处理是在 dao 数据库类中的 workspace(工作区)级别完成的,而不是在 odbc 类中的 recordse(记录集)级别完成的。一个事务可能会影响所有打开的数据库和记录集,或者您可以隔离事务,使其只会影响指定的数据库,等等。

多数时候,您不必担心工作区对象的创建。假如您未创建,mfc 就将为您打开一个工作区对象。假如您需要的话,dao 数据库类可支持多个工作区。

最后,您不必担心工作区对象超出范围或是在数据库会话完成前关闭。可以使用工作区指针访问工作区集合,访问数据库集合,以及访问数据库引擎的属性等。

cdaodatabase

cdaodatabase 在体系结构上类似于基于 odbc 的 cdatabase 类。cdaodatabase 也封装数据库连接。因为您不必总是使用 odbc,所以对于大多数桌面数据源,数据源的位置就表达为路径。cdaodatabase 可以存储 tabledef 和 querydef 对象,为您的开发提供了极大方便。cdaodatabase 可使用本地及远程数据源。在本白皮书的稍后部分,有一个可供您使用的数据源的列表。

该数据库对象在会话期间也一直继续存在。必要时可以明确地关闭数据库连接。仅就比较而言,cdatabase 类有 21 个成员函数,而 cdaodatabase 有 26 个成员函数。这些成员函数中彼此相应的都非常相似,在 cdaodatabase 中还有几个没有对应成员函数。

在 odbc 数据库类中没有与 cdaotabledef 相应的类。tabledef 对象让您检查数据库的架构(结构),不论表是本机 microsoft access 表(基本表)还是链接的表。假如用 dao 直接打开外部数据源,就可向其中添加字段和索引。假如您链接了表,就可以检查结构,但不能更改它。可以将表作为记录集的基础。这样做会使您获得几个好处,包括使用名为 seek 的快速搜索成员函数。

使用 cdaotabledef 可以确定是否可通过调用 cdaotabledef::canupdate 编辑表中的数据。mfc 负责为您管理 dao field 和 index 集合。使用 cdaotabledef 时,您可以选择是否向 tabledefs 集合中追加表;而使用所有其它对象时,会自动进行追加。

您用来检索记录的 sql 存储在 cdaoquerydef 对象中。您可用该对象存储您提出的有关数据的“问题”,如“how many customers did x dollars of business last month ”。可以检索或重新使用存储的查询,可按下列三种方法之一使用它们:

通过将指针传递到 cdaoquerydef 对象而创建记录集。

直接执行操作查询,即移动或更改数据的查询。操作查询包括追加、删除、生成表以及更新查询。删除查询和更新查询会更改现有数据;附加查询和生成表查询会移动现有数据。

执行 sqlpassthrough 查询:sql 直接传递查询是直接发送到数据库服务器而不会被 microsoft jet 数据库引擎中断的 sql 语句。sql 直接传递查询为您的应用程序提供直接使用数据库服务器的功能的能力。

另外,cdaorecordset 还很类似于基于 odbc 的 crecordset 类。记录集不仅可以基于表,也可以基于动态集和快照。请记住,记录集代表您已检索到的记录和穿过数据的方法。移动并滚动数据的方法包括 seek(只用于表类型的记录集)、find 和 move 操作,以及 absoluteposition 和(假如您的数据源支持的话)书签。书签是唯一的标识符,可通过调用该标识符来返回指定的记录。

mfc dao 数据库类中的大部分功能是存在于 cdaorecordset 中的。crecordset 只有 44 个成员函数,与之相比 cdaorecordset 有 91 个成员函数。这种额外的功能表现为字段值的导航、高速缓存、设置和检索中,以及记录集属性的设置和检索。

cdaorecordview 和 crecordview 类有几乎相同的功能。另外,它们都还具有因基于 cformview 而获得的优点。请记住,窗体视图就好象在窗口的客户端区域伸展的对话框模板一样,有了它,添加控件与显示字段数据就很容易。appwizard 和 classwizard 支持基于窗体的数据显示。假如使用 appwizard 创建初始应用程序,您数据库中的列就会自动绑定到成员变量。

对于 dao 数据库类,异常错误处理略有不同。类 cdaoexception 将返回基础 dao ole 对象的错误消息。多数时候,您可以检索的错误信息要比通常采用基于 odbc 的类所获得的错误信息多。在 mfc 中,所有 dao 错误都表达为 cdaoexception 类型的异常错误。

当捕获到这种类型的异常错误时,可以使用 cdaoexception 成员函数从任何存储在数据库引擎 errors 集合中的 dao 错误对象中检索信息。每个错误发生时,都会有一个或多个错误对象放入 errors 集合中。当另一个 dao 操作生成错误时,errors 集合被清除,新的错误对象被放入 errors 集合。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如您正在编写自定义数据类型的数据交换例程,则使用该类;否则,您不会直接使用该类。dfx 在您 cdaorecordset 对象的字段数据成员和数据源上当前记录的相应字段之间交换数据。dfx 管理两个方向中的交换,即来自数据源的交换与到数据源的交换。若需关于编写自定义 dfx 例程的信息,请参见 technical note 53(可在 books online 中的 mfc 下找到)。

cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。dfx 操作是在类型的记录集类数据成员上执行的,这些类型由 cdaofieldexchange 中的 enum fieldtype 定义。可能的 fieldtype 值有:

用于字段数据成员的 cdaofieldexchange::outputcolumn。

用于参数数据成员的cdaofieldexchange::param。

SQL Server MFC DAO类和MFC ODBC类(1)
图1:mfc 的 odbc 数据库类

这里是基于 odbc 的数据库类的图片,与您所了解的相同。顶端的栏代表基于 odbc、与 odbc 交谈的 mfc 类。每个数据库的 odbc 驱动程序都解释 sql 调用,并针对每个数据源对其进行转换。许多数据源都与相应的驱动程序一起显示在关系图的底部,以提醒您 odbc 的灵活性。

图 2 是 dao 数据库类的图片。它们通过含有 dao 的 ole 进行通信,dao 与 jet 数据库引擎交谈。jet 数据库引擎有一些独立的 dll,用于与各种桌面数据源进行通信。

SQL Server MFC DAO类和MFC ODBC类(1)
图2:mfc dao 数据库类 - 桌面数据源

microsoft jet 数据库引擎可以直接打开诸如 foxpro® 数据库和 paradox 等的数据源。但只要您不需要更改这些数据源的架构,就可以将这些表链接到 microsoft access 数据库中,实际上这会更有效。这就是 foxpro 和 paradox 表(它们仅是示例)显示在两个位置的原因。虚线用以暗示当可能直接打开数据源时,它的效率会更低。

被链接表的外观及工作方式与 microsoft jet 数据库中的任何其它表一样(虽然在连接到远程数据和检索远程数据方面略微有些性能差异)。建立和维护与远程数据源连接所需要的信息存储在表定义中。

相反,当您直接打开表时,必须在每个会话开始时提供连接信息,以便建立与数据源的连接。建立与远程数据源的连接所需要的信息都不存储在 microsoft jet 数据库中。若要直接打开表,就必须使用 cdaotabledef::create,并且必须提供连接信息(如数据源、用户名、密码和数据库名称)。

SQL Server MFC DAO类和MFC ODBC类(1)
图3:mfc dao 数据库类,包括 sql 数据库

假如使用 dao 数据库类,就可以经由 odbc 访问服务器类型的数据库(如 microsoft sql server 和 oracle)。图 3 不是完整的图片,因为它并没有包括对所有类型数据源的访问。

最后,图 4 是关于 mfc 数据库类的完整图片。请注意,mfc 栏和 odbc 栏上的垂直线表示指派两个数据库类集用作“非此即彼”决策。您可以选择访问所有类型的数据源,但不能混合两个集合中的 mfc 数据库类。

SQL Server MFC DAO类和MFC ODBC类(1)
图4:mfc 数据库类

odbc 数据库类的数据源选择

当您用 mfc odbc 类编写应用程序时,可以连接到任何数据源(只要您有它的 odbc 驱动程序)。odbc 驱动程序管理器和 odbc 驱动程序的操作在您用这些类编写的应用程序中是透明的,但个别驱动程序性能会影响应用程序的功能。

通常,mfc 动态集(但并非只向前滚动的记录集)要求 odbc 驱动程序具有 2 级 api 一致性。假如数据源的驱动程序符合 1 级 api 设置,您就仍可以使用可更新且只读的快照与只向前滚动的记录集,但不能使用动态集。然而,假如 1 级驱动程序支持扩展的提取和键集驱动游标,它就可以支持动态集。

odbc desktop driver pack 3.0 版支持 2 级 odbc api 调用 sqlextendedfetch。

appwizard 和 classwizard 会自动将数据源的列静态地绑定到您应用程序的成员变量中。这是在您应用程序与数据源之间建立连接的最简单的方法,但不是最灵活的方法。可以用类 cfieldexchange 将自定义的记录字段交换 (rfx) 调用添加到您的应用程序中。请参见“technical note 43:rfx routines”,以获取更多信息。

另外,还可以考虑动态地绑定数据库的列。在最普通的级别中可执行下列步骤:

◆构造您的主要记录集对象。然后,可以将指针传递给一个打开的 cdatabase 对象,或者也可以用其它方法向列记录集提供连接信息。

将外部数据源(如 sql server)链接到 microsoft access 表是最有效的处理数据访问的方法。在将应用程序连接到远程数据源以前,必须先确保应用程序的用户可以访问远程数据,并且确保正确地设计您的应用程序,以解决远程数据源安全性难题。另外,您还必须确保应用程序能够正确地与区分大小写的数据源进行交流,并且确保正确地初始化可安装的 isam,以用于您想访问的数据源。最后,您必须检查您的代码,以确保在访问非 jet 数据源时,代码没有使用 microsoft jet 数据源专用的对象或调用。

设置链接最简捷的方法是:进入 microsoft access。假如用的是 microsoft access 2.0 版,则使用“文件”/“附加表”命令;假如用的是 microsoft access 95 和 microsoft access 97,则使用“文件”/“获取外部数据”/“链接表”命令。

连接信息存储在您所使用的基本表 (.mdb) 中。假如移动了外部数据的位置,就必须在 microsoft access 中或从代码中调用 cdaotabledef::refreshlink,重新建立链接。

dao 记录字段交换机制与在基于 odbc 的数据库类中的 rfx 有着相同的工作方式。记录集对象的字段数据成员假如联系在一起,就形成一个“编辑缓冲区”,以保存一个记录的选定列。当记录集第一次打开并要读取第一条记录时,dfx 就会将每个选定列与适当字段数据成员的地址绑定(关联)在一起。当记录集更新一条记录时,dfx 调用 dao 以向数据库引擎发送适当的命令。dfx 利用它对字段数据成员所了解的内容,指定要写入的数据源中的列(字段)。

向导支持列的静态绑定。您可以添加自己的 dfx 调用,就象使用基于 odbc 的类时那样。首先,对于每个绑定字段和参数,都必须将成员添加到 cdaorecordset 派生的类中。接下来,cdaorecordset::dofieldexchange 应被替代。请注意,成员的数据类型很重要。它应与来自数据库字段中的数据匹配,或者至少可转换成那种类型。mfc technical #53 更详细地讲述了此过程。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如您正在编写自定义数据类型的数据交换例程,则使用该类。cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。

dao 数据库类中的动态绑定

假如可以用基于 odbc 的类动态绑定列,对这种行为的支持就不会内置于 mfc 类中。动态绑定会内置在 dao 数据库类中,而且执行起来相当容易。

还可以做一些其它的事情以优化性能,如检索记录的一部分而不是整个记录。在本陈述的稍后部分中,我们将提供一些可以优化应用程序的方法。

dfx 和动态绑定不是互相排斥的选择方案。通过 dao 数据库类,可以将静态和动态绑定调用混合,以实现最大效率。

dao 数据库类中的双缓冲

在 mfc 的 cdaorecordset 类中,双缓冲是一种当记录集内的当前记录发生更改时简化检测的机制。当添加新记录和编辑现有记录时,对您的 dao 记录集使用双缓冲会减少必需的工作量。默认情况下,您的 mfc dao 记录集保留编辑缓冲区的第二份副本(记录集类的字段数据成员,全体复制;dao“帮助”中称相应的缓冲区为“复制缓冲区”)。当您对数据成员进行更改时,mfc 会拿它们与副本(“双缓冲区”)进行比较以检测更改。

双缓冲的代用方法 - 不保留数据的副本 - 当编辑当前记录的字段时,要求您进行其它函数调用。

双缓冲一直是基于 odbc 的数据库类的一部分。对于 dao 数据库类,假如需要,您可以停用该机制以提高效率。

该机制的主开关名为 m_bcheckcachefordirtyfields,dirty 意思是“已更改”。假如将此开关置于 on(开),就可以对全部或部分字段启用双缓冲。假如该主开关是 off(关),就会禁用整个双缓冲机制。

您最想关闭其双缓冲的字段包括备注字段、图片字段,以及其它 blob(大型二进制对象)。

dao sdk 中含有一些 c++ 数据库类,这些类彼此独立,而且不同于 mfc dao 数据库类。这些 c++ 类将单个对象封装到 dao 层次结构中。虽然您可以将 dao sdk c++ 类与 mfc dao 数据库类混合,但 dao sdk c++ 类不遵循操作符超载的 mfc 准则,并且在混合使用这些类时您必须当心。

mfc odbc 数据库类使用 microsoft access 和 visual basic 中的记录集模型。您可以用内置于类中的成员函数对记录进行筛选、分类、滚动以及其它处理。基础 odbc 驱动程序会影响特殊应用程序的功能。因此,若要使可移植性更强,您的应用程序就必须更具有通用性,或者必须依赖于更低级别的 odbc 功能。如有必要,可以直接调用 odbc,以完成特殊任务。现在,让我们检查该集合中的单个类。

就象使用 mfc 那样,必要时可以调用基础 api(在此情况下为 odbc)。

一个 cdatabase 对象代表一个到数据源的连接,通过此连接您可以在数据源上进行操作。数据源是指以某些数据库管理系统 (dbms) 作为宿主的指定数据实例。具体示例包括 microsoft sql server、microsoft access、borland dbase 和 xbase。您可以在自己的应用程序中同时让一个或多个 cdatabase 对象处于活动状态,并且可以保持到一个数据库对象的多个连接。

一个 crecordset 对象代表从数据源中选择的一个记录集合。称为“记录集”的 crecordset 对象有三种可用的形式:动态集、快照、动态记录集。动态集是与其他用户的更新保持同步的记录集。快照是静态记录集,它反映的是抓拍快照时数据库的状态。动态记录集类似于动态集,但通常只用于 microsoft sql server。每种形式都代表在打开记录集时确定的记录集合,但当您在动态集内或动态记录集内滚动到一条记录时,它反映后来由其他用户或您应用程序中的其它记录集对记录所做的更改。

mfc 4.2 以书签的形式向 crecordset 类中添加新的导航功能,并添加标识及导航到记录的 absoluteposition 的能力。书签是唯一的标识符,通过调用该标识符可返回指定的记录。

大多数 mfc 开发人员都熟悉开放式数据库连接 (odbc) 数据库类 - 它们早在三年半以前就出现了。在 mfc 4.2 中,对这些类有一些重要的改进。

身为 c++ 开发人员,您可能不熟悉 dao,因为到目前为止它还只可用于 microsoft access 和 visual basic® 程序设计系统。假如您熟悉 dao,就必须了解:dao 在 mfc 中的实现颇有不同,但包罗广泛。

了解 mfc odbc 类的开发人员必须知道:虽然 mfc dao 类比 odbc 类功能性更强,但 dao 类不能代替它们。

对于那些不怎么熟悉 mfc 的人,我想提醒一句:mfc 有一个适用于各种数据库类的设计原则。

mfc 像一张薄薄的包装纸那样,封装 windows® 操作系统 api,提供您想要的 c++ 性能,同时提供您需要的抽象概念。当基础 api 具有实际意义时,向其添加值。可是多数时候 mfc 力图保持不为人触及。

就如 mfc 封装更复杂的 api 一样,数据库类也封装更复杂的技术。因为 mfc 可以在 intel、unix 和 alpha 之间进行移值,所以数据库应用程序解决方案也是可移值的。

我们与 microsoft access、visual basic 使用相同的记录集模型,因此,已经使用那些产品的开发人员不必学习新的范例。另外,两个类集的体系结构基本相同,使用其中一个类集的开发人员可以轻松地切换到另一个类集并使用它。

mfc 数据库类

自从 1.5 版之后,mfc 中就已经包含 odbc 数据库类。visual c++ 2.0 版提供了含有相同类的 32 位版本。这些类基于一个工业认可标准,并已得到广泛应用,且因其 odbc 具有可移植性而受到其它数据库开发选择方案的青睐。这种可移植性是指能够将许多 odbc 数据源与用这些类创建的应用程序一起使用。近来的性能改进使得 odbc 数据库类成为一个吸引人的选择方案。

在多数情况下,mfc 4.0 中的 dao 数据库类允许您直接访问桌面数据源而无须使用 odbc。dao 数据库类所具有的同时打开多个数据库类型的能力、使用多数据源的能力以及数据定义语言能力,使其成为重要的开发选择方案。

现在,您已经准备好提出这个问题,自己应使用哪个数据库类集合。假如您所提供的有关自己项目的信息不多,就很难确定这个问题的答案。但是,第一件要考虑的事情是您使用什么数据源。假如您通常使用桌面数据,我们鼓励您考虑 mfc dao 数据库类,因为您将会发现它们极为有效且功能强大。假如您主要使用 odbc(基于服务器)的数据,则使用基于 odbc 的类会使您项目的进展更富成效。

其它考虑事项包括网络种类、可伸缩性要求,以及速度是否是最重要的因素。最好是用您认为工作得最好的数据库类集让应用程序保持原型。可以进行一些基准测试,以确定您的最佳性能选择。

真正的决定权在您

您可用来创建数据库应用程序的选项集合很大。它实际是完整的一系列选项,一端是桌面数据库应用程序,另一端是严格的客户/服务器数据库应用程序。仅有的两种看似明显的选择可能是:在 microsoft access 97 mdb 数据中使用 mfc dao 数据库类,而在 microsoft sql server ™ 6.5 中使用 mfc odbc 数据库类。这两种组合主要是互相配合使用的,均非常有效。但您可能已对这些选择有所了解,其它情况又该如何呢

简要地说,以下是您赖以决策的过程:

◆确定数据源需求
您需要的数据库有多大 一次会有多人需要访问数据吗 有时,其余的大多数步骤均取决于您选择的数据源。

◆确定接口需求
假如您需要的接口有大量的用户输入(如用户可以设计自己的查询),那么在调整和分发数据库(一个或多个)时就必须要慎重。例如,假如需要用变化不大的数据填充列表框,并且已选择基于服务器的数据源,则将通常不变化的数据存储在本地而非服务器上,是一种有意义的做法。

◆确定连接性需求
目前使用的网络协议有很多种,每种协议都对通过网络传送的数据各有不同影响。关于网络的讨论不是本白皮书份内之事,但您需要了解如何优化自己的数据库应用程序,以避免遇到网络的数据陷阱。

◆选择适当的工具(一个或多个)
microsoft 为数据库开发人员提供了多种可选择的工具(microsoft access、visual basic、visual basic enterprise、visual c++/mfc 以及 sql server),在某些情况下它们的功能略有重叠。本白皮书旨在讨论 visual c++/mfc 选项。但假如您还未考虑其它选项,应该也对它们稍加了解。

◆在实施前保持原型
在本文中您将数次看到此陈述,因为它很重要。您可能已做了很好的选择,但除非您的解决方案真的起了作用,否则工作就不算完成!

此外,关于本文,我们假设您想了解的是 mfc 的数据库类。我们不妨尽可能多地检查一些选择方案,以便您认可您想为自己的第一个原型采用的指导。

类 crecordview 是一种 mfc 构造 - 一种显示数据的形式。因为 crecordview 是基于 cformview 的,所以它具有该基础类的所有遗传功能。从本质上说,窗体视图在窗口的客户端区域伸展对话框模板。这使得添加控件与显示字段数据极为容易。

当使用 appwizard 和 classwizard 创建基于 odbc 的数据库应用程序时,记录集的列会自动绑定到(静态地)成员变量,这些变量可以随后添加到对话框模板中。

一个 cdbexception 对象代表一种由数据库类引起的异常错误条件。该类中含有两个公共数据成员,可使用这两个成员确定导致异常错误的原因,或显示对异常错误进行说明的文本消息。cdbexception 对象由数据库类的成员函数构造与抛出。

cfieldexchange 类支持由数据库类使用的记录字段交换 (rfx) 例程。假如您正在编写自定义数据类型的数据交换例程,则使用该类;否则,您不会直接使用该类。rfx 在您记录集对象的字段数据成员和数据源上当前记录的相应字段之间交换数据。rfx 管理两个方向中的交换,即来自数据源的交换与到数据源的交换。

在 dao 的本机格式中,包含 21 个对象和 20 个集合。而且,dao 不仅提供单个的对象,如表和字段,还提供对象所属的集合。对象的这种清晰的层次结构使得能够轻松地将面向对象的原理应用于数据库开发。

dao 的存在已有一段时间。dao 1.0 版出现在 microsoft access 1.0 版中,它仅提供到表与查询结构的接口,以及代表具有数量有限的属性的表、动态集、快照的对象。visual basic 3.0 版中的 data access objects 1.0 添加了 tabledef、querydef 和 field 对象,以提供可编程的结构。

microsoft access 2.0 版中的 dao 2.0 版有 ole 自动化的雏形,以及对几乎所有 microsoft jet 功能的全部编程访问权限。它拥有具有可靠的对象与属性集合的全部对象模型。

dao 2.5 版中含有 odbc 桌面数据库驱动程序 (odbc desktop database driver),这些驱动程序是为 16 位平台能与 odbc desktop database drivers 2.0 版一起使用而创建的。该 16 位版本是为用于 visual basic 4.0 版的 16 位版本而安装的。

dao 3.0 版随带在 microsoft access for windows 95、visual basic 4.0 版(32 位)、microsoft excel 7.0 版 和 visual c ++ 4.0 版中。dao 得到了增强,以支持任何兼容主机的单机接口。

dao 3.5 版随带在 microsoft access for windows 97 中,并且含有新的 odbcdirect com 对象。mfc dao 数据库类不包括这些对象的类。

最为重要的是,dao 接口是基于 ole com 的,它很好地安置 dao 以适应不断发展的技术和操作系统。

SQL Server MFC DAO类和MFC ODBC类(1)
示意图1

此处是 dao 层次结构图表。在顶端,将看到 dbengine 对象,该对象中含有所有其它对象。这是唯一没有集合的对象,因为您只能有一个引擎。但可以有多个工作区 (workspace)、数据库 (database) 等等,这正是余下的对象都有自己所属集合的原因。

在工作区中,可以有多个数据库,一个基本表 (.mdb) 或一个附加/链接的表。在每个数据库中将有一个或多个表、查询、记录集,而其中的每个表、查询、记录集不仅包含字段和(或)索引,还有其它类型的对象。

另外,与工作区连接的是用户对象和组对象,它们形成了 dao 的安全模型。

独立但与引擎对象连接的是 errors 对象。

errors 集合中对象的附加方式不同于其它 dao 集合。最详细的错误放在集合的末尾,最常规的错误放在开头。

mfc 和 dao

现在要谈的是 mfc 如何实现 dao。因为我们不是分别包装每个 dao 对象,所以实际上 mfc 会平展 dao 的层次结构。我们为您提供 8 个对象而不是 21 个对象。

我们封装所有的 dao 功能,除 security 对象外 - users 对象、groups 对象以及新的 odbcdirect 对象。这是我们有意而为。例如,我们觉得在查看安全性对象时,围绕它们创建类将不会给 dao 的使用添加任何值,因此还是让您直接调用 dao,来处理那些对象。这也是与 mfc 原则一致的:应该在对添加值的立场而言有意义的地方创建类。但我们仍会在 mfc technical note 54 中提供关于如何实现安全性模型的指导。

另外,我们还管理 dao 要将对象追加到集合的要求。在 dao 中,您创建对象,然后将它追加到集合中。除一种例外情况外,这种添加是自动完成的。对于这种例外情况,可作为一个单独的步骤来设置开发人员能否追加对象,这是很用的。

虽然可能用 odbc 数据库类进行动态绑定,但实现这一目的的功能并非 mfc 类的内置功能。它被置入 dao 数据库类,您可以相当轻松地进行动态绑定。现在我们的第二个演示将更多地谈及这一点。

dao 提供来自 sql 的数据定义语言 (ddl),以便您创建数据库、表、记录集等。在 odbc 中没有 ddl。

最后,当您需要时,总是可以对基础 dao ole 对象进行直接调用。

mfc dao 数据库类的层次结构

SQL Server MFC DAO类和MFC ODBC类(1)
示意图2

五个由 cobject 派生的 mfc dao 类(cdaoworkspace、cdaodatabase、cdaotabledef、cdaoquerydef 和 cdaorecordset)具有该基础类的所有功能。

cdaoexception 由 cexception 派生得到,具备该类的优点,包括显示来自基础 dao errors 对象的错误消息的能力。

如前面提到的那样,cdaorecordview 由 cformview 派生得到,而 cformview 又由 cscrollview 派生得到,依次类推。可以看到 cdaorecordview 类在快速而轻松地实现基于窗体的数据显示方面所具有的全部优点。此外,还有对于 cdaorecordview 的向导支持。该类中的功能实质上是与 crecordview 类一样的。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如要创建自定义的 dfx 例程,只要直接调用该对象即可。

mfc dao 数据库类

cdaoworkspace 封装 dbengine 对象和 workspace 对象。mfc dao 类提供工作区的事实非常重要。odbc 数据库类不同时支持多个数据库连接。

事务处理是在 dao 数据库类中的 workspace(工作区)级别完成的,而不是在 odbc 类中的 recordse(记录集)级别完成的。一个事务可能会影响所有打开的数据库和记录集,或者您可以隔离事务,使其只会影响指定的数据库,等等。

多数时候,您不必担心工作区对象的创建。假如您未创建,mfc 就将为您打开一个工作区对象。假如您需要的话,dao 数据库类可支持多个工作区。

最后,您不必担心工作区对象超出范围或是在数据库会话完成前关闭。可以使用工作区指针访问工作区集合,访问数据库集合,以及访问数据库引擎的属性等。

cdaodatabase

cdaodatabase 在体系结构上类似于基于 odbc 的 cdatabase 类。cdaodatabase 也封装数据库连接。因为您不必总是使用 odbc,所以对于大多数桌面数据源,数据源的位置就表达为路径。cdaodatabase 可以存储 tabledef 和 querydef 对象,为您的开发提供了极大方便。cdaodatabase 可使用本地及远程数据源。在本白皮书的稍后部分,有一个可供您使用的数据源的列表。

该数据库对象在会话期间也一直继续存在。必要时可以明确地关闭数据库连接。仅就比较而言,cdatabase 类有 21 个成员函数,而 cdaodatabase 有 26 个成员函数。这些成员函数中彼此相应的都非常相似,在 cdaodatabase 中还有几个没有对应成员函数。

在 odbc 数据库类中没有与 cdaotabledef 相应的类。tabledef 对象让您检查数据库的架构(结构),不论表是本机 microsoft access 表(基本表)还是链接的表。假如用 dao 直接打开外部数据源,就可向其中添加字段和索引。假如您链接了表,就可以检查结构,但不能更改它。可以将表作为记录集的基础。这样做会使您获得几个好处,包括使用名为 seek 的快速搜索成员函数。

使用 cdaotabledef 可以确定是否可通过调用 cdaotabledef::canupdate 编辑表中的数据。mfc 负责为您管理 dao field 和 index 集合。使用 cdaotabledef 时,您可以选择是否向 tabledefs 集合中追加表;而使用所有其它对象时,会自动进行追加。

您用来检索记录的 sql 存储在 cdaoquerydef 对象中。您可用该对象存储您提出的有关数据的“问题”,如“how many customers did x dollars of business last month ”。可以检索或重新使用存储的查询,可按下列三种方法之一使用它们:

通过将指针传递到 cdaoquerydef 对象而创建记录集。

直接执行操作查询,即移动或更改数据的查询。操作查询包括追加、删除、生成表以及更新查询。删除查询和更新查询会更改现有数据;附加查询和生成表查询会移动现有数据。

执行 sqlpassthrough 查询:sql 直接传递查询是直接发送到数据库服务器而不会被 microsoft jet 数据库引擎中断的 sql 语句。sql 直接传递查询为您的应用程序提供直接使用数据库服务器的功能的能力。

另外,cdaorecordset 还很类似于基于 odbc 的 crecordset 类。记录集不仅可以基于表,也可以基于动态集和快照。请记住,记录集代表您已检索到的记录和穿过数据的方法。移动并滚动数据的方法包括 seek(只用于表类型的记录集)、find 和 move 操作,以及 absoluteposition 和(假如您的数据源支持的话)书签。书签是唯一的标识符,可通过调用该标识符来返回指定的记录。

mfc dao 数据库类中的大部分功能是存在于 cdaorecordset 中的。crecordset 只有 44 个成员函数,与之相比 cdaorecordset 有 91 个成员函数。这种额外的功能表现为字段值的导航、高速缓存、设置和检索中,以及记录集属性的设置和检索。

cdaorecordview 和 crecordview 类有几乎相同的功能。另外,它们都还具有因基于 cformview 而获得的优点。请记住,窗体视图就好象在窗口的客户端区域伸展的对话框模板一样,有了它,添加控件与显示字段数据就很容易。appwizard 和 classwizard 支持基于窗体的数据显示。假如使用 appwizard 创建初始应用程序,您数据库中的列就会自动绑定到成员变量。

对于 dao 数据库类,异常错误处理略有不同。类 cdaoexception 将返回基础 dao ole 对象的错误消息。多数时候,您可以检索的错误信息要比通常采用基于 odbc 的类所获得的错误信息多。在 mfc 中,所有 dao 错误都表达为 cdaoexception 类型的异常错误。

当捕获到这种类型的异常错误时,可以使用 cdaoexception 成员函数从任何存储在数据库引擎 errors 集合中的 dao 错误对象中检索信息。每个错误发生时,都会有一个或多个错误对象放入 errors 集合中。当另一个 dao 操作生成错误时,errors 集合被清除,新的错误对象被放入 errors 集合。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如您正在编写自定义数据类型的数据交换例程,则使用该类;否则,您不会直接使用该类。dfx 在您 cdaorecordset 对象的字段数据成员和数据源上当前记录的相应字段之间交换数据。dfx 管理两个方向中的交换,即来自数据源的交换与到数据源的交换。若需关于编写自定义 dfx 例程的信息,请参见 technical note 53(可在 books online 中的 mfc 下找到)。

cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。dfx 操作是在类型的记录集类数据成员上执行的,这些类型由 cdaofieldexchange 中的 enum fieldtype 定义。可能的 fieldtype 值有:

用于字段数据成员的 cdaofieldexchange::outputcolumn。

用于参数数据成员的cdaofieldexchange::param。

SQL Server MFC DAO类和MFC ODBC类(1)
图1:mfc 的 odbc 数据库类

这里是基于 odbc 的数据库类的图片,与您所了解的相同。顶端的栏代表基于 odbc、与 odbc 交谈的 mfc 类。每个数据库的 odbc 驱动程序都解释 sql 调用,并针对每个数据源对其进行转换。许多数据源都与相应的驱动程序一起显示在关系图的底部,以提醒您 odbc 的灵活性。

图 2 是 dao 数据库类的图片。它们通过含有 dao 的 ole 进行通信,dao 与 jet 数据库引擎交谈。jet 数据库引擎有一些独立的 dll,用于与各种桌面数据源进行通信。

SQL Server MFC DAO类和MFC ODBC类(1)
图2:mfc dao 数据库类 - 桌面数据源

microsoft jet 数据库引擎可以直接打开诸如 foxpro® 数据库和 paradox 等的数据源。但只要您不需要更改这些数据源的架构,就可以将这些表链接到 microsoft access 数据库中,实际上这会更有效。这就是 foxpro 和 paradox 表(它们仅是示例)显示在两个位置的原因。虚线用以暗示当可能直接打开数据源时,它的效率会更低。

被链接表的外观及工作方式与 microsoft jet 数据库中的任何其它表一样(虽然在连接到远程数据和检索远程数据方面略微有些性能差异)。建立和维护与远程数据源连接所需要的信息存储在表定义中。

相反,当您直接打开表时,必须在每个会话开始时提供连接信息,以便建立与数据源的连接。建立与远程数据源的连接所需要的信息都不存储在 microsoft jet 数据库中。若要直接打开表,就必须使用 cdaotabledef::create,并且必须提供连接信息(如数据源、用户名、密码和数据库名称)。

SQL Server MFC DAO类和MFC ODBC类(1)
图3:mfc dao 数据库类,包括 sql 数据库

假如使用 dao 数据库类,就可以经由 odbc 访问服务器类型的数据库(如 microsoft sql server 和 oracle)。图 3 不是完整的图片,因为它并没有包括对所有类型数据源的访问。

最后,图 4 是关于 mfc 数据库类的完整图片。请注意,mfc 栏和 odbc 栏上的垂直线表示指派两个数据库类集用作“非此即彼”决策。您可以选择访问所有类型的数据源,但不能混合两个集合中的 mfc 数据库类。

SQL Server MFC DAO类和MFC ODBC类(1)
图4:mfc 数据库类

odbc 数据库类的数据源选择

当您用 mfc odbc 类编写应用程序时,可以连接到任何数据源(只要您有它的 odbc 驱动程序)。odbc 驱动程序管理器和 odbc 驱动程序的操作在您用这些类编写的应用程序中是透明的,但个别驱动程序性能会影响应用程序的功能。

通常,mfc 动态集(但并非只向前滚动的记录集)要求 odbc 驱动程序具有 2 级 api 一致性。假如数据源的驱动程序符合 1 级 api 设置,您就仍可以使用可更新且只读的快照与只向前滚动的记录集,但不能使用动态集。然而,假如 1 级驱动程序支持扩展的提取和键集驱动游标,它就可以支持动态集。

odbc desktop driver pack 3.0 版支持 2 级 odbc api 调用 sqlextendedfetch。

appwizard 和 classwizard 会自动将数据源的列静态地绑定到您应用程序的成员变量中。这是在您应用程序与数据源之间建立连接的最简单的方法,但不是最灵活的方法。可以用类 cfieldexchange 将自定义的记录字段交换 (rfx) 调用添加到您的应用程序中。请参见“technical note 43:rfx routines”,以获取更多信息。

另外,还可以考虑动态地绑定数据库的列。在最普通的级别中可执行下列步骤:

◆构造您的主要记录集对象。然后,可以将指针传递给一个打开的 cdatabase 对象,或者也可以用其它方法向列记录集提供连接信息。
◆执行一些步骤,动态地添加列。
◆打开您的主要记录集。
◆记录集会选择记录,并使用记录字段交换 (rfx) 绑定“静态”列(映射到记录集字段数据成员的列)和动态列(映射到您分配的额外存储的列)。

dao 数据库类的数据源选项

现在大家要谈的是您可以用 dao 数据库类连接的数据源、列的静态绑定、列的动态绑定,以及记录的双缓冲。

既然 microsoft access 数据库是 jet 的本机数据库,您自然就可以以最快速度访问它们。microsoft access 97 具有的数据库格式是 dao 3.5 版的本机数据库格式。假如使用 microsoft access 97 数据库,将获得最为快速的性能。

jet 使用单独的 dll 提供对 microsoft jet 1.x 和 2.0 版数据库的访问权限。存储引擎和格式完全是用 microsoft jet 3.0 版修订的。假如更改之处很多,microsoft jet 3.0 版就会将 2.0 版数据库视为外部 isam,这会影响性能。因此,这也是促使您应该考虑将 microsoft access 数据库升级的合理原因。

另外,您还可以访问可安装的 isam 数据库和 odbc 数据源。isam(基于索引的连续访问方法)数据库,如 foxpro 和 dbase,可以直接打开,也可以链接到 access 数据库以实现最佳性能。下面是 dao 可以访问的数据源的列表:

◆microsoft foxpro 的 2.0、2.5 和 2.6 版。在 3.0 版中可以导入与导出数据,但不能创建对象。
◆dbase iii、dbase iv 和 dbase 5.0
◆paradox 的 3.x、4.x 和 5.x 版
◆btrieve 的 5.1x 和 6.0 版
◆microsoft excel 的 3.0、4.0、5.0、7.0 和 8.0 版工作表
◆lotus wks、wk1、wk3、wk4 电子表格

文本文件

请记住,microsoft access 的 1.x、2.0 和 7.0 版数据库都属于此类别。

可以通过 odbc 访问 odbc 数据源,如 sql server 和 oracle,因此您可以选择针对这些数据源使用 dao。一个 odbc 数据源可以来自任何 dbms,只要您拥有该 dbms 的适当的 odbc 驱动程序。对于 visual c++ 2.0 版或更高版本,您需要 32 位的 odbc 驱动程序(但 win32 除外,在 win32 中需要 16 位的 odbc 驱动程序)。下面是此版本 visual c++ 所包含的 odbc 驱动程序列表。

◆sql server
◆microsoft access
◆microsoft foxpro
◆microsoft excel
◆dbase
◆paradox
◆文本文件

microsoft desktop database drivers 3.0 版(它包含列表中的最后六项)为这些数据源提供最佳性能。这些只限 32 位驱动程序。

将外部数据源(如 sql server)链接到 microsoft access 表是最有效的处理数据访问的方法。在将应用程序连接到远程数据源以前,必须先确保应用程序的用户可以访问远程数据,并且确保正确地设计您的应用程序,以解决远程数据源安全性难题。另外,您还必须确保应用程序能够正确地与区分大小写的数据源进行交流,并且确保正确地初始化可安装的 isam,以用于您想访问的数据源。最后,您必须检查您的代码,以确保在访问非 jet 数据源时,代码没有使用 microsoft jet 数据源专用的对象或调用。

设置链接最简捷的方法是:进入 microsoft access。假如用的是 microsoft access 2.0 版,则使用“文件”/“附加表”命令;假如用的是 microsoft access 95 和 microsoft access 97,则使用“文件”/“获取外部数据”/“链接表”命令。

连接信息存储在您所使用的基本表 (.mdb) 中。假如移动了外部数据的位置,就必须在 microsoft access 中或从代码中调用 cdaotabledef::refreshlink,重新建立链接。

dao 记录字段交换机制与在基于 odbc 的数据库类中的 rfx 有着相同的工作方式。记录集对象的字段数据成员假如联系在一起,就形成一个“编辑缓冲区”,以保存一个记录的选定列。当记录集第一次打开并要读取第一条记录时,dfx 就会将每个选定列与适当字段数据成员的地址绑定(关联)在一起。当记录集更新一条记录时,dfx 调用 dao 以向数据库引擎发送适当的命令。dfx 利用它对字段数据成员所了解的内容,指定要写入的数据源中的列(字段)。

向导支持列的静态绑定。您可以添加自己的 dfx 调用,就象使用基于 odbc 的类时那样。首先,对于每个绑定字段和参数,都必须将成员添加到 cdaorecordset 派生的类中。接下来,cdaorecordset::dofieldexchange 应被替代。请注意,成员的数据类型很重要。它应与来自数据库字段中的数据匹配,或者至少可转换成那种类型。mfc technical #53 更详细地讲述了此过程。

cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。假如您正在编写自定义数据类型的数据交换例程,则使用该类。cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。

dao 数据库类中的动态绑定

假如可以用基于 odbc 的类动态绑定列,对这种行为的支持就不会内置于 mfc 类中。动态绑定会内置在 dao 数据库类中,而且执行起来相当容易。

还可以做一些其它的事情以优化性能,如检索记录的一部分而不是整个记录。在本陈述的稍后部分中,我们将提供一些可以优化应用程序的方法。

dfx 和动态绑定不是互相排斥的选择方案。通过 dao 数据库类,可以将静态和动态绑定调用混合,以实现最大效率。

dao 数据库类中的双缓冲

在 mfc 的 cdaorecordset 类中,双缓冲是一种当记录集内的当前记录发生更改时简化检测的机制。当添加新记录和编辑现有记录时,对您的 dao 记录集使用双缓冲会减少必需的工作量。默认情况下,您的 mfc dao 记录集保留编辑缓冲区的第二份副本(记录集类的字段数据成员,全体复制;dao“帮助”中称相应的缓冲区为“复制缓冲区”)。当您对数据成员进行更改时,mfc 会拿它们与副本(“双缓冲区”)进行比较以检测更改。

双缓冲的代用方法 - 不保留数据的副本 - 当编辑当前记录的字段时,要求您进行其它函数调用。

双缓冲一直是基于 odbc 的数据库类的一部分。对于 dao 数据库类,假如需要,您可以停用该机制以提高效率。

该机制的主开关名为 m_bcheckcachefordirtyfields,dirty 意思是“已更改”。假如将此开关置于 on(开),就可以对全部或部分字段启用双缓冲。假如该主开关是 off(关),就会禁用整个双缓冲机制。

您最想关闭其双缓冲的字段包括备注字段、图片字段,以及其它 blob(大型二进制对象)。

dao sdk 中含有一些 c++ 数据库类,这些类彼此独立,而且不同于 mfc dao 数据库类。这些 c++ 类将单个对象封装到 dao 层次结构中。虽然您可以将 dao sdk c++ 类与 mfc dao 数据库类混合,但 dao sdk c++ 类不遵循操作符超载的 mfc 准则,并且在混合使用这些类时您必须当心。

mfc odbc 数据库类使用 microsoft access 和 visual basic 中的记录集模型。您可以用内置于类中的成员函数对记录进行筛选、分类、滚动以及其它处理。基础 odbc 驱动程序会影响特殊应用程序的功能。因此,若要使可移植性更强,您的应用程序就必须更具有通用性,或者必须依赖于更低级别的 odbc 功能。如有必要,可以直接调用 odbc,以完成特殊任务。现在,让我们检查该集合中的单个类。

就象使用 mfc 那样,必要时可以调用基础 api(在此情况下为 odbc)。

一个 cdatabase 对象代表一个到数据源的连接,通过此连接您可以在数据源上进行操作。数据源是指以某些数据库管理系统 (dbms) 作为宿主的指定数据实例。具体示例包括 microsoft sql server、microsoft access、borland dbase 和 xbase。您可以在自己的应用程序中同时让一个或多个 cdatabase 对象处于活动状态,并且可以保持到一个数据库对象的多个连接。

一个 crecordset 对象代表从数据源中选择的一个记录集合。称为“记录集”的 crecordset 对象有三种可用的形式:动态集、快照、动态记录集。动态集是与其他用户的更新保持同步的记录集。快照是静态记录集,它反映的是抓拍快照时数据库的状态。动态记录集类似于动态集,但通常只用于 microsoft sql server。每种形式都代表在打开记录集时确定的记录集合,但当您在动态集内或动态记录集内滚动到一条记录时,它反映后来由其他用户或您应用程序中的其它记录集对记录所做的更改。

mfc 4.2 以书签的形式向 crecordset 类中添加新的导航功能,并添加标识及导航到记录的 absoluteposition 的能力。书签是唯一的标识符,通过调用该标识符可返回指定的记录。