TN055:将 MFC ODBC 数据库类应用程序迁移到 MFC DAO 类

注释

DAO 与 Access 数据库一起使用,并通过 Office 2013 提供支持。 DAO 3.6 是最终版本,它被视为已过时。 Visual C++ 环境和向导不支持 DAO(尽管包含 DAO 类,但仍可使用它们)。 Microsoft建议对新项目使用 OLE DB 模板ODBC 和 MFC 。 应仅在维护现有应用程序时使用 DAO。

概述

在许多情况下,可能需要将使用 MFC 的 ODBC 数据库类的应用程序迁移到 MFC 的 DAO 数据库类。 此技术说明将详细介绍 MFC ODBC 和 DAO 类之间的大部分差异。 考虑到差异,如果需要,不应过于难以将应用程序从 ODBC 类迁移到 MFC 类。

为什么从 ODBC 迁移到 DAO

出于多种原因,你可能希望将应用程序从 ODBC 数据库类迁移到 DAO 数据库类,但决策不一定简单或明显。 需要记住的一点是,DAO 使用的 Microsoft Jet 数据库引擎可以读取具有 ODBC 驱动程序的任何 ODBC 数据源。 使用 ODBC 数据库类或直接调用 ODBC 可能更高效,但 Microsoft Jet 数据库引擎可以读取 ODBC 数据。

使 ODBC/DAO 决策变得容易的一些简单情况。 如果只需访问一种 Microsoft Jet 数据库引擎可以直接读取的数据格式(例如 Access 格式、Excel 格式等),显而易见的选择是使用 DAO 数据库类库。

当数据存在于服务器或各种不同服务器上时,会出现更复杂的情况。 在这种情况下,使用 ODBC 数据库类或 DAO 数据库类的决定是一个难题。 如果您想执行异构联接等操作(从 SQL Server 和 Oracle 等多种格式的服务器联接数据),那么 Microsoft Jet 数据库引擎将为您执行联接,而不是让您进行使用 ODBC 数据库类或直接调用 ODBC 所需的复杂工作。 如果使用支持驱动程序游标的 ODBC 驱动程序,则最佳选择可能是 ODBC 数据库类。

选择可能很复杂,因此你可能想要编写一些示例代码来测试各种方法的性能,以满足你的特殊需求。 此技术说明假定你已决定从 ODBC 数据库类迁移到 DAO 数据库类。

ODBC 数据库类和 MFC DAO 数据库类之间的相似性

MFC ODBC 类的原始设计基于已在 Microsoft Access 和 Microsoft Visual Basic 中使用的 DAO 对象模型。 这意味着 ODBC 和 DAO MFC 类有许多常见功能,本节不会全部列出。 一般情况下,编程模型是相同的。

若要突出显示一些相似之处:

  • ODBC 和 DAO 类都具有使用基础数据库管理系统(DBMS)管理的数据库对象。

  • 两者都具有表示从该 DBMS 返回的一组结果的记录集对象。

  • DAO 数据库和记录集对象的成员几乎与 ODBC 类相同。

  • 使用这两组类时,检索数据的代码完全相同,但某些对象和成员名称更改除外。 更改是必需的,但从 ODBC 类切换到 DAO 类时,此过程通常是一个简单的名称更改。

例如,在这两个模型中,检索数据的过程都是创建和打开数据库对象、创建和打开记录集对象,并通过执行某些操作进行导航(移动)。

ODBC 与 DAO MFC 类之间的差异

DAO 类包括更多对象和更丰富的方法集,但本部分将仅详细说明类似类和功能的差异。

类之间的最明显差异可能是类似类和全局函数的名称更改。 以下列表显示了与数据库类关联的对象、方法和全局函数的名称更改:

类或函数 MFC DAO 类中的等效项
CDatabase CDaoDatabase
CDatabase::ExecuteSQL CDaoDatabase::Execute
CRecordset CDaoRecordset
CRecordset::GetDefaultConnect CDaoRecordset::GetDefaultDBName
CFieldExchange CDaoFieldExchange
RFX_Bool DFX_Bool
RFX_Byte DFX_Byte
RFX_Int DFX_Short
RFX_Long DFX_Long
DFX_Currency
RFX_Single DFX_Single
RFX_Double DFX_Double
RFX_Date1 DFX_Date(基于 COleDateTime
RFX_Text DFX_Text
RFX_Binary DFX_Binary
RFX_LongBinary DFX_LongBinary

1 函数 RFX_Date 基于 CTimeTIMESTAMP_STRUCT

下面列出了对可能影响应用程序功能且需要的不仅仅是简单名称更改的重大变更。

  • 用于指定记录集打开类型和记录集打开选项等作的常量和宏已更改。

    使用 ODBC 类的 MFC,需要通过宏或枚举类型来定义这些选项。

    借助 DAO 类,DAO 在头文件中提供这些选项的定义(DBDAOINT)。H). 因此,记录集类型是 CRecordset 的一个枚举成员,但在使用 DAO 时,它是一个常量。 例如,指定 ODBC 中的类型时使用CRecordset,但在指定类型CDaoRecordset

  • 默认情况下,CRecordset的记录集类型为快照,而CDaoRecordset的记录集类型默认为动态集(有关 ODBC 类快照的其他问题,请参阅以下说明)。

  • ODBC CRecordset 类可以选择创建仅向前记录集类型。 在 CDaoRecordset 类中,仅前移不是记录集类型,而是记录集特定类型的属性(或选项)。

  • 打开 CRecordset 对象时的仅追加记录集意味着记录集的数据可读取并追加。 使用 CDaoRecordset 对象时,仅追加选项意味着记录集的数据只能追加(而不是读取)。

  • ODBC 类的事务成员函数是 CDatabase 的成员,并在数据库级别起作用。 在 DAO 类中,事务成员函数是更高级别的类(CDaoWorkspace)的成员,因此可能会影响共享同一工作区(事务空间)的多个 CDaoDatabase 对象。

  • 异常类已更改。 在 ODBC 类中抛出 CDBExceptions,在 DAO 类中抛出 CDaoExceptions

  • RFX_Date使用CTimeTIMESTAMP_STRUCT对象,而DFX_Date使用COleDateTime。 这 COleDateTimeCTime 几乎完全相同,但是基于 8 字节的 OLE DATE,而不是 4 字节的 time_t,因此它可以容纳更大范围的数据。

    注释

    DAO (CDaoRecordset) 快照为只读,而 ODBC (CRecordset) 快照是可根据驱动程序和 ODBC 光标库的使用进行更新的。 如果您使用游标库,则CRecordset快照是可更新的。 如果您使用的是 Desktop Driver Pack 3.0 中的任何 Microsoft 驱动程序,则 CRecordset 快照为只读。 如果使用的是其他驱动程序,则请检查驱动程序的文档,查看快照 (STATIC_CURSORS) 是否为只读。

另请参阅

按编号列出的技术说明
按类别列出的技术说明