注释
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_Date
1 |
DFX_Date (COleDateTime 基于) |
RFX_Text |
DFX_Text |
RFX_Binary |
DFX_Binary |
RFX_LongBinary |
DFX_LongBinary |
1 函数 RFX_Date
基于 CTime
和 TIMESTAMP_STRUCT
。
下面列出了对可能影响应用程序且需要多个简单名称更改的功能的重大更改。
用于指定记录集打开类型和记录集打开选项等作的常量和宏已更改。
借助 ODBC 类 MFC,需要通过宏或枚举类型定义这些选项。
借助 DAO 类,DAO 在头文件中提供这些选项的定义(DBDAOINT)。H). 因此,记录集类型是枚举成员
CRecordset
,但 DAO 是常量。 例如,指定 ODBC 中的类型CRecordset
时使用快照,但在指定类型CDaoRecordset
时DB_OPEN_SNAPSHOT 。默认记录集类型为快照,而动态集的默认记录集类型
CDaoRecordset
CRecordset
为动态集(有关 ODBC 类快照的其他问题,请参阅以下说明)。ODBC
CRecordset
类可以选择创建仅向前记录集类型。 在类中CDaoRecordset
,仅向前不是记录集类型,而是某些类型的记录集的属性(或选项)。打开
CRecordset
对象时,仅追加记录集意味着可以读取和追加记录集的数据。 使用CDaoRecordset
对象时,仅追加选项意味着记录集的数据只能追加(而不是读取)。ODBC 类的事务成员函数是数据库级别的成员和作成员
CDatabase
。 在 DAO 类中,事务成员函数是更高级别的类(CDaoWorkspace
)的成员,因此可能会影响共享同一工作区(事务空间)的多个CDaoDatabase
对象。异常类已更改。
CDBExceptions
在 ODBC 类和CDaoExceptions
DAO 类中引发。RFX_Date
使用时使用CTime
COleDateTime
和TIMESTAMP_STRUCT
对象DFX_Date
。 这COleDateTime
几乎完全相同CTime
,但基于 8 字节的 OLE DATE ,而不是 4 字节 time_t ,因此它可以容纳更大的数据范围。注释
DAO (
CDaoRecordset
) 快照是只读的,而 ODBC (CRecordset
) 快照可能会根据驱动程序和使用 ODBC 游标库进行更新。 如果使用游标库,CRecordset
则快照是可更新的。 如果在不使用 ODBC 游标库的情况下使用桌面驱动程序包 3.0 中的任何Microsoft驱动程序,则CRecordset
快照是只读的。 如果使用另一个驱动程序,请检查驱动程序的文档以查看快照 (STATIC_CURSORS
) 是否为只读。