В настоящей записке описываются полями записей (RFX соответственно) архитектуры. Он также описывает, как написать процедуру обработки RFX_.
Обзор обмен полей записей
Все функции поля набора записей сделали с кода C++. Не существует специальных ресурсов или волшебные макросы. Сердцем этого механизма является виртуальная функция, который должен быть переопределен каждого производного класса. Он всегда находил в этой форме:
void CMySet::DoFieldExchange (CFieldExchange * pFX)
{
//{{AFX_FIELD_MAP(CMySet)
lt; вызов типа поля записей обмена >
< вызов функции набора записей обмена >
//}}AFX_FIELD_MAP
}
Специальный формат AFX комментарии позволяют ClassWizard находить и редактировать код внутри этой функции. Код, который не совместим с ClassWizard должен быть размещен вне специальных формат комментариев.
В приведенном выше примере, lt; recordset_exchange_field_type_call > в виде:
pFX->SetFieldType(CFieldExchange::outputColumn)
и lt; recordset_exchange_function_call > в виде:
RFX_Custom (pFX, «Col2», m_Col2)
Большинство функций RFX_ у три аргументы, как показано выше, но некоторые (например, RFX_Text и RFX_Binary) имеют дополнительные необязательные аргументы.
В каждой DoDataExchange функции могут быть включены более чем одной RFX_.
Увидеть «afxdb.h» для получения списка всех записей поля обмена подпрограмм с MFC.
Звонки поля набора записей являются способом регистрации расположения в памяти (как правило, члены данных) для хранения данных поля для класса CMySet.
Примечания
Набор записей поля функции предназначены для работы только с классами CRecordset . Они не являются как правило может использовать другие классы MFC.
Начальные значения данных задаются в стандартный конструктор C++, обычно в блок с //{{AFX_FIELD_INIT(CMylSet) и //}}AFX_FIELD_INIT комментариев.
Каждая RFX_ функция должна поддерживать различные операции, начиная от возвращения грязный статус поля для архивирования на местах в рамках подготовки для редактирования поля.
Каждая функция, которая вызывает DoFieldExchange (к примеру, метод SetFieldNull, IsFieldDirty), делает свой собственный инициализации вокруг вызов функции DoFieldExchange.
Как это работает?
Вам не нужно понимать следующее, чтобы использовать обмен полей записей. Однако понимание, как это происходит за кулисами поможет вам написать собственную процедуру обмена.
Функция-член DoFieldExchange очень похожа на функцию-член Serialize - это ответственность за при получении или задании данных в/из/в член данных класса из внешней формы (в этом случае столбцы из результата запроса ODBC). Параметр pFX контекст для этого обмена данными и похоже на параметр CArchive для CObject::Serialize. PFX (объекты CFieldExchange ) имеет индикатор операции, который аналогичен, но обобщение CArchive направления флага. Функции RFX может быть поддержать следующие операции
Пользовательские расширения
Существует несколько способов для расширения Механизм RFX по умолчанию. Вы можете
CBookmark
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *sz&Name,
nbsp; BIGINT и стоимость)
в то время как (posExtraFields! = &NULL)
{
nbsp; RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues));
}
Примечание Такой код не может быть отредактирован ClassWizard и должен использоваться только за пределами специальных формат комментариев.
Написание пользовательского RFX
Чтобы написать собственные пользовательские RFX, предполагается, что вы скопировать существующую функцию RFX и модифицировать его собственных целей. Выбор правильный RFX для копирования можно сделать вашу работу намного проще. Некоторые функции RFX имеют некоторые уникальные свойства, которые следует учитывать при принятии решения для копирования.
RFX_Long и RFX_Int:
Это простейший функции RFX. Значение типа данных не нуждается в каких-либо специальных интерпретации, и размер данных фиксируется.
RFX_Single и RFX_Double:
Как и RFX_Long и RFX_Int выше, эти функции являются простыми и может сделать широко использовать реализации по умолчанию. Они хранятся в dbflt.cpp вместо того, чтобы dbrfx.cpp, однако, чтобы включить загрузку с плавающей точкой библиотеки только тогда, когда они явно ссылки во время выполнения.
RFX_Text и RFX_Binary:
Эти две функции заранее выделите статический буфер для хранения строки/двоичной информации и должны быть зарегистрированы эти буферы ODBC SQLBindCol вместо того, чтобы регистрация & значение. Таким образом эти две функции имеют много кода особой.
RFX_Date:
ODBC возвращает сведения о дате и времени в структуре данных их собственных TIMESTAMP_STRUCT. Эта функция динамически выделяет TIMESTAMP_STRUCT как «прокси» для отправки и получения данных Дата-время. Различные операции должны передавать информацию о дате и времени между объектом C++ CTime и TIMESTAMP_STRUCT прокси. Нет нужды говорить о том, что это значительно усложняет эту функцию, но это хороший пример того, как использовать прокси для передачи данных.
RFX_LongBinary:
Это единственная библиотека классов функции RFX, которая не использует привязку к столбцу для получения и отправки данных. Эта функция игнорирует BindFieldToColumn операции и вместо этого, в ходе операции исправления, выделяет память для хранения входящих данных, SQL_LONGVARCHAR или SQL_LONGVARBINARY, а затем выполняет вызов SQLGetData для получения значения в выделенной хранения. При подготовке к отправить значения данных обратно в источник данных (то есть NameValue и стоимость операции), эта функция использует функциональность ODBC в DATA_AT_EXEC. Техническое примечание 45 более подробная информация о работе с SQL_LONGVARBINARY и SQL_LONGVARCHARs.
При написании собственных RFX_ функция, часто можно использовать CFieldExchange::Default для реализации данной операции. Посмотрите на выполнение по умолчанию для операции. Если он выполняет операцию, вы будет писать в RFX_ функции можно делегировать CFieldExchange::Default. Вы можете увидеть примеры вызова CFieldExchange::Default в dbrfx.cpp
Это имеет важное значение для вызова IsFieldType в начале вашей функции RFX и немедленно возвращаются, если он возвращает значение FALSE. Этот механизм сохраняет параметр операции от выполняемых на outputColumnsи наоборот (как и вызов BindParam outputColumn). Кроме того IsFieldType автоматически отслеживает за граф outputColumns (m_nFields) и params (m_nParams).
Технические примечания по номеру |nbsp; Технические примечания по категориям