TN053:DAO数据库选件类的自定义DFX实例
备注
从 Visual C++ .NET 起,Visual C++ 环境和向导不再支持 DAO(不过提供了 DAO 类,仍可供您使用)。Microsoft 建议对新项目使用 OLE DB 模板 或 ODBC 和 MFC 。DAO 只应用于维护现有的应用程序。
此方法声明描述 DAO 记录字段交换 (DFX) 结构。 为了帮助了解在 DFX 实例中发生, DFX_Text 函数将例如详细说明。 作为附加的信息源此技术声明的,可以检查其他的单个代码的 DFX 功能。 在同一通常可能不需要自定义 DFX 实例,就象您可能需要自定义 RFX 实例 (使用 ODBC 数据库类)。
此方法声明一:
DFX 概述
使用 DAO 记录字段交换和动态绑定的示例
DFX 的工作原理
根据您的自定义 DFX 实例
DFX_Text 详细信息
DFX 概述
DAO 记录字段交换机制 (DFX) 用于简化检索和更新数据程序,在使用 CDaoRecordset 类时。 使用 CDaoRecordset 类,的数据成员处理简化。 通过从派生 CDaoRecordset,可以在表或查询中的可以将数据成员添加到该派生类表示每个字段。 此 “静态绑定”机制非常简单的,但是,它可能不是数据获取/更新选择模型的任何应用程序中。 ,每次更改, DFX 检索每个绑定字段当前记录。 如果开发不需要获取每个字段的性能敏感的应用程序,更改时货币, “动态绑定”通过 CDaoRecordset::GetFieldValue 和 CDaoRecordset::SetFieldValue 可以是数据访问选择方式。
备注
DFX 和动态绑定不是互斥的,因此,可以使用对静态和动态绑定的混合使用。
示例 1 - 对 DAO 只记录字段交换的使用
(假定 CDaoRecordset 派生类中打开的 CMySet )
// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();
示例 2 - 为仅动态绑定的使用
使用 CDaoRecordset 类, rs, (假定,因此,已打开的)
// Add a new record to the customers table
COleVariant varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT );
rs.AddNew();
rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs.Update();
示例 3 - 对 DAO 记录字段交换和动态绑定的使用
(假定浏览与 CDaoRecordset的雇员数据派生类 emp)
// Get the employee's data so that it can be displayed
emp.MoveNext();
// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
emp.GetFieldValue(_T("photo"), varPhoto);
// Display the data
PopUpEmployeeData(emp.m_strFirstName,
emp.m_strLastName, varPhoto);
DFX 的工作原理
DFX 结构的工作于 MFC ODBC 使用的记录字段交换 (rfx) 机制相同的类别。 RFX 和 DFX 的原则仍然相同,但有许多内部差异。 DFX 功能的设计是这样的几乎所有代码由单个的 DFX 实例中共享。 在最上层的 DFX 仅执行某些事件。
DFX 如果需要,构造 SQL 选择 子句和 SQL 参数 子句。
DFX 构造 DAO 的 GetRows 函数使用的绑定结构 (多个在以后)。
DFX 管理用于的数据缓冲区检测已更新字段 (如果使用双缓冲)
DFX 管理 NULL 和 DIRTY 状态数组,并根据需要设置值在更新。
在 DFX 结构核心是 CDaoRecordset 派生类的 DoFieldExchange 功能。 此功能安排调用相应的操作类型的各个 DFX 功能。 在调用 DoFieldExchange 之前内部 MFC 函数设置操作类型。 下面列出了各种操作类型和简要说明的显示。
操作 |
说明 |
---|---|
AddToParameterList |
生成参数子句 |
AddToSelectList |
生成 select 子句 |
BindField |
sets-up 绑定结构 |
BindParam |
设置参数值 |
Fixup |
设置 NULL 状态 |
AllocCache |
分配已更新检查的缓存 |
StoreField |
保存当前记录到缓存 |
LoadField |
还原缓存对成员值 |
FreeCache |
释放缓存 |
SetFieldNull |
设置字段状态 & 值设置为 null |
MarkForAddNew |
标记已更新字段,如果不打印 NULL |
MarkForEdit |
,如果不符合缓存,标记已更新字段 |
SetDirtyField |
设置为 " 已标记为的字段值 |
在下一节中,每个操作都 DFX_Text将详细介绍。
若要了解的最重要的功能有关 DAO 记录字段交换过程是它使用 CDaoRecordset 对象的 GetRows 功能。 DAO GetRows 功能能通过多种方式。 此方法只声明简要介绍 GetRows ,它在范围此方法声明外部。
DAO GetRows 能通过多种方式。
它可以一次获取多个记录和多个数据字段。 这样处理的问题的更快的数据访问一个大型数据结构和相应的偏移量。每个字段和数据的每个记录都结构。 MFC 不利用此多个记录获取的结构。
GetRows 能够正常工作的另一种方式是允许程序员为每个字段中检索的数据一条记录的指定绑定地址。
DAO 将 “也称为”到变长列的调用方以便向调用方分配内存。 第二个函数具有最小化数量的复制的数据以及允许数据直接存储的优点到类 ( CDaoRecordset 派生类) 的成员。 第二种机制是方法 MFC 使用绑定到 CDaoRecordset 派生类的数据成员。
根据您的自定义 DFX 实例
它从本讨论不同于任何 DFX 函数实现的最重要的操作必须是能够设置所需的数据结构成功调用 GetRows。 具有 DFX 函数必须支持的许多其他复杂操作,但是,的非同样关键或类似正确。 GetRows 准备调用。
使用 DFX 在联机文档中介绍。 实质上,有两个要求。 首先,成员必须添加到每个绑定字段和参数的 CDaoRecordset 派生类。 本 CDaoRecordset::DoFieldExchange 后应重写。 注意该成员的数据类型非常重要。 它应匹配字段的数据在数据库中或至少转换为为该类型。 例如始终可以将数字字段在数据库中,例如长整数,文本和限制 CString 成员,但是,一个文本字段在数据库中不一定转换为数值表示形式,例如长整数和绑定到一个长整数成员。 DAO 和 Microsoft Jet 数据库引擎将负责 (而不是 MFC)。
DFX_Text 详细信息
如前所述,最佳方式解释 DFX 工作是如何工作。示例。 为此通过 DFX_Text internals 应非常适用于帮助提供对 DFX 的有基本的了解。
AddToParameterList
此操作生成 Jet ("Parameters <param name>, <param type> ... ;") 所需的 SQL 参数 子句。 每个参数命名和类型化 (在 RFX 上指定调用)。 请参见函数 CDaoFieldExchange::AppendParamType 功能查看各个类型的名称。 在 DFX_Text,使用的类型是 text。AddToSelectList
生成 SQL 选择 子句。 这相当简单,因为 DFX 指定的列名调用追加 ("SELECT <column name>, ...")。BindField
最复杂操作。 如上所述上是绑定结构的 DAO 使用由 GetRows 的设置位置。 可以从 " DFX_Text 的代码显示的信息的类型在结构中包括 DAO 类型使用了 (DAO_CHAR 或 DAO_WCHAR 后 DFX_Text)。 此外,所使用的绑定类型也会设置。 在早期的部分 GetRows 只简要介绍了,但是,解释满足的 MFC 使用的绑定类型总是直接地址的绑定 (DAOBINDING_DIRECT)。 其他为可变长度列绑定 (如 DFX_Text) 回调绑定使用,以便 MFC 能够控制内存分配和指定正确的长度的地址。 此什么是表示该 MFC 能够始终会调用 DAO “其中”放置数据,从而允许直接绑定到成员变量。 绑定结构的其余部分将与内存分配回调函数和列绑定的类型的地址的内容填充 (绑定按列名)。BindParam
这是调用与您的参数成员指定参数值的 SetParamValue 的简单操作。Fixup
填充每个字段的 NULL 状态。SetFieldNull
此操作仅指示每个字段状态转换为 NULL 并将成员变量的值为 PSEUDO_NULL。SetDirtyField
调用每个字段标记的已更新 SetFieldValue 。
所有剩余操作只处理数据缓存。 数据缓存是数据的额外缓冲区中用于确定功能更为简单的当前记录的。 例如, “既可以自动检测错误”的字段。 按联机文档所述它可禁用完全或 project professional 级别。 缓冲区的实现使用映射。 此映射用于交互数据的动态分配的副本以及地址 “限制”字段 (或 CDaoRecordset 派生的数据成员)。
AllocCache
动态分配缓存的字段值并将其添加到映射。FreeCache
删除缓存的字段值并从映射移除。StoreField
复制当前字段值到数据缓存中。LoadField
复制该缓存的值更改为字段成员。MarkForAddNew
检查当前字段值是否如果需要,非NULL 并将其标记为错误。MarkForEdit
如果需要,当前字段的值与数据缓存比较和的标记。
提示
建模您在现有 DFX 实例的自定义 DFX 实例标准数据类型的。