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


TN043. Процедуры RFX

Примечание

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

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

Обзор обмена полями записей

Все функции поля набора записей выполняются с кодом C 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_Text и RFX_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) from/to данных члена класса. Параметр pFX контекст для такой обмен данными и аналогичен параметру CArchive в CObject::Serialize. pFX (объект CFieldExchange ) содержит индикатор операции, которому аналогичны, обобщение только флагов направления CArchive. Функция RFX поддерживает следующие операции:

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

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

  • Fixup — задать длину CString/CByteArray, второй бит состояния NULL

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

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

  • Имя — Имена полей для добавления полей пометить пакостное

  • NameValue — добавление «<column name>=»? для пакостного отмечена полями

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

  • SetFieldDirty — задать поле 16-разрядных состоянием пакостное (т е изменено)

  • SetFieldNull — набор 16-разрядных состояние отображается значение 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 C++.

    while (posExtraFields != NULL)
    {
        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:
    2 Эти функции preallocate статический буфер для хранения строки или бинарные данные и должен зарегистрировать эти буферы с ODBC SQLBindCol вместо регистрации &значение. Вследствие этого, 2 эти функции имеют больших кода конкретного экземпляра.

  • RFX_Date:
    ODBC возвращает данные о дате и времени в собственной структуры данных TIMESTAMP_STRUCT. Эта функция динамически выделяет TIMESTAMP_STRUCT как «прокси-сервер» для отправки и получения сведений о времени даты. Некоторые операции должны возвращать данные о дате и времени между объектом CTime C++ прокси-сервером 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 и возвращает немедленно, если она возвращает ЛОЖНОЕ. Этот механизм позволяет параметра операции можно выполнять с outputColumns и наоборот (например, вызов метода BindParam для outputColumn). Кроме того, IsFieldType автоматически отслеживает числа outputColumns (m_nFields) и параметрами (m_nParams).

См. также

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

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

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