На першому кроці вказується, що проект буде однодокументним. На другому кроці вказуються опції бази даних, яку буде використовувати дане застосування. В якості джерела даних встановлюється Microsoft Access. Можна також вказати тип набору записів. Статичний набір записів (Snapshot) представляє статичний варіант проедставлення даних. Динамічний нібір записів (Dynaset) перехоплює лише індекс даних, таким чином, ці набори можуть відображати зміни, що виконані в записах після створення набору записів (але не додавання чи видалення яких-небудь записів). Набір записів у вигляді таблиці допускає більш конкретне маніпулювання таблицями в реляційній базі даних. В той час як статичні набори представляють більш безпечний вибір, динамічні набори забезпечують переваги в плані продуктивності.
При створенні проекту майстер AppWizaRD створює такі класи:
Новий клас CMFSDB є похідним від CRecordset. При об’явленні цього класу можна побачити, що майстер AppWizard не тільки створив клас, але й додав змінні-члени, що відображають поля вказаної таблиці бази даних. Ці змінні також відображаються в файлі реалізації класу, в конструкторі, а також – в функції DoFieldExchange. Остання викликається MFS для обміну даними між змінними набору записів і відповідними стовпцями в таблиці бази даних.
Такий створений проект представляє собою пусте діалогове вікно. Для його зміни треба додати елементи керування і скористатися майстером ClassWizard для додавання відповідних змінних-членів класів.
До діалогового вікна можна додати статичні елементи керування та елементи редагування, які будуть відображати необхідну інформацію, вибіка якої буде здійснюватися запитом:
SELECT DISTINCT student.Name, subject.Subject
FROM (Mark INNER JOIN student ON Mark.Name = student.Name) INNER JOIN subject ON Mark.Subject = subject.Subject
WHERE (((Mark.Mark)<61));
Вибрати всіх студентів, що мають академзаборгованості.
Даний запит можна реалізувати безпосередньо в середовищі Visual C++ за допомогою функції CRecordset::GetDefaultSQL. ЇЇ змінна – m_strFilter відповідає умові SQL – WHERE.
Cstring CMFSDBSet::GetDefaultSQL()
{
m_strFilter=_T(“[Mark].[Mark]<61”);
return _T(“[Mark],[student]”);
}
Кінцевий вигляд застосування:
За допомогою Component Galery до проекта було ще додано Tips of the Day:
Об’єкти доступу до даних.
Data Access Objects (Об’єкти доступу до даних) – один з останніх виробів Microsoft в технології доступу до баз даних. Ця технологія застосовується до баз даних в Microsoft Visual Basic, Microsoft Access та Visual Basic for Application; починаючи з Visual C++4, за допомогою набору спеціалізованих класів MFS ця технологія доступна і для програміста Visual C++.
DAO надає можливість доступу і маніпулювання базами даних за допомогою машини баз даних Microsoft Jet. За допомогою Jet-машини можна отримувати доступ до локальних і віддалених базам даних через драйвери ODBC.
Технологія DAO базується на OLE. Вона значно спрощується класами DAO в MFS.
Багато функцій DAO використовують оператори мови SQL. Можна скористатися SQL-оператором SELECT для отримання даних з бази даних або SQL-операторами UPDATE, INSERT та DELETE для зміни вмісту бази даних. Найпростіший спосіб створення SQL-операторів для використання з об’єктами DAO- створення запиту з Microsoft Access, збереження в базі даних та доступ до нього за допомогою об’єкта QueryDef.
Visual C++ запезпечує інтенсивну підтримку для побудови застосувань DAO за допомогою майстера AppWizard. В додаток до ODBC майстер AppWizard дозволяє створювати застосування, засновані на класах DAO.
Класи DAO.
Існує 5 основних та 2 допоміжних класи, пов’язаних з DAO.
Всі об’єкти DAO похідні від DBEngine; більш того, всі об’єкти бази даних – похідні від об’єктів Workspace. Проте якщо не треба маніпулювати захищеними базами даних, як правило, нема необхідності звертатися до жодного з них, а достатньо первинний об’єкт Workspace визивати для всіх транзакцій.
Об’єкти бази даних і набору записів достатньо очевидно представляють бази даних і набори виборок (таблиці, набори записів або динамічні набори) в ціх базах даних.
Об’єкти визначення запитів (QueryDef) використовуються для виконання конкретних SQL-запитів по відношенню до бази даних. Для доступу до інформації в базі даних через конкретний запит визначення запитів звичайно використовується разом з наборами записів.
Об’єкти визначення таблиць (TableDef) представляють структуру таблиць в базі даних. За допомогою об’єктів визначення таблиць можна створювати нові таблиці та змінювати структуру та характеристики існуючих.
Існують ще декілька типів об’єктів DAO. Вони (Field, Parametr, Index, User, Group, Error) не представлені конкретними класами MFS. Об’єкти DAO цього типу доступні через інші відповідні класи DAOMFS.
Об’єкти CDaoRecordset представляють набори записів. Такий набор може представляти записи в таблиці, динамічний і статичний набори. Набір записів типу таблиці є поновлюваним і представляє записи в одній таблиці. Набір записів динамічного типу представляє записи з одної або декількох таблиць результатом запиту. Записи динамічного типу також поновлювані. Статичній набір може містити поля з одної або декількох таблиць, але ці поля не поновлювані. Статичний набір – це статична копія записів, що використовується для пошуку даних або створення звітів.
Набір записів представляє велику кількість функцій. Найважливішими з них є функції переміщення по набору записів та функції поновлення даних. К функціям переміщення відносяться Find, FindFirst, FindLast, FindPrev, Move, MoveFirst, MoveLast, MoveNext, MovePrev. До числа функцій поновлення входять AddNew, CancelUpdate, Delete, Edit, Update.
Інші функції, пов’язані з переміщенням, - GetAbsolutePosition, GetBookmark, GetPercenrPosition, SetAbsolutePosition, SetBookmark, SetPercentPosition.
Клас CDaoRecordset представляє різні функції атрибутів для установки та отримання атрибутів набору записів. Напиклад, функцію CanUpdate можна використовувати для визначення, чи є набір записів поновлюваним; функція SetCurrеntIndex застосовується для установки поточного індексу на набір записів таблиці.
Звичайно клас CDaoRecordset використовується шляхом створення похідного від нього класу набору записів, додавання змінних класу, що представляють поля, та перекриттям функції DoFieldExchange для підтримки обміну даними між базой даних та змінними класу. Проте існує декілька методів, що забезпечують альтернативну можливість. До їх числа входять функції GetFieldValue та SetFieldValue, які представляють можливість прямого доступу до значення поля за ім’ям. Цей метод називають динамічним зв’язуванням, на противагу статичному, який виконується за допомогою DoFieldExchange.
Інші операції з наборами даних можна використовувати для керування локально підтримуємим кешем записів і для маніпулювання індексами набору записів.
Клас CDaoDatabaseпредставляє з’єднання з базою даних. З’єднання відбувається викликом функції CDaoDatabase::Open і переривається викликом CDaoDatabase::Close. Нова база даних може бути створена за допомогою функції CDaoDatabase::Create.
Клас CDaoDatabase представляє функції атрибутів; наприклад, GetName можна використовувати для отримання імені бази даних, а IsOpen – для визначення, чи відкрито з’єднання, що представляється об’єктом CDaoDatabase.
Інші методи використовуються для маніпулювання наборами об’єктів визначення таблиць і визначення запитів для цієї таблиці даних. Зокрема, функцію DeleteTableDef використовують для видалення з бази даних не тільки об’єкта TableDef DAO, але і основної таблиці і всіх її даних.
Клас CDaoWorkspaceпредставляє сеанси баз даних. Як правило, не треба створювати об’єкти типу CDaoWorkspace, якщо немає необхідності використовувати спеціальні функціональні можливості, що доступні за допомогою цього класу, або отримувати доступ до баз даних, захищених паролем.
Робочій простір DAO може бути створений викликом функції CDaoWorkspace::Create. Аргументи цієї функції вказують ім’я робочого простору, ім’я користувача та пароль. Існуючий об’єкт робочого простору може бути відкритий викликом CdaoWorkspace::Open; робочий простір по замовченню може бути явно відкритий шляхом передачі цій функції параметра NULL.
Існує декілька функцій, які маніпулюють базами даних та самою Jet-машиною баз даних. Наприклад, базу даних можна зжати або відновити викликом функції CompacDatabase або RepairDatabase. Інші функції можна використовувати для маніпулювання іменами користувачів, паролями або іншими атрибутами баз даних.
Клас CDaoQueryDef представляє визначення запитів. Для створення нового визначення запиту слід скористатися функцією CQueryDef::Create; для доступу до визначення запиту, збереженого в базі даних, необхідно використовувати функцію CQueryDef::Open. Щойно створений запит може бути доданий до бази даних викликом функції CQueryDef::Append.
Об’єкти CQueryDef використовуються разом з об’єктами CRecordset для отримання даних з бази даних, а також - безпосередньо; для виконання запиту на дію, яка міняє дані в базі даних, слід використовувати функцію CQueryDef::Execute.
Інші методи CQueryDef використовують для установки і отримання атрибутів визначення запитів і для маніпулювання полями запитів і параметрами.
Клас CDaoTableDef представляєвизначення таблиць. Визначення таблиці описує структуру і атрибути таблиці в базі даних.
Існуюче в базі даних визначення таблиці може бути відкрито викликом функції CDaoTableDef::Open. Нове визначення таблиці може бути створене викликом функції CDaoTableDef::Create. Для додавання до бази даних таблиці, що відповідає новому визначенню, слід викликати функцію Append.