Цієї записці описується поле запису exchange (RFX) архітектури. Він також описує, як ви пишете це RFX_ процес.
Огляд запис обміну даними
Всі поля записів функції зробили з C++ код. Немає спеціальних ресурсів або чарівної макроси. Серце механізму є віртуальних функцій, які повинні бути змінені в кожному класі отриманих записів. Він завжди знаходиться в такому вигляді:
недійсним 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) мають додаткові необов'язкові аргументи.
Більше одного RFX_ може бути включена в кожен DoDataExchange функції.
Див 'afxdb.h' для отримання списку всіх записів поле обмін процедур з MFC.
Набір записів полі дзвінки, це спосіб реєстрації ділянок пам'яті (як правило, члени дані) зберігати дані поля для CMySet -класу.
Нотатки
Функції набору записів поля призначені для роботи тільки з CRecordset класи. Вони не як правило використовуватися будь-які інші класи MFC.
Початкові значення даних наведено у стандартних Конструктор C++, зазвичай у блок з //{{AFX_FIELD_INIT(CMylSet) і //}}AFX_FIELD_INIT коментарів.
Кожна RFX_ функція має підтримувати різні операції, починаючи від повернення брудні статус поля для архівування області у підготовці для редагування поля.
Кожна функція, яка закликає DoFieldExchange (наприклад, SetFieldNull, IsFieldDirty), робить свій власний ініціалізації навколо виклику DoFieldExchange.
Як це працює?
Вам не потрібно зрозуміти наступне, щоб використовувати поле запису exchange. Однак, розуміння, як це працює за лаштунками допоможе вам написати ваш власний порядок обміну.
Функція-член DoFieldExchange так само, як функція Serialize -член - це відповідальність за отримання або встановлення даних до/із члени дані в класі з зовнішніх форми (у цьому випадку стовпці з результатом запиту на ODBC). PFX параметр контексту для цього обміну даними і подібні до параметра CArchive , щоб CObject::Serialize. PFX ( CFieldExchange об'єкт) має операції індикатор, який схожий на, але узагальнення напрямку CArchive прапор. RFX-функція, можливо, доведеться підтримує наступні операції
Розширення користувачем
Є кілька способів, щоб розширити механізм RFX за промовчанням. Ти можеш
CBookmark
недійсним AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
nbsp; BIGINT & значення)
хоча (posExtraFields! = &NULL)
{
nbsp; RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues));
}
Примітка Такий код не можна редагувати на ClassWizard і слід використовувати лише за межами спеціальний формат коментарів.
Дати Користувальницькі RFX
Написати свій власний Custom 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:
Ці дві функції pre&allocate статичні буфер провести інформація string/двійковий файл і необхідно зареєструвати ці буфери з ODBC SQLBindCol замість того, реєстрація amp; значення. З-за цього ці дві функції, є багато спеціального випадку код.
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і навпаки (наприклад, закликають до outputColumn BindParam ). Крім того, IsFieldType автоматично стежить за кількість outputColumns (m_nFields) і параметри (m_nParams).
Технічні примітки за номером |nbsp; Технічні примітки за категоріями