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


TN043: подпрограммы RFX

ПримечаниеПримечание

Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации.

Эта заметка описывает архитектуру обмена полями записей (RFX).Он также описывает способ написания процедура RFX_.

Общие сведения об обмене полей записей

Все функции поле набора записей выполняется с кодом C++.Ресурсы или волшебные специальных макросов.Виртуальная функция, которая является основой механизма требуется переопределять в каждом производном классе набора записей.Оно всегда находится в этой форме:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  <recordset exchange field type call>
  <recordset exchange function call>
  //}}AFX_FIELD_MAP
}

Специальные комментарии формата AFX позволяют ClassWizard для поиска и редактирование кода в рамках этой функции.Код, который не совместим с функциональным возможностям ClassWizard должен быть помещен вне специальных комментариев формата.

В приведенном выше примере <recordset_exchange_field_type_call> в формате:

pFX->SetFieldType(CFieldExchange::outputColumn);

и <recordset_exchange_function_call> в формате:

RFX_Custom(pFX, "Col2", m_Col2);

Большинство функций RFX_ имеют 3 аргумента, как показано выше, но некоторые (например.RFX_TextRFX_Binary) имеют и дополнительные необязательные аргументы.

Несколько RFX_ может быть включен в каждой функции DoDataExchange.

См. раздел «afxdb.h» список всех подпрограмм обмена полями набора записей, предоставленных с MFC.

Вызовы полей набора записей способ регистрации областей памяти (обычно элементы данных) для хранения данных поля для класса CMySet.

Примечания

Функции поле набора записей предназначены для работы только с классами CRecordset.Они обычно не используются всеми другими классами MFC.

Набор начальных значений данных в стандартном конструкторе C++, обычно в блоке с //{{AFX_FIELD_INIT(CMylSet) и комментариями //}}AFX_FIELD_INIT.

Каждая функция RFX_ должна поддерживать различные операции от возвращение пакостное поля в поле состояние сжатия при подготовке к редактирования поля.

Каждая функция, которая вызывает DoFieldExchange (например SetFieldNull, IsFieldDirty), выполняет свою собственную инициализацию вокруг вызова DoFieldExchange.

Принцип работы?

Нет необходимости знать следующее для использования запись обмена полей.Однако понимание, как это работает незаметно для пользователя помогает написать собственную процедура обмена.

Функция-член DoFieldExchange аналогично функцию-член Serialize — он отвечает за получение или устанавливать данные к/от внешней формы (в этом случае столбцы из результата запроса ODBC) от/k данных элементов в классе.Параметр pFX контекст для обмена данными и аналогичен параметру CArchive к CObject::Serialize.pFX (объект CFieldExchange ) содержит индикатор, который аналогичен, обобщение только пометить направления CArchive.Функция RFX может поддерживать следующие операции:

  • BindParam — укажите место ODBC следует извлечь данные параметра

  • BindFieldToColumn — укажите место ODBC должен получить/данные outputColumn залеми

  • Fixup — установка длины CString/CByteArray, битов состояния set NULL

  • MarkForAddNew — пометьте пакостное если значение изменилось с момента вызова метода AddNew

  • MarkForUpdate — пометьте пакостное если значение изменилось с момента вызова правки

  • Имя — Имена полей для добавления полей пакостное, помеченных как

  • NameValue — добавить «<имя столбца>=?» для пакостного признаком полями

  • Значение — Добавить «?» за разделителями, например «,» или " "

  • SetFieldDirty — установка битов состояния пакостным (т еизмененное поле)

  • SetFieldNull — установка битов состояния, представляющее значение NULL для поля

  • IsFieldDirty — возвращаемое значение пакостного битов состояния

  • IsFieldNull — возвращаемое значение бита состояния null

  • IsFieldNullable — возвращает значение true, если поле может иметь значение Null

  • StoreField — значение поля архива

  • LoadField — перезагрузить сжанное значение поля

  • GetFieldInfoValue — должен возвращать в поле общие сведения

  • GetFieldInfoOrdinal — должен возвращать в поле общие сведения

Расширения пользователя

Существует несколько способов расширения механизм RFX значения по умолчанию.Возможные действия

  • Добавьте новые типы данных.Примеры.

    CBookmark
    
  • Добавьте новые процедуры обмена (RFX_???).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Наличие функции-члена DoFieldExchange условной включить дополнительные вызовы функций RFX или все остальные формулировки допустимым C++.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX, m_listName.GetNext(posExtraFields), 
            m_listValue.GetNext(posExtraValues));
    }
    
ПримечаниеПримечание

Такой код не может быть отредактирован ClassWizard и должен использоваться только вне специальных комментариев формата.

Написать пользовательский RFX

Записывает собственную пользовательскую функцию RFX, рекомендуется что копировании существующая функция RFX и изменить его к своим собственным назначения.Выбрать правильный RFX для копирования может сделать задание намного проще.Некоторые функции RFX имеют некоторые уникальные свойства, которые необходимо принимать во внимание при решении того, авторизирован, что для копирования.

  • RFX_Long and RFX_Int:
    Эти самые простые функции RFX.Значение данных не требуется никаких дополнительных интерпретацию данных и размер фиксирован.

  • RFX_Single and RFX_Double:
    Как RFX_Long и RFX_Int выше, эти функции являются простыми и могут использовать реализацию по умолчанию интенсивно.Они хранятся в dbflt.cpp вместо dbrfx.cpp, однако, чтобы включить загрузку библиотеки среды выполнения с плавающей запятой, только если они явно ссылка.

  • RFX_Text and RFX_Binary:
    Эти 2 функции preallocate статический буфер для хранения строки или бинарный сведения и необходимо зарегистрировать эти буферы с ODBC вместо функции SQLBindCol зарегистрировать &value.Таким образом, эти функции имеется много кода 2 особого случая.

  • RFX_Date:
    ODBC возвращает сведения о дате и времени в собственной структуре данных TIMESTAMP_STRUCT.Эта функция динамически выделяет TIMESTAMP_STRUCT как «прокси-сервер» для отправки и получения данных.Различные операции должны возвращать сведения о дате и времени между объектом C++ CTime и прокси-сервером TIMESTAMP_STRUCT.Это осложняет эту функцию, но значительно хороший пример того, как использовать прокси-сервер для передачи данных.

  • RFX_LongBinary:
    Это единственная функция библиотеки классов RFX, которая не использует привязку к столбцу, чтобы получать и отправлять данные.Эта функция не учитывает операция BindFieldToColumn и вместо этого во время операции адресной привязки, выбирает хранилище для хранения входящих данных SQL_LONGVARBINARY, SQL_LONGVARCHAR или а затем выполняет вызов SQLGetData для получения значения в выбранное хранилище.При подготовке отправлять данные обратно в источник данных (например, операции NameValue и значений), эта функция использует функциональность DATA_AT_EXEC ODBC.См. раздел Техническая примечание 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).

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям