📄 45901.htm
字号:
<P>虽然可能用 odbc 数据库类进行动态绑定,但实现这一目的的功能并非 mfc 类的内置功能。它被置入 dao 数据库类,您可以相当轻松地进行动态绑定。现在我们的第二个演示将更多地谈及这一点。</P>
<P>dao 提供来自 sql 的数据定义语言 (ddl),以便您创建数据库、表、记录集等。在 odbc 中没有 ddl。</P>
<P>最后,当您需要时,总是可以对基础 dao ole 对象进行直接调用。</P>
<P><STRONG>mfc dao 数据库类的层次结构</STRONG></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/1154171.gif"></TD></TR>
<TR>
<TD class=it align=middle bgColor=#dddddd>示意图2</TD></TR></TBODY></TABLE>
<P>五个由 cobject 派生的 mfc dao 类(cdaoworkspace、cdaodatabase、cdaotabledef、cdaoquerydef 和 cdaorecordset)具有该基础类的所有功能。</P>
<P>cdaoexception 由 cexception 派生得到,具备该类的优点,包括显示来自基础 dao errors 对象的错误消息的能力。</P>
<P>如前面提到的那样,cdaorecordview 由 cformview 派生得到,而 cformview 又由 cscrollview 派生得到,依次类推。可以看到 cdaorecordview 类在快速而轻松地实现基于窗体的数据显示方面所具有的全部优点。此外,还有对于 cdaorecordview 的向导支持。该类中的功能实质上是与 crecordview 类一样的。</P>
<P>cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。如果要创建自定义的 dfx 例程,只要直接调用该对象即可。</P>
<P><STRONG>mfc dao 数据库类</STRONG></P>
<P>cdaoworkspace 封装 dbengine 对象和 workspace 对象。mfc dao 类提供工作区的事实非常重要。odbc 数据库类不同时支持多个数据库连接。</P>
<P>事务处理是在 dao 数据库类中的 workspace(工作区)级别完成的,而不是在 odbc 类中的 recordse(记录集)级别完成的。一个事务可能会影响所有打开的数据库和记录集,或者您可以隔离事务,使其只会影响指定的数据库,等等。</P>
<P>多数时候,您不必担心工作区对象的创建。如果您未创建,mfc 就将为您打开一个工作区对象。如果您需要的话,dao 数据库类可支持多个工作区。</P>
<P>最后,您不必担心工作区对象超出范围或是在数据库会话完成前关闭。可以使用工作区指针访问工作区集合,访问数据库集合,以及访问数据库引擎的属性等。</P>
<P>#p#</P>
<P><STRONG>cdaodatabase</STRONG></P>
<P>cdaodatabase 在体系结构上类似于基于 odbc 的 cdatabase 类。cdaodatabase 也封装数据库连接。因为您不必总是使用 odbc,所以对于大多数桌面数据源,数据源的位置就表达为路径。cdaodatabase 可以存储 tabledef 和 querydef 对象,为您的开发提供了极大方便。cdaodatabase 可使用本地及远程数据源。在本白皮书的稍后部分,有一个可供您使用的数据源的列表。</P>
<P>该数据库对象在会话期间也一直继续存在。必要时可以明确地关闭数据库连接。仅就比较而言,cdatabase 类有 21 个成员函数,而 cdaodatabase 有 26 个成员函数。这些成员函数中彼此相应的都非常相似,在 cdaodatabase 中还有几个没有对应成员函数。</P>
<P>在 odbc 数据库类中没有与 cdaotabledef 相应的类。tabledef 对象让您检查数据库的架构(结构),不论表是本机 microsoft access 表(基本表)还是链接的表。如果用 dao 直接打开外部数据源,就可向其中添加字段和索引。如果您链接了表,就可以检查结构,但不能更改它。可以将表作为记录集的基础。这样做会使您获得几个好处,包括使用名为 seek 的快速搜索成员函数。</P>
<P>使用 cdaotabledef 可以确定是否可通过调用 cdaotabledef::canupdate 编辑表中的数据。mfc 负责为您管理 dao field 和 index 集合。使用 cdaotabledef 时,您可以选择是否向 tabledefs 集合中追加表;而使用所有其它对象时,会自动进行追加。</P>
<P>您用来检索记录的 sql 存储在 cdaoquerydef 对象中。您可用该对象存储您提出的有关数据的“问题”,如“how many customers did x dollars of business last month?”。可以检索或重新使用存储的查询,可按下列三种方法之一使用它们:</P>
<P>通过将指针传递到 cdaoquerydef 对象而创建记录集。</P>
<P>直接执行操作查询,即移动或更改数据的查询。操作查询包括追加、删除、生成表以及更新查询。删除查询和更新查询会更改现有数据;附加查询和生成表查询会移动现有数据。</P>
<P>执行 sqlpassthrough 查询:sql 直接传递查询是直接发送到数据库服务器而不会被 microsoft jet 数据库引擎中断的 sql 语句。sql 直接传递查询为您的应用程序提供直接使用数据库服务器的功能的能力。</P>
<P>另外,cdaorecordset 还很类似于基于 odbc 的 crecordset 类。记录集不仅可以基于表,也可以基于动态集和快照。请记住,记录集代表您已检索到的记录和穿过数据的方法。移动并滚动数据的方法包括 seek(只用于表类型的记录集)、find 和 move 操作,以及 absoluteposition 和(如果您的数据源支持的话)书签。书签是唯一的标识符,可通过调用该标识符来返回指定的记录。</P>
<P>mfc dao 数据库类中的大部分功能是存在于 cdaorecordset 中的。crecordset 只有 44 个成员函数,与之相比 cdaorecordset 有 91 个成员函数。这种额外的功能表现为字段值的导航、高速缓存、设置和检索中,以及记录集属性的设置和检索。</P>
<P>cdaorecordview 和 crecordview 类有几乎相同的功能。另外,它们都还具有因基于 cformview 而获得的优点。请记住,窗体视图就好象在窗口的客户端区域伸展的对话框模板一样,有了它,添加控件与显示字段数据就很容易。appwizard 和 classwizard 支持基于窗体的数据显示。如果使用 appwizard 创建初始应用程序,您数据库中的列就会自动绑定到成员变量。</P>
<P>对于 dao 数据库类,异常错误处理略有不同。类 cdaoexception 将返回基础 dao ole 对象的错误消息。多数时候,您可以检索的错误信息要比通常采用基于 odbc 的类所获得的错误信息多。在 mfc 中,所有 dao 错误都表达为 cdaoexception 类型的异常错误。</P>
<P>当捕获到这种类型的异常错误时,可以使用 cdaoexception 成员函数从任何存储在数据库引擎 errors 集合中的 dao 错误对象中检索信息。每个错误发生时,都会有一个或多个错误对象放入 errors 集合中。当另一个 dao 操作生成错误时,errors 集合被清除,新的错误对象被放入 errors 集合。</P>
<P>cdaofieldexchange 类支持由 dao 数据库类使用的 dao 记录字段交换 (dfx) 例程。如果您正在编写自定义数据类型的数据交换例程,则使用该类;否则,您不会直接使用该类。dfx 在您 cdaorecordset 对象的字段数据成员和数据源上当前记录的相应字段之间交换数据。dfx 管理两个方向中的交换,即来自数据源的交换与到数据源的交换。若需关于编写自定义 dfx 例程的信息,请参见 technical note 53(可在 books online 中的 mfc 下找到)。</P>
<P>cdaofieldexchange 对象提供发生 dao 记录字段交换所需要的上下文信息。cdaofieldexchange 对象支持许多操作,包括绑定参数和字段数据成员,以及在当前记录的字段上设置各种标志。dfx 操作是在类型的记录集类数据成员上执行的,这些类型由 cdaofieldexchange 中的 enum fieldtype 定义。可能的 fieldtype 值有:</P>
<P>用于字段数据成员的 cdaofieldexchange::outputcolumn。</P>
<P>用于参数数据成员的cdaofieldexchange::param。</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/1154172.gif"></TD></TR>
<TR>
<TD class=it align=middle bgColor=#dddddd>图1:mfc 的 odbc 数据库类</TD></TR></TBODY></TABLE>
<P>这里是基于 odbc 的数据库类的图片,与您所了解的相同。顶端的栏代表基于 odbc、与 odbc 交谈的 mfc 类。每个数据库的 odbc 驱动程序都解释 sql 调用,并针对每个数据源对其进行转换。许多数据源都与相应的驱动程序一起显示在关系图的底部,以提醒您 odbc 的灵活性。</P>
<P>图 2 是 dao 数据库类的图片。它们通过含有 dao 的 ole 进行通信,dao 与 jet 数据库引擎交谈。jet 数据库引擎有一些独立的 dll,用于与各种桌面数据源进行通信。</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/1154173.gif"></TD></TR>
<TR>
<TD class=it align=middle bgColor=#dddddd>图2:mfc dao 数据库类 - 桌面数据源</TD></TR></TBODY></TABLE>
<P>microsoft jet 数据库引擎可以直接打开诸如 foxpro® 数据库和 paradox 等的数据源。但只要您不需要更改这些数据源的架构,就可以将这些表链接到 microsoft access 数据库中,实际上这会更有效。这就是 foxpro 和 paradox 表(它们仅是示例)显示在两个位置的原因。虚线用以暗示当可能直接打开数据源时,它的效率会更低。</P>
<P>#p#</P>
<P>被链接表的外观及工作方式与 microsoft jet 数据库中的任何其它表一样(虽然在连接到远程数据和检索远程数据方面略微有些性能差异)。建立和维护与远程数据源连接所需要的信息存储在表定义中。</P>
<P>相反,当您直接打开表时,必须在每个会话开始时提供连接信息,以便建立与数据源的连接。建立与远程数据源的连接所需要的信息都不存储在 microsoft jet 数据库中。若要直接打开表,就必须使用 cdaotabledef::create,并且必须提供连接信息(如数据源、用户名、密码和数据库名称)。</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/1154174.gif"></TD></TR>
<TR>
<TD class=it align=middle bgColor=#dddddd>图3:mfc dao 数据库类,包括 sql 数据库</TD></TR></TBODY></TABLE>
<P>如果使用 dao 数据库类,就可以经由 odbc 访问服务器类型的数据库(如 microsoft sql server 和 oracle)。图 3 不是完整的图片,因为它并没有包括对所有类型数据源的访问。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -