TN053: Custom DFX процедури для класів бази даних DAO

Це технічні записці описується механізм обміну (DFX) поле запису DAO. Щоб зрозуміти, що відбувається в DFX процедур, DFX_Text функція буде пояснено в деталях як приклад. Як додаткове джерело інформації для цього технічну записку ви можете просто вивчити код для інших окремих функцій DFX.Мабуть не потрібно власний режим DFX так часто, як потрібно Користувальницькі RFX звичайні (використовується з класами бази даних ODBC).

Технічне Примітка містить:

DFX огляд

ДАО поле запису exchange механізму (DFX) використовується для спрощення процедури отримання й оновлення даних при використанні класу CDaoRecordset . Процес спрощено шляхом використання з члени даних класу CDaoRecordset . На продиктована CDaoRecordset, члени даних можна додати до похідних класів, що представляють кожного поля таблиці або запиту. Цей механізм "статичного зв'язування" проста, але вона не може fetch/оновлення даних методом вибору для всіх додатків. DFX отримує кожного зв'язаного поля під час кожного Змінення поточного запису. Якщо ви розробляєте продуктивності чутливі додаток, що не вимагає отримання всі поля, після зміни валюти, "динаміка обов'язковий" через CDaoRecordset::GetFieldValue і CDaoRecordset::SetFieldValue може бути методом вибору, доступу до даних.

Примітка   DFX і динамічне зв'язування не є взаємовиключними, тому гібридних використання статичне і динамічне зв'язування можна використовувати.

Приклад 1 - використання DAO запис Exchange поля лише

(бере на себе CDaoRecordset - похідного класу CMySet вже відкрито)

/ / Додавання нового запису до таблиці Замовники»
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update()

Приклад 2 - використання динамічного прив'язування лише

(припускає, що за допомогою CDaoRecordset класів, rs , і це вже відкрито)

/ / Додавання нового запису до таблиці Замовники»
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / Примітка: VT_BSTRT визначає рядок тексту як A&NSI, замість того, щоб за замовчуванням ЮНІКОД
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
RS.AddNew();
RS.SetFieldValue(_T("Customer_ID"), varFieldValue1);
RS.SetFieldValue(_T("Customer_Name"), varFieldValue2);
RS.Update()

Приклад 3 - використання DAO запис обміну даними і динамічне зв'язування

(припускає, що дані веб-перегляду працівника з CDaoRecordset-класу, отриманих emp )

/ / Отримати дані працівника, так що вона може бути відображена
ПУЕ.MoveNext();

/ / Якщо користувач хоче, щоб побачити його фотографують,
/ / візьме його
COleVariant varPhoto;
Якщо (bSeePicture)
ПУЕ.GetFieldValue(_T("photo"), varPhoto);

/ / Відображення даних
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, varPhoto)

Як працює DFX

DFX механізм працює подібно до механізм обміну (RFX) поле запису використовуються класи MFC ODBC. Priciples DFX і RFX ті ж, але є численні внутрішні розбіжності. Дизайн функцій DFX є така, що практично весь код поділяють індивідуальних виступів DFX. На найвищому рівні DFX тільки не кілька речей.

У центрі на DFX механізм є клас CDaoRecordset отриманих DoFieldExchange функції. Ця функція розсилок дзвінки на окремі функції DFX відповідні операції типу. До виклик DoFieldExchange внутрішніх MFC функції встановити тип операції. Нижче наведено опис різних типів операції та короткий опис.

Операція Опис
AddToParameterList Будує параметри положення
AddToSelectList ВИБЕРІТЬ пункт будує
BindField Встановлює прив'язування структури
BindParam Набори значень параметрів
Виправлення Встановлює NULL статус
AllocCache Виділяє кеш для брудної перевірки
StoreField Зберігає поточний запис до кешу
LoadField Відновлює кеш, щоб член значень
FreeCache Звільняє кеш
SetFieldNull Набори полів статус & значення NULL
MarkForAddNew Знаки полів брудні якщо не ПСЕВДО NULL
MarkForEdit Знаки полів брудні якщо не відповідають кеш
SetDirtyField Набори полів значень, які позначено як забруднений

У наступному розділі Кожна операція буде пояснено більш детально для DFX_Text.

Найбільш важливою особливістю зрозуміти про процес обміну DAO поле запису є, що вона використовує функцію GetRows об'єкта ICDaoRecordset . ДАО GetRows функції можна працювати різними способами. Цього технічне Примітка лише коротко опишемо GetRows , як це виходить за межі рамки цього технічне Примітка.

ДАО GetRows може працювати в декількох напрямках.

Що робить ваш власний DFX режим

Це очевидно з цього обговорення, які найбільш важливі операції в будь-якої функції DFX повинна бути можливість налаштувати структур даних успішно називати GetRows. Є ряд інших операцій, які DFX функція має підтримувати, а, але немає, як важливо, ні складні, як правильно підготовка GetRows називають.

Використання DFX описано в інтерактивній документації. По суті, є 2 вимоги. По-перше, члени необхідно додати до класу CDaoRecordset , отриманих для кожного зв'язаного поля та параметр. Після цього CDaoRecordset::DoFieldExchange повинні бути змінені. Примітка важливо члена, тип даних. Це повинно відповідають дані з поля в базі даних або принаймні бути convertable до цього типу. Наприклад числові поля в базі даних, таких як довге ціле число, завжди може бути перетворено на текст і пов'язані член CString , але текстового поля в базі даних не обов'язково можуть бути перетворені на числовий формат, наприклад, довге ціле число і обов'язково членом довге ціле число. ДАО і Microsoft Jet database engine, несуть відповідальність за на перетворення (а не MFC).

Докладна інформація про DFX_Text

Як згадувалося раніше, ймовірно, кращий спосіб пояснити, як працює DFX є просто працювати через приклад. Для цієї мети переживає нутрощі DFX_Text повинен працювати досить добре з метою хоча б базове розуміння DFX.

AddToParameterList

Ця операція будує речення SQL ПАРАМЕТРІВ (" Parameters lt;param name>, <param type> ... ; ") вимагає Jet. Кожен параметр названий і набрав (як зазначено в RFX call). Переглянути функції, CDaoFieldExchange::AppendParamType функції, щоб переглянути імена окремих типів. У випадку з DFX_Textє тип, які використовуютьсяtext.

AddToSelectList

Будує SQL, Виберіть пункт. Це досить прямо вперед, ім'я стовпця, який вказано DFX виклику, просто додається (" SELECT lt;column name>, ... ").

BindField

-Найбільш складних операцій. Як згадувалося раніше, це де DAO прив'язування структура використовується Метод GetRows настроєно. Як ви можете бачити з коду в DFX_Text види інформації у структурі включають DAO тип використовується (DAO_CHAR або DAO_WCHAR у випадку з DFX_Text). Крім того, тип прив'язування використовується також настроєно. У попередньому розділі GetRows було описано лише коротко, але це було достатньо, щоб пояснити, що тип прив'язування використовується MFC завжди прямі адреси прив'язки (DAOBINDING_DIRECT). Крім того для зв'язування стовпців змінною довжиною (як DFX_Text) зворотного виклику прив'язування використовується так що MFC можна контролювати виділення пам'яті і вказати адресу правильний довжини. Це означає, що MFC завжди можу сказати DAO "де" покласти даних, що дозволяє прив'язування безпосередньо в змінні-члени. Залишок обов'язкового структури записується речі, як адресу функцію зворотного виклику розподіл пам'яті і тип зв'язування стовпців (обов'язковий стовпець ім'я).

BindParam

Це проста операція, яка закликає SetParamValue з параметра значення, вказаного в ваш член параметра.

Виправлення

Заповнює NULL статус для кожного поля.

SetFieldNull

Ця операція лише кожного поля статус як NULL позначає і встановлює член значення змінної PSEUDO_NULL.

SetDirtyField

Дзвінки SetFieldValue для кожного поля позначені брудні.

Всі операції, що залишилися лише мати справу з використання даних кешу. Дані кешу є додаткові буфер даних поточного запису, який використовується для зробити деякі речі простіше. Наприклад "брудних" полів може бути автоматично виявлено. Як описано в інтерактивній документації, її можна вимкнути, повністю або на рівні поля. Здійснення буфер використовує карти. Ця карта використовується відповідно до динамічно виділені копії даних з адресою "пов'язані" поля (або CDaoRecordset derieved компонент даних).

AllocCache

Динамічно виділяє значення кешовані поля та додано до карти.

FreeCache

Видалення значення кешовані поля та видаляє його з карта.

StoreField

Копіювання поточного значення поля, до даних кешу.

LoadField

Копіювання кешовані значення в поле член.

MarkForAddNew

Перевіряє, якщо поточні значення поля є non-NULL і знаки, це брудні, якщо це необхідно.

MarkForEdit

Порівнює поточного значення поля з даними кеш і знаки брудних, якщо це необхідно.

Порада   Модель ваш власний DFX процедур існуючих DFX процедури для типів стандартних даних.

Технічні примітки за номером |nbsp; Технічні примітки за категоріями

Index