Це технічні записці описується механізм обміну (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 механізм працює подібно до механізм обміну (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; Технічні примітки за категоріями