Visual C++ 扩展

IADORecordBinding 接口

Microsoft Visual C++ Extensions for ADO 将 Recordset 对象的字段关联或绑定到 C/C++ 变量。 每当绑定的 Recordset 的当前行发生更改时,Recordset 中的所有绑定字段都会复制到 C/C++ 变量。 如有必要,复制的数据将转换为 C/C++ 变量的声明数据类型。

IADORecordBinding 接口的 BindToRecordset 方法将字段绑定到 C/C++ 变量。 AddNew 方法向绑定的 Recordset 添加新行。 Update 方法使用 C/C++ 变量的值填充 Recordset 的新行中的字段或更新现有行中的字段。

IADORecordBinding 接口由 Recordset 对象实现。 你无需自行编写实现代码。

绑定条目

Visual C++ Extensions for ADO 将 Recordset 对象的字段映射到 C/C++ 变量。 字段与变量之间的映射的定义称为“绑定条目”。 宏为数字、固定长度和可变长度数据提供绑定条目。 绑定条目和 C/C++ 变量在派生自 Visual C++ 扩展类 CADORecordBinding 的类中声明。 CADORecordBinding 类由绑定条目宏在内部定义。

ADO 在内部将这些宏中的参数映射到 OLE DB DBBINDING 结构,并创建一个 OLE DB Accessor 对象来管理字段与变量之间的数据移动和转换。 OLE DB 将数据定义为包含三个部分:缓冲区,用于存储数据;状态,用于指示字段是否已成功存储在缓冲区中,或者变量应如何还原到该字段;数据的长度。 (有关详细信息,请参阅 OLE DB 程序员参考中的获取和设置数据 (OLE DB)。)

标头文件

在应用程序中包括以下文件,以便使用 Visual C++ Extensions for ADO:

#include <icrsint.h>

绑定 Recordset 字段

将 Recordset 字段绑定到 C/C++ 变量

  1. 创建一个派生自 CADORecordBinding 类的类。

  2. 在派生类中指定绑定条目和相应的 C/C++ 变量。 将 BEGIN_ADO_BINDING 和 END_ADO_BINDING 宏之间的绑定条目括起来。 不要用逗号或分号终止宏。 每个宏会自动指定适当的分隔符。

    为每个要映射到 C/C++ 变量的字段指定一个绑定条目。 使用 ADO_FIXED_LENGTH_ENTRY、ADO_NUMERIC_ENTRY 或 ADO_VARIABLE_LENGTH_ENTRY 宏系列中的相应成员。

  3. 在应用程序中,创建派生自 CADORecordBinding 的类的一个实例。 从 Recordset 获取 IADORecordBinding 接口。 然后调用 BindToRecordset 方法,将 Recordset 字段绑定到 C/C++ 变量。

有关详细信息,请参阅 Visual C++ 扩展示例

接口方法

IADORecordBinding 接口有三种方法:BindToRecordset、AddNew 和 Update。 每个方法的唯一自变量是指向派生自 CADORecordBinding 的类的实例的指针。 因此,AddNew 和 Update 方法不能指定与其 ADO 方法同名的任何参数。

语法

BindToRecordset 方法将 Recordset 字段与 C/C++ 变量相关联。

BindToRecordset(CADORecordBinding *binding)

AddNew 方法调用与其同名的 ADO AddNew 方法以向 Recordset 添加新行。

AddNew(CADORecordBinding *binding)

Update 方法调用与其同名的 ADO Update 方法以更新 Recordset。

Update(CADORecordBinding *binding)

绑定条目宏

绑定条目宏定义 Recordset 字段与变量之间的关联。 各绑定条目之间以开始宏和结束宏分隔。

为固定长度的数据(如 adDate 或 adBoolean)、数值数据(如 adTinyInt、adInteger 或 adDouble)以及可变长度的数据(如 adChar、adVarChar 或 adVarBinary)提供了宏系列。 除 adVarNumeric 之外的所有数值类型也是固定长度类型。 每个系列都有不同的参数集,以便排除无关的绑定信息。

有关详细信息,请参阅 OLE DB 程序员参考的附录 A:数据类型

开始绑定条目

BEGIN_ADO_BINDING(类)

固定长度的数据

ADO_FIXED_LENGTH_ENTRY(序号、数据类型、缓冲区、状态、修改)

ADO_FIXED_LENGTH_ENTRY2(序号、数据类型、缓冲区、修改)

数值数据

ADO_NUMERIC_ENTRY(序号、数据类型、缓冲区、精度、比例、状态、修改)

ADO_NUMERIC_ENTRY2(序号、数据类型、缓冲区、精度、比例、状态、修改)

长度可变数据

ADO_VARIABLE_LENGTH_ENTRY(序号、数据类型、缓冲区、大小、状态、长度、修改)

ADO_VARIABLE_LENGTH_ENTRY2(序号、数据类型、缓冲区、大小、状态、修改)

ADO_VARIABLE_LENGTH_ENTRY3(序号、数据类型、缓冲区、大小、长度、修改)

ADO_VARIABLE_LENGTH_ENTRY4(序号、数据类型、缓冲区、大小、修改)

结束绑定条目

END_ADO_BINDING()

参数 说明
在其中定义绑定条目和 C/C++ 变量的类。
序号 与 C/C++ 变量相对应的 Recordset 字段的序号(从 1 开始计数)。
DataType C/C++ 变量的等效 ADO 数据类型(有关有效数据类型列表,请参阅 DataTypeEnum)。 如有必要,Recordset 字段的值将转换为此数据类型。
Buffer 将存储 Recordset 字段的 C/C++ 变量的名称。
大小 缓冲区的最大大小(以字节为单位)。 如果缓冲区将包含可变长度字符串,请为终止零留出空间。
状态 一个变量的名称,该变量指示缓冲区的内容是否有效,以及字段是否成功转换为“数据类型”。

此变量最重要的两个值是 adFldOK(表示转换成功)和 adFldNull(表示字段的值将是类型为 VT_NULL 的 VARIANT,而不仅仅是空)。

“状态”的可能值列在下一个表“状态值”中。
修改 布尔标志;如果为 TRUE,则指示允许 ADO 使用缓冲区中包含的值更新相应的 Recordset 字段。

将布尔 modify 参数设置为 TRUE,使 ADO 能够更新绑定字段,如果想要检查字段但不更改字段,则为 FALSE。
精度 可在数值变量中表示的位数。
缩放 数值变量中的小数位数。
时长 包含缓冲区中数据的实际长度的四字节变量的名称。

状态值

“状态”变量的值指示字段是否已成功复制到变量。

设置数据时,“状态”可能设置为 adFldNull,以指示 Recordset 字段应设置为 null。

返回的常量 Value 说明
adFldOK 0 返回了非 null 字段值。
adFldBadAccessor 1 绑定无效。
adFldCantConvertValue 2 由于符号不匹配或数据溢出之外的其他原因,导致无法转换值。
adFldNull 3 获取字段时,指示了返回 null 值。

设置字段时,指示字段在字段无法对 NULL 本身进行编码时(例如字符数组或整数)设置为 NULL。
adFldTruncated 4 可变长度的数据或数字被截断。
adFldSignMismatch 5 值有符号,变量数据类型无符号。
adFldDataOverFlow 6 值大于可以存储在变量数据类型中的值。
adFldCantCreate 7 未知的列类型和字段已打开。
adFldUnavailable 8 无法确定字段值,例如,在没有默认值的新未分配字段上。
adFldPermissionDenied 9 更新时,无权写入数据。
adFldIntegrityViolation 10 更新时,字段值将违反列完整性。
adFldSchemaViolation 11 更新时,字段值将违反列架构。
adFldBadStatus 12 更新时,状态参数无效。
adFldDefault 13 更新时,使用了默认值。

另请参阅

Visual C++ 扩展示例Visual C++ 扩展标头