Поделиться через


Использование расширений Visual C++

Область применения: Access 2013, Office 2013

Интерфейс IADORecordBinding

Расширения Microsoft Visual C++ для ADO связывают или привязывают поля объекта Recordset к переменным C/C++. При изменении текущей строки привязанного набора записей все связанные поля в наборе записей копируются в переменные C/C++. При необходимости скопированные данные преобразуются в объявленный тип данных переменной C/C++.

Метод BindToRecordset интерфейса IADORecordBinding привязывает поля к переменным C/C++. Метод AddNew добавляет новую строку в привязанный набор записей. Метод Update заполняет поля в новых строках набора записей или обновляет поля в существующих строках значением переменных C/C++.

Интерфейс IADORecordBinding реализуется объектом Recordset . Вы не кодируйте реализацию самостоятельно.

Записи привязки

Расширения Visual C++ для ADO сопоставляют поля объекта Recordset с переменными C/C++. Определение сопоставления между полем и переменной называется записью привязки. Макросы предоставляют записи привязки для числовых данных, данных фиксированной и переменной длины. Записи привязки и переменные C/C++ объявляются в классе, производном от класса Расширений Visual C++, CADORecordBinding. Класс CADORecordBinding определяется внутренне макросами записи привязки.

ADO внутренне сопоставляет параметры в этих макросах со структурой OLE DBBINDING и создает объект accessor OLE DB для управления перемещением и преобразованием данных между полями и переменными. OLE DB определяет данные как состоящие из трех частей: буфер , в котором хранятся данные; состояние , указывающее, было ли поле успешно сохранено в буфере или как переменная должна быть восстановлена в поле; и длину данных. (Дополнительные сведения см . в справочнике по OLE DB Для программистов, глава 6. Получение и настройка данных.)

Файл заголовка

Добавьте следующий файл в приложение, чтобы использовать расширения Visual C++ для ADO:

 
#include <icrsint.h> 

Привязка полей набора записей

Привязка полей набора записей к переменным 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. Получите интерфейс 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 , чтобы добавить новую строку в набор записей.

AddNew(CADORecordBinding *binding)

Метод Update вызывает свой тезку, метод ADO Update , для обновления набора записей.

Update(CADORecordBinding *binding)

Макросы записи привязки

Макросы записи привязки определяют связь поля Recordset и переменной. Начальный и конечный макросы разделяют набор записей привязки.

Семейства макросов предоставляются для данных фиксированной длины, таких как adDate или adBoolean; числовые данные, такие как adTinyInt, adInteger или adDouble; и данные переменной длины, такие как adChar, adVarChar или adVarBinary. Все числовые типы, кроме adVarNumeric, также являются типами фиксированной длины. Каждое семейство имеет разные наборы параметров, поэтому вы можете исключить сведения о привязке, которые не являются интересующими.

Дополнительные сведения см. в справочнике по OLE DB Для программистов, приложение A. Типы данных.

Начальные записи привязки

BEGIN_ADO_BINDING(Класс)

Данные фиксированной длины

ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)
ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)

Числовые данные

ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status, Modify)
ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)

Данные переменной длины

ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status, Length, Modify)
ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)
ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length, Modify)
ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)

Завершение записей привязки

END_ADO_BINDING()

Параметр

Описание

Class

Класс, в котором определяются записи привязки и переменные C/C++.

Ordinal

Порядковое число, отсчитывающее от одного, поля Recordset , соответствующего переменной C/C++.

DataType

Эквивалентный тип данных ADO переменной C/C++ (список допустимых типов данных см. в разделе DataTypeEnum ). При необходимости значение поля Recordset будет преобразовано в этот тип данных.

Буфера

Имя переменной C/C++, в которой будет храниться поле Recordset .

Размер

Максимальный размер буфера в байтах. Если buffer будет содержать строку переменной длины, разрешите место для завершающего нуля.

Состояние

Имя переменной, указывающее, является ли содержимое буфера допустимым и было ли успешно преобразовано поле в DataType . Два наиболее важных значения для этой переменной — adFldOK, что означает, что преобразование прошло успешно. и adFldNull, что означает, что значение поля будет типом VARIANT VT_NULL, а не просто пустым. Возможные значения состояния перечислены в следующей таблице "Значения состояния".

Modify

Логический флаг; Значение TRUE указывает, что ADO может обновить соответствующее поле Recordset значением, содержащимся в буфере. Задайте для параметра Boolean modify значение TRUE, чтобы разрешить ADO обновлять связанное поле, и значение FALSE, если вы хотите проверить поле, но не изменить его.

Точность

Число цифр, которые могут быть представлены в числовой переменной.

Scale

Число десятичных разрядов в числовой переменной.

Length

Имя четырехбайтовой переменной, которая будет содержать фактическую длину данных в Buffer.

Значения состояния

Значение переменной Status указывает, было ли успешно скопировано поле в переменную.

При настройке данных для параметра Состояние может быть задано значение adFldNull , чтобы указать, что поле Recordset должно иметь значение NULL.

Константа

Значение

Описание

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

При обновлении использовалось значение по умолчанию.