Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 47
Національний університет “Києво-Могилянська Академія”
на тему:
“ Visual C++. Бази даних. ”
департаменту
компютерних технологій
Науковий керівник:
Спасітєлєва С.О.
Зміст:
Програмування баз даних за допомогою ODBC..…..………….………4 ст.
Архітектура ODBC…………………………………………………………...4 ст.
Концепції API ODBC…………………………………………………………5 ст.
Блок-схема типової ODBC-програми………………………………………….7 ст.
Програма установки ODBC…………………………………………………...8 ст.
Приклад програми ODBC……………………………………….…………….9 ст.
Стандарт SQL та ODBC…………………………….……………………….13 ст.
ODBC в MFS-застосуваннях………………………………………….……...24 ст.
Створення структури застосування за допомогою AppWizard…………………27 ст.
Обєкти доступу до даних (DAO)………………………………..……….30 ст.
Класи DAO………………………………………………………………...31 ст.
Побудова застосування DAO…………………………………………….....34 ст.
Візуальні інструменти баз даних……………………………………..…..39 ст.
Висновки……………………………………………………………………….42 ст.
Вступ .
В першу чергу Visual C++ - це компілятор C++, але це також і середовище, компоненти якого, взаємодіючи один з одним, спрощують процес розробки застосувань. Середовище Visual C++ пропонує великі можливості для програмування Windows-застосувань. Найхарактернішою його компонентою є бібліотека основних класів Microsoft (Microsoft Foundation Classes MFS). Великий набір класів С++ інкапсулює основну частину API (Application Standart Interface) Win32 і пропонує могутню основу для написання типових застосувань. До складу Visual C++ входить Microsoft Developer Studio Integrated Development Environment інтегроване середовище для розробки застосувань (IDE). Visual Studio 97 остання версія Microsoft Developer Studio є ядром системи розробки Visual C++. Вона пропонує багато різних можливостей, надає доступ до багатьох компонент системи розроблювача Visual C++, а також взаємодіє з такими засобами розробки Micrisoft, як Visual J++ або Microsoft Network Library. Visual Studio підтримує інтерфейс для компонентів проектів, початкових файлів і файлів ресурсів, а також ряд інструментів для побудови, запуску і тестування застосувань, хоча компілятор C/C++ та інші компоненти середовища розробника можна використовувати і з командного рядка. Visual Studio пропонує інтегрований інтерфейс для таких основних інструментів Visual C++ як майстри. Майстри (Wizards), такі як AppWizard, - це інструменти генерації структур застосувань. За допомогою таких майстрів можна створювати структури застосувань серверів або контейнерів компонентів OLE, застосувань ODBC та DAO, серверів автоматизації, елементів управління ActiveX.
Visual C++ пропонує широкі можливості для програмування баз даних, які, зокрема, полягають в розширеному керуванні джерел даних і відладці. В застосуваннях можна використовувати декілька технологій баз даних: ODBC (Open Database Connectivity) - Звязок відкритих баз даних, незалежний від постачальника механізм доступу до даних з різних джерел, DAO (Data Access Objects) Обєкти доступу до даних, застосовується для доступу к базам даних в Microsoft Visual Basic, Microsoft Access, Visual Basic for Applications, ADO (ActiveX Data Objects) компактна технологія доступу до даних, орієнтована на Web, OLE DB база даних OLE, набір специфікацій інтерфейсів компонентної обєктної моделі COM.
Метою даної курсової роботи є розгляд основних можливостей програмування баз даних в Visual C++, зокрема використовуючи ODBC та DAO.
Програмування баз даних за допомогою ODBC.
ODBC або Open Database Connectivity (Звязок відкритих баз даних) незалежний від постачальника механізм доступу до даних з різних джерел. Він є реалізацією специфікацій X/Open та SAG CLI (SQL Access Group Call Level Interface) інтерфейс рівня виклику групи доступу SQL, яку виконала фірма Microsoft. ODBC пропонує функції для взаємодії з базами даних за допомогою мови програмування, наприклад, додавання, модифікування і видалення даних, отримання службової інформації про базу даних, таблиці та індекси.
Архітектура ODBC.
Архітектура ODBC складається з пяти основних рівнів: прикладний рівень, інтерфейс ODBC, диспетчер драйверів, драйвер та джерело даних.
Прикладний рівень реалізує GUI (Graphical User Interface Графічний інтерфейс користувача) та бізнес-логіку. Він написаний на мові програмування, такій як Java, Visual Basic або C++. Прикладна програма використовує функції з інтерфейсу ODBC для взаємодії з базами даних.
Диспетчер драйверів є частиною ODBC Microsoft. Він керує різними драйверами, що знаходяться в системі, виконуючи завантаження, спрямування викликів на потрібний драйвер і надання прикладній програмі інформації про драйвер, коли це необхідно. Оскільки одна прикладна програма може бути звязана з декількома базами даних, то диспетчер драйверів гарантує, що відповідна система керування базою даних отримує всі запити, що надходять до неї, та що всі дані з джерела даних будуть передані прикладній програмі.
Драйвер та частина архітектури, яка все знає про будь-яку базу даних. Система драйверів ODBC працює не лише на платформі WINDOWS, але і на інших, зокрема UNIX, що перетворює API ODBC на могутній інструмент для створення платформно-незалежних застосувань. Крім того ODBC приводить використовуємий в застосуванні синтаксис SQL до єдиного стандарту, що дозволяє розробляти застосування незалежні від вида бази даних. Звичайно драйвер повязаний з конкретною базою даних, наприклад, драйвери Access, Oracle та драйвер SQL Server. Інтерфейс ODBC має набір функцій, таких як оператори SQL, управління зєднанням, інформація про базу даних тощо. В обовязки драйвера входить їх реалізація. Це означає, що в деяких базах даних драйвер повинен емулювати функції інтерфейсу ODBC, які не підтримуються системою керування базою даних. Він виконує роботу по розсиланню запитів в бази даних, отриманню відповідей і відправленню їх прикладній програмі. Для баз даних, що працюють в локальних мережах або Internet, драйвер підтримує мережний звязок.
Джерело даних в контексті ODBC може бути системою керування базою даних або просто набором файлів на жорсткому диску. Він може бути як простою базою даних Microsoft Access для невеликої фірми, так і багатосерверним зберігачем інформації про клієнтів телефонної компанії і їх розмовах.
Коцепції API ODBC.
Основною частиною системи ODBC є драйвер. Драйвери можуть бути однорівневі та багаторівневі. Однорівневі драйвери обробляють звертання ODBC і оператори SQL, а багаторівневі обробляють звертання ODBC та передають оператори SQL джерелу даних (можливо, серверу, розташованому де-небудь в мережі). ODBC не вимагає, щоб драйвери підтримували всі функції цього інтерфейсу. Замість цього для драйверів визначаються рівні відповідності API та граматики SQL. Єдина вимога: якщо драйвер задовільняє деякому рівню, то він повинен підтримувати всі функції ODBC, визначені на цьому рівні, незалежно від того, чи підтримує їх база даних. Так як в обовязки драйвера входить емуляція функцій ODBC, що не підтримуються системою керування базою даних, то інтерфейс ODBC не залежить від реалізації бази даних.
Рівні відповідності API та граматики SQL для ODBC.
Тип |
Рівень відповідності |
Опис |
Рівні відповідності API |
Ядро |
Всі функції із специфікації SAG CLI. Виділення і звільнення описувачів звязку, SQL-оператора і оточення. Підготовка і виконання операторів SQL. Отримання результату і службової інформації про результат. Отримання інформації про помилки. Здатність виконувати транзанкції. |
Рівень 1 |
Розширений набір 1 включає API ядра плюс можливості посилати і отримувати часткові набори даних, шукати інформацію в каталозі, отримувати інформацію про можливості драйвера і бази даних, тощо. |
|
Рівень 2 |
Розширений набір 2 включає рівень 1 плюс можливості обробляти масиви як параметри, можливість прокрутки курсору, виклик DLL транзанкцій, тощо. |
|
Рівні відповідності граматики SQL |
Мінімальна граматика |
Функції створення і видалення таблиць в мові визначення даних. Прості функції вибору, вставки, модифікації і видалення в мові маніпулювання даними. Прості вирази. |
Граматика ядра |
Відповідність специфікаціям SAG CAE 1992 на мінімальну граматику плюс зміна таблиць, створення і видалення індексу, створення і видалення логічних таблиць бази даних для DLL. Повний оператор SELECT для DDL. Повний Оператор SELECT для DML. Функціїї в виразах, наприклад, SUM and MAX. |
|
Розширена граматика |
Додаткові можливості, такі як зовнішні зєднання, позиційовані модифікація і видалення, більше виразів і типів даних, виклики процедур. |
ODBC не є еквівалентом Embedded SQL (Вбудований SQL), який використовує оператори SQL в вихідних програмах, написаних на інших мовах. Схожі гібрідні програми перед передечею компілятору основної мови програмування оброблюються прекомпілятором. ODBC інтерпретує оператори SQL під час виконання. Основна програма не потребує прекомпіляції для виконання різних операторів SQL, як і не треба компілювати окремі версії програми для різних джерел даних.
Блок-схема типової ODBC-програми.
Перш ніж реалізувати оператори SQL, застосування ODBC повинно виконати ряд дій, щоб підєднатись до джерела даних. Типові дії звертання ODBC:
SQLAllocEnv(); Виділяє середовище ODBC
SQLAllocConnect(); Виділяє память для підключення
SQLConnect(); Завантажує драйвер, підключає до джерела
SQLAllocStmt(); Виділяє память для оператора SQL
SQLFreeStmt(); Звільнює память, виділену для оператора
SQLDisconnect(); Перерозподіляє драйвер, відключає від джерела
SQLFreeConnect(); Звільнює память, виділену для підключення
SQLFreeEnv(); Звільнює середовище, перериває сеанс
Виклик SQLAllocEnv() ініціалізує бібліотеку ODBC і повертає дескриптор типу SQLHENV. Дескриптор типу SQLHDBC, що повертається функцією SQLAllocConnect(), використовується в наступних звертаннях до функцій ODBC для посилання на певне підключення. Одне застосування може підтримувати декілька відкритих підключень. Функція SQLConnect() шляхом завантаження драйверу і підключення до джерела даних встановлює зєднання. Це звертання до функції має варіанти; наприклад, виклик SQLDriverConnect(), можна використовувати для підключення до джерел даних, які не встановлюються за допомогою програми початкової установки ODBC. SQLBrowseConnect() дозволяє застосуванню циклічно продивлятися джерела даних. Виділяючи память для оператора SQL за допомогою функції SQLAllocStmt() на окремому кроці, ODBC забезпечує механізм, при якому оператори можуть конструюватися і використовуватися один раз і кілька разів перш, ніж виділена память. Після цих чотирьох звертань, як правило, застосування ODBC створює звертання до бази даних для виконання операторів SQL. Воно може використовувати функцію SQLPrepare() для підготовки (компіляції) оператора SQL для виконання і функцію SQLExecute() для дійсного його виконання. В якості альтернативи виклику SQLPrepare() та SQLExecute() застосування можуть використовувати функцію SQLExecDirect() для виконання оператора SQL в одній дії. Спочатку стовпчики звязуються з змінними програми за допомогою SQLBindCol, потім ці змінні зчитуються після виконання SQLFetch() над рядком таблиці. Якщо даних більше нема, SQLFetch() повертає SQL_NO_DATA_FOUND. В якості альтернативи використанню SQLBindCol() для повзаних стовпців застосування можна використовувати функцію SQLGETDATA() для отримання даних з незвязаних стовпців.
Коли його робота закінчена, застосування повинно звільнити задіяні ним ресурси ODBC.
В ODBC 3.0 функція SQLFreeHandle() використовується замість функцій ODBC 2.x SQLFreeEnv(), SQLFreeConnect(), SQLFreeHandle().
Програма установки ODBC.
Програма установки ODBC викликається за допомогою Control Panel (Панель керування) в Windows і використовується для регістрації джерел даних. Що саме є джерелом даних? Це залежить від драйвера. У випадку такого драйвера, як SQL Server, джерелом даних може бути база даних на сервері. В випадку драйвера Microsoft Access або Microsoft Excel база даних є файлом (MDB або XLS). В випадку Microsoft Text Driver база даних це каталог, що містить текстові файли, які стосовно драйвера є таблицями в базі даних. Останні версії ODBC розрізняють три типи джерел даних. Джерело даних користувача це джерело даних, яке бачить лише той, хто його створив. Джерело системних даних доступне всім користувачам даного компютера. Джерело файлових даних - це джерело даних, специфікації якого зберігаються в файлі і можуть бути одночасно використані користувачами на різних компютерах.
Для додавання джерела даних треба викликати програму установки ODBC в Control Panel і, вибравши необхідний тип джерела даних, вибрати драйвер і додати його кнопкою Add. В зявившомуся діалоговому вікні “Create New Data Source” можна вибрати базу даних і встановити необхідні властивості драйвера. Основне діалогове вікно містить список всіх інстальованних джерел даних:
джерело даних джерело системних джерело файлових
користувача даних даних
Діалогове вікно “ODBC Data Source Administrator”
Приклад програми ODBC.
Нище наведено текст простого застосування ODBC, яке зчитує рядки, що містяться в таблиці Excel. Коли доступ до таблиці Excel здійснюється з використанням драйвера Microsoft Excel ODBC, електронні таблиці відіграють роль таблиць бази даних, а рядки в таблиці роль записів у ній.
Таблиця Excel складається з 4 стовпчиків, що містять інформацію про прізвище та імя студента, факультет, де він навчається, та рейтинг за осінній триместр 1998/1999 навч. рік.
Замість інсталяції цієї таблиці в якості джерела даних, використовуючи програму початкової установки ODBC, можна скористуватися можливостями функції SQLDriverConnect.
Застосування може бути скомпільовано з командного рядка введеннням:
cl student.c odbc32.lib. Файл student.xls (таблиця Excel) повинен бути доступним з поточного каталогу.
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <string.h>
#define CONNSTR «DBQ=Student.XLS;DRIVER={Microsoft Excel Driver (*.xls)}»
#define CONNLEN (sizeof(CONNSTR)-1)
#define SQLTRY(x,y) \
{ \
rc = y; \
if (rc != SQL_SUCCESS) \
{ \
char szState[6]; \
char szMsg[255]; \
SDWORD sdwNative; \
SWORD swMsgLen; \
SQLError(hEnv, hDBC, hStmt, szState, &sdwNative, szMsg, sizeof(szMsg), &swMsgLen); \
printf(«Error %d performing %s\nSQLState = %s\nSQL message = %s\n», rc, x, szState, szMsg); \
goto Terminate; \
} \
}
void main(void)
{
SQLHENV hEnv = 0;
SQLHDBC hDBC = 0;
SQLHSTMT hStmt = 0;
SQLCHAR szConnStr[255];
SQLCHAR szStmt[255];
SQLCHAR szName[255];
SQLCHAR szFaculty[255];
long nRating;
SWORD cbConnStr;
RETCODE rc;
SDWORD sdwNLen;
SDWORD sdwFLen;
SDWORD sdwRLen;
int i;
char szResult[1000];
SQLTRY(«SQLAllocEnv», SQLAllocEnv(&hEnv))
SQLTRY(«SQLAllocConnect», SQLAllocConnect(hEnv, &hDBC))
SQLTRY(«SQLDriverConnect», SQLDriverConnect(hDBC, NULL, CONNSTR, CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT))
SQLTRY(«SQLAllocStmt», SQLAllocStmt(hDBC, &hStmt))
sprintf(szStmt, «SELECT * FROM [Sheet1$]»);
SQLTRY(«SQLPrepare», SQLPrepare(hStmt, szStmt, strlen(szStmt)))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szName, sizeof(szName), &sdwNLen))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFaculty, sizeof(szFaculty), &sdwFLen))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nRating, sizeof(nRating), &sdwRLen))
SQLTRY(«SQLExecute», SQLExecute(hStmt))
for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
{
printf(«Record #%d\tName: %s\tFaculty: %s\tRating: %d\n», i, szName, szFaculty, nRating);
}
if (rc != SQL_NO_DATA_FOUND)
{
SQLTRY(«SQLFetch», rc)
}
printf(«Successfully completed.\n»);
Terminate0:
if (hStmt) SQLFreeStmt(hStmt, SQL_CLOSE);
if (hDBC) SQLDisconnect(hDBC);
if (hDBC) SQLFreeConnect(hDBC);
if (hEnv) SQLFreeEnv(hEnv);
SQLTRY(«SQLAllocEnv», SQLAllocEnv(&hEnv))
SQLTRY(«SQLAllocConnect», SQLAllocConnect(hEnv, &hDBC))
SQLTRY(«SQLDriverConnect», SQLDriverConnect(hDBC, NULL, CONNSTR, CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT))
SQLTRY(«SQLAllocStmt», SQLAllocStmt(hDBC, &hStmt))
sprintf(szStmt, «SELECT * FROM [Sheet1$] WHERE Rating>91 ORDER BY Rating DESC»);
SQLTRY(«SQLPrepare», SQLPrepare(hStmt, szStmt, strlen(szStmt)))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szName, sizeof(szName), &sdwNLen))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFaculty, sizeof(szFaculty), &sdwFLen))
SQLTRY(«SQLBindCol», SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nRating, sizeof(nRating), &sdwRLen))
SQLTRY(«SQLExecute», SQLExecute(hStmt))
for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
{
printf(«Record #%d\tName: %s\tFaculty: %s\tRating: %d\n», i, szName, szFaculty, nRating);
}
if (rc != SQL_NO_DATA_FOUND)
{
SQLTRY(«SQLFetch», rc)
}
printf(«Successfully completed.\n»);
Terminate:
if (hStmt) SQLFreeStmt(hStmt, SQL_CLOSE);
if (hDBC) SQLDisconnect(hDBC);
if (hDBC) SQLFreeConnect(hDBC);
if (hEnv) SQLFreeEnv(hEnv);
}
Простий макрос SQLTRY використовується для повідомлення про помилки.
Після обовязкових звертань до функцій SQLAllocEnv та SQLAllocConnect програма викликає SQLDriveConnect. Цей виклик робить можливим відкриття таблиці, яка не встановлювалась з використанням програми початкової установки ODBC і робить це без відображення інтерфейса користувача. Для відкриття таблиці використовуються константи CONNSTR та CONNLEN. Як тільки підключення до бази даних успішно завершено, виконуються послідовно два оператори SQL:
Імя Sheet$ - це імя, яке надається драйвером для першої таблиці в робочій книзі Excel. Оператор SQL використовується для отримання полів всіх записів.
Наступні 4 звертання привязують змінні до стовпчиків таблиці. Таке призначення функції SQLBindCol. Після послідовного отримання записів, значення полів переміщуються в ці змінні.
Самі записи отримуються за допомогою функції SQLFetch і відображаються з використанням printf. Функція SQLFetch викликається до тих пір, поки значення, що повертається нею, не відрізняється чим-небудь від SQL_SUCCESS. Значення, що повертається, SQL_NO_DATA_FOUND показує, що отриманий останній запис, все інше є помилкою і обробляється відповідним чином.
Програма завершується обовязковими звертаннями до функцій SQLFreeStmt, SQLDisconnect, SQLFreeConnect та SQLFreeEnv для звільнення ресурсів і закінчення звязку з джерелом даних.
При запуску цієї програми забезпечується такий вивід:
Стандарт SQL та ODBC.
Синтаксис для ODBC заснований на стандарті ANSI SQL-92.
Майже кожна СУБД використовує свій власний діалект SQL, синтаксис якого може трохи відрізнятися. Кожен діалект може підтримувати різний набір властивостей. Драйвер ODBC для конкретної бази даних забезпечить необхідний переклад загального SQL на специфічний діалект, що використовується в певній СУБД.
Існує три основні групи операторів SQL:
Всі ці мови є частиною SQL, а не є окремими мовами, хоча в більшості застосувань використовуються лише оператори, що відносяться до конкретної групи.
В DDL для роботи з обєктами використовуються такі оператори SQL:
Ці оператори використовуються для роботи з різними обєктами бази даних таких, як таблиці, індекси і представлення таблиць. Для кожного з цих типів обєктів використовується різний синтаксис оператора.
В таблицях основних обєктах реляційних базах даних можуть міститися дані різних типів. Типи даних SQL, згруповані згідно рівням підлеглості ODBC SQL.
Мінімальний рівень:
Базовий рівень:
Розширений рівень:
Створення таблиці.
CREATE TABLE Student (
StudID UNTEGER,
StudName VARCHAR (20) )
Стовпчики таблиці можна довизначити, якщо додати після типу даних додаткові модифікатори. Найчастіше використовується модифікатор NOT NULL, який вказує на те, що значення для цього стовпця повинно бути задано. Можна також вимагати, щоб конкретне поле в таблиці не повторювалось. Для цього використовується модифікатор UNIQUE. Можна також задати для стовпця значення, що буде використовуватися по замовченню, якщо не було задано явних значень. Для цього служить модифікатор DEFAULT.
Видалення таблиці.
DROP TABLE Student
В опрераторі видалення можуть використовуватися ключові слова CASCADE та RESTRICT. Якщо в операторі вказано ключове слово CASCADE, то при видаленні таблиці видаляються також всі представлення або обмежувачі цілостності, повязані з цією таблицею. Модифікатор RESTRICT не дозволить видалити таблицю, якщо на неї є посилання в яких-небудь представленнях або обмежувачах цілостності.
Зміна таблиці.
Додавання стовпців:
ALTER TABLE Student ADD COLUMN Course INTEGER
Видалення стовпців:
ALTER TABLE Student DROP COLUMN Course
Як і при видаленні таблиці, тут можна використовувати ключові слова CASCADE та RESTRICT. При включенні модифікатору CASCADE видаляються також всі представлення і обмежувачі, які посилаються на видаляємий стовпець. Використання модифікатора RESTRICT запобігає видаленню стовпця, якщо на нього є посилання в представленнях або обмежувачах цілостності посилань.
Індекси.
Це обєкти баз даних, що забезпечують більш ефективний доступ до рядків таблиці. Індекс продивляється рядки таблиці на основі значень певного стовпця або декількох стовпців. Індекси можуть значно підвищити продуктивність бази даних при виконанні певних типів операцій пошуку, проте для їх підтримання треба великий обсяг динамічної памяті. Якщо для одної таблиці створити багато різних індексів, продуктивність всього застосування значно зменшиться.
CREATE [UNIQUE] INDEX StudIndex ON Student (StudID) [ASC, DESC]
ASC в зростаючому порядку
DESC в спадаючому порядку
Змінити індекс неможливо, а можна лише видалити його.
DROP INDEX StudIndex
Представлення.
Педставлення таблиць, або просто представлення можна розглядати як вид віртуальної таблиці. З точки зору застосувань користувачів, представлення таблиці виглядає як і сама таблиця. Проте в представленні зберігаються не його власні дані, а лише посилання на дані, що містяться в таблицях. В цілому представлення використовуються для відображення даних, що містяться в таблицях, різними способами зручними для користувача. Представлення можна використовувати для відображення підмножини стовпців однієї або декількох таблиць, що віповідають деякому типу запита. Це дозволяє представляти таблицю з потрібними даними, хоча в дійсності стуктура бази даних може бути іншою, сформованою виходячи з міркувань цілостності та продуктивності. Представлення таблиць зручні для забезпечення безпеки. За допомогою представлення можна забезпечити доступ користувачів до деякої підмножини стовпців в таблиці, залишаючи захищеними інші стовпці. Представлення служать і для забезпечення логічної незалежності даних, завдяки чому зміни занесені в реальні таблиці баз даних не відображаються на застосуваннях користувача. Якщо таблиця в базі даних буде змінена, то можна буде просто настроїти представлення у відповідності з новою структурою таблиці і не треба буде повертатися і вносити зміни в кожне написане застосування.
CREATE VIEW MyView AS SELECT * FROM TABLE MyTable
Представлення відображає всі стовпці таблиці
CREATE VIEW MyView (Id, Name) AS SELECT (StudID, Studname) FROM Student
Існуюче представленя не можна модифікувати, але можна його видалити.
DROP VIEW MyView
Мова керування даними DCL.
Дозволяє працювати з правами користувачів на обєкти в базі даних.
Мова SQL дозволяє присвоїти групі користувачів певні права на деякий обєкт. Права можуть бути такими:
Права присвоюються:
GRANT SELECT ON Student TO PUBLIC
GRANT SELECT, INSERT ON Student TO Sveta, Lena
Права UPDATE та REFERENCES можуть поширюватися на окремі стовпці.
GRANT UPDATE (Raiting, Credit) ON Student TO Sveta
Відмінити права на обєкти можна за допомогою оператора REVOKE:
REVOKE SELECT ON Student FROM Lena
В операторі REVOKE можна використовувати модифікатори CASCADE та RESTRICT. Якщо відміняються права користувача на деяку таблицю, то доцільно відмінити його права на всі представлення, що потребують доступу до всієї таблиці. Зробити це можна за допомогою CASCADE. Модифікатор RESTRICT не дозволяє відмінити право доступу, яке вимагається згідно іншим правам, що присвоєні цьому користувачу.
Мова маніпулювання даними DML.
Основні типи операторів:
SELECT основа SQL. Використовується кожен раз при отриманні даних. Базовий синтаксис оператора SELECT:
SELECT * FROM Student
Інші:
SELECT * FROM Student WHERE Raiting>91 AND Credit<120
SELECT * FROM Student WHERE NOT Course=4
SELECT * FROM Student WHERE (Raiting/Credit)<1
В SQL є спеціальний оператор для порівняння символьних рядків. Предикат LIKE вибирає рядки на основі визначеного шаблону. В шаблон можуть входити звичайні символи, а також символи % та _. Рядок символів довільної довжини можна поставити у відповідність шаблону %, а один символ - _.
Вибір всіх рядків, що містять рядок Database в полі Title
SELECT ChapterNum FROM Chapters WHERE Title LIKE %Database%
Пошук заголовків, в яких починаючи з другої позиції міститься рядок ata
SELECT ChapterNum FROm Chapters WHERE Title LIKE _ata%
Для спрощення оператору WHERE використовується предикати IN та BETWEEN:
SELECT StudID FROM Student WHERE Course IN (4, 3)
SELECT StudName FROM Student WHERE Raiting BETWEEN 91 AND 100
В багатьох задачах треба знайти всі можливі значення певного поля на деякій множині рядків. Зробити це можна за допомогою ключового слова DISTINCT, яке запобігає дублюванню елементів в вихідній множині результатів.
SELECT DISTINCT Course FROM Student
По замовченню рядки, що повертаються після виконання запиту, подаються в довільному порядку. Змінити це можна за допомогою оператора ORDER BY, який дозволяє вказати один або декілька стовпців, що будуть використовуватися для сортування повертаємих рядків. Для кожного стовпця можна вказати модифікатор ASC або DESC.
SELECT StudID FROM Student ORDER BY StudID ASC
Якщо в операторі ORDER BY вказати декілька стовпців, то повертаємі рядки будуть відсортовані спочатку за першим стовпцем. Потім рядки, що містять однакові значення в першому полі, будуть відсортовані ще і за другим стовпцем.
Сортування рядків за зростанням значень в стовпці Salary, а рядки з однаковими значеннями в цьому полі за спаданням ідентифікаційних номерів EmpID:
SELECT EmpID, Salary FROM Employee ORDER BY Salary ASC, EmpID DESC
Дуже часто треба вираховувати значення на основі даних з усіх рядків, що повертаються, наприклад загальну суму значень в деякому стовпці всіх повертаємих рядків. Такі типи розрахунків можна виконувати за допомогою таких функцій:
Задання значень дати і часу викликає особливий інтерес. Як правило, в різних системах керування базами даних використовуються різні, а тому, несумісні, способи представлення літералів для таких значень. ODBC забезпечує переносимий синтаксис для таких значень.
Для літералів дати використовуються один з наступних форматів:
{d yyyy-mm-dd}
Для літералів часу:
{t hh:mm:ss}
Для представлення значень дати і часу:
{ts yyyy-mm-dd hh:mm:ss}
Функції SQL.
В SQL, що використовується для ODBC, визначено багато функцій, які можна використовувати при побудові запитів або в параметрі списку вибору, або в операторі WHERE. Ці функціі можна розподілити на 5 груп: числові, строкові, функції дати та часу, функції системи та функції перетворення типів даних.
Синтаксис ODBC визначає таку форму запису при виклику функції в SQL:
{fn імя функції}
Строкові функції
Деякі функції для роботи з рядками в ODBC SQL:
Числові функції.
Деякі числові функції в ODBC SQL:
Функції дати та часу.
Деякі функції дати та часу в ODBC SQL:
Системні функції.
Деякі системні функції в ODBC SQL:
Перетворення типів даних.
Функція перетворення типів даних в ODBC SQL:
CONVERT(вираз, тип_даних)
Параметр тип_даних може приймати такі значення:
Обєднання.
Операція обєднання повертає рядки, що сформовані з даних двох або більше різних таблиць і обєднані в процесі виконання запиту.
SELECT Name, Prices FROM Products, Prices WHERE Products.ID=Prices.ID
При виконанні цього оператора будуть виділені всі рядки з таблиці Products, що відповідають рядкам з таблиці Prices. Це так зване внутрішнє обєднання. Для того, щоб створити запит, який повертає рядки, що не мають відповідності в одній з цих таблиць, треба використовувати зовнішнє обднання.
Вибрати рядки для кожного працівника, зокрема тих, хто ще не відноситься ні до якого відділу.
SELECT * FROM
{oj Employee LEFT OUTER JOIN Department ON
Employee.DeptNum=Department.DeptNum}
LEFT OUTER JOIN використовується для того, щоб гарантувати, що в результуючій множині будуть представлені всі рядки з лівої таблиці (Employee). Щоб включити всі рядки з правої таблиці можна використовувати RIGHT OUTER JOIN, а для вибору всіх рядків з обох таблиць FULL OUTER JOIN.
Вкладені запити.
Вкладений запит може використовуватися з предикатом EXISTS (NOT EXISTS).
Вибрати список відділів, що не укомплектовані працівниками:
SELECT DeptName FROM Department
WHERE DeptNum NOT EXISTS (SELECT * FROM Employee)
Повертається список відділів, номера яких не містяться в жодному запису таблиці Employee.
Можна також використовувати предикати IN та NOT IN.
Дуже часто вкладені запити використовуються для операцій порівняння з клячовими словами ANY та ALL.
Скласти список всіх студентів департаменту компютерних технологій, у яких рейтинг вищий, ніж у студентів природничого факультету.
SELECT Student_DCSS.Name FROM Student_DCSS
WHERE Student_DCSS.Rating >ALL
(SELECT Student_FNS.Rating FROM Student_FNS)
Обєднані запити.
SQL дозволяє отримати один результат через обєднання двох незалежних запитів шляхом їх комбінації за допомогою ключового слова UNION.
SELECT * FROM Students_DCSS
UNION
SELECT * FROM Students_FNS
Оператор INSERT.
За допомогою оператора INSERT можна вставити дані в певне місце в базі даних.
INSERT INTO Students_vipuskniki
VALUES (1, Sveta Fiyalka, DCSS, 95)
Оператор DELETE.
DELETE FROM Student WHERE Student.Rating<61
Оператор UPDATE.
За допомогою цього оператора можна змінювати значення в існуючих рядках бази даних:
UPDATE Employee SET Salary+100
ODBC в MFS-застосуваннях.
Використання ODBC значно спрощується за допомогою Microsoft Foundation Classes Library (Бібліотека основних класів Microsoft). Прості застосування, що отримують доступ к таблицям через ODBC, можуть бути створені всього лише декількома натисненнями кнопки миші з використанням мастерів AppWizard та ClassWizard. Існує декілька класів MFS, які підтримують доступ до баз даних і наборам записів.
Класи ODBC в MFS.
Найголовніші класи, що надаються MFS для підтримки застосувань ODBC це класи CDatabase та CRecordset. Клас CDatabase представляє зєднання з джерелом даних. Його змінна m_hdbc представляє дескриптор зднання ODBC. Функції Open та Close можна використовувати для установки або закриття зєднання з джерелом даних. Інші функції використовуються для установки або отримання параметрів зєднання. До таких функцій належать: GetConnect(повертає рядок зєднання ODBC), IsOpen, GetDatabaseName, CanUpdate, CanTransact, InWaitForDataSource, SetLoginTimeout та SetSynchronousMode. По замовченню для доступу до джерела даних клас CDatabase використовує асинхронний режим. Виконувана асинхронна дія може бути перервана викликом функції Cancel.
Обробка транзанкцій підтримується функціями BeginTrans та Rollback.
Клас CDatabase надає також дві перекриваємі функції. Функція OnSetOptions використовується для установки стандартних опцій зєднання. Функція OnWaitForDataSource викликається системою для повідомлення про час обробки при виконанні довгої операції.
Функцію ExecuteSQL можна використовувати для безпосереднього виконання оператора SQL. Цей оператор не використовується разом з операторами SQL, що повертають записи даних.
Клас CRecordset інкапсулює функціональні можливості оператора ODBC SQL і набору рядків, що повертаються оператором. Змінні-члени цього класу ідентифікують дескриптор оператора ODBC, число полів і параметрів в наборі даних, обєкт CDatabase, за допомогою якого набір записів підключен до джерела даних, і два рядки, що відповідають умовам WHERE та ORDER BY.
Двома основними типами наборів записів є динамічні і статичні набори. Тип набору записів вказується при виклику функції CRecordset:Open. Статичні набори представляють статичний варіант представлення даних. Це найбільш зручно для таких задач, як створення звіту. Динамічні набори представляють динамічний варіант представлення даних, що відображає зміни,виконані іншими користувачами або за допомогою інших наборів записів застосування.
Коли набір записів відкривається викликом функції Open, відбувається доступ до таблиці і запит, що представляється наьором записів, виконується. Набір записів і повязаний з ним дескриптор можуть бути закриті викликом функції Close.
Атрибути набору записів можна отримати через виклик функцій CanAppend, CanRestart, CanScroll, CanTransact, CanUpdate, GetRecordCount, GetTableName, GetSQL, IsOpen, IsEOF, IsBOF та IsDeleted.
Переміщення по набору записів можна отримати за допомогою функцій Move, MoveFirst, MoveLast, MoveNext та MovePrev.
Дії з набором записів можуть відбуватися викликом функцій Addnew, Delete, Edit або Update.
Обєкт типу CRecordset ніколи не використовується безпосередньо. Необхідно отримати клас, похідний від CRecordset, і додати змінні, що відповідають оплям таблиці, яку представляють набір записів. Потім треба перекрити функцію DoFieldExchange набору записів; ця функція за допомогою функцій обміну полями записів RFX_(Record Field Exchange) повинна сприяти обміну даних між змінними класу та полями в базі даних. Ці функції за синтаксисом аналогічні функціям обмуну даними діалогу (dialog data exchange DDX_).
Функції RFX_
Імя функції |
Тип поля |
Тип SQL ODBC |
FX_Binary |
CByteArray |
SQL_BINARY, SQL_LONGVARBINARY, SQL_VARBINARY |
RFX_Bool |
BOOL |
SQL_BIT |
RFX_Byte |
BYTE |
SQL_TINYINT |
RFX_Date |
CTime |
SQL_DATE, SQL_TIME, SQL_TIMESTAMP |
RFX_Double |
double |
SQL_DOUBLE |
RFX_Int |
int |
SQL_SMALLINT |
RFX_Long |
LONG |
SQL_INTEGER |
RFX_LongBinary |
CLongBinary |
SQL_LONGVARCHAR |
RFX_Single |
float |
SQL_REAL |
RFX_Text |
Cstring |
SQL_CHAR, SQL_DECIMAL, SQL_LONGVARCHAR, SQL_NUMERIC, SQL_VARCHAR |
Обмін полями підтримується за допомогою класу CfieldExchange. Обєкт цього класу містить інформацію про поля, обмін якими повинен відбуватися при виклику функції DoFieldExchange набору записів.
Клас CRecordView це клас перегляду, похідний від CformView, розробленого спеціально для відображення в формах записів баз даних. Обєкти типу CRecordView використовують функції обміну даними діалогу (DDX) та обміна полями записів (RFX) для підтримки переміщення даних між формою і джерелом даних. Обєкти, похідні від CRecordView використовуються разом з обєктами, похідними від CRecordset.
Операції ODBC використовують клас CDBException для повідомлення про помилки шляхом механізму MFC-виключень.
Створення структури застосування ODBC за допомогою AppWizard.
Перш ніж MFS-застосування ODBC буде створено за допомогою AppWizard, необхідно ідентифікувати джерело даних, яким буде оперувати застосування. Джерело даних повинно бути ідентифіковано і інстальовано за допомогою програми установки ODBC.
Нехай джерелом даних буде база даних Microsoft Access. Для доступу до цього файлу потрібен драйвер Microsoft Access Driver.
База даних Student складається з 3 таблиць, що містять інформацію про студента, предмети та оцінки студента з цих предметів. В базі даних Access також створено запити, які оперують з даними бази.
Щоб створити структуру застосування ODBC треба запустити майстер AppWizard. Нехай проект буде мати назву - MFSDB.
Проекти, створені таким чином, можуть бути однодокументними, багатодокументними або діалоговими застосуваннями. Однодокументне застосування може представляти користувачу в будь-який момент лише один файл. Найкращим прикладом такого застосування є текстовий редактор Notepad в Windows. Багатодокументне застосування може одночасно представляти декілька документів, кожний у своєму вікні. Більшість текстових редакторів, таких як Microsoft Word, є багатодокументними застосуваннями. Інтерфейс користувача діалогового застосування являє собою одне діалогове вікно. Такі застосування використовуються, якщо взаємодію з користувачем можна провести в одному шаблоні діалогового вікна. Прикладом діалогового застосування є Таблиця символів (Character Map) Windows.
На першому кроці вказується, що проект буде однодокументним. На другому кроці вказуються опції бази даних, яку буде використовувати дане застосування. В якості джерела даних встановлюється 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 цього типу доступні через інші відповідні класи DAO MFS.
Обєкти 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.
Поля можуть створюватися і видалятися за допомогою функцій CreateField та DeleteField. Індекси для таблиці можуть бути створені або видалені викликом функцій CreateIndex та DeleteIndex. Інші функції можна використовувати для установки або отримання різних атрибутів таблиці, наприклад, GetFieldCount повертає кількість полів в таблиці, а SetValidationRule використовується для присвоєння полю умови перевірки на значення.
Крім цих основних класів DAO операції DAO використовують два додаткових класи: CDaoFieldExchange та CDaoException.
CDaoFieldExchange використовується при звертаннях до CDaoRecordset::DoFieldExchange. Обєкт типу СdaoFieldExchange визначає поле, що змінюється операцією обміну полями, та забезпечує інші параметри, що характерізують обмін полями.
Всі класи DAO використовують обєкти виключення типу CDaoException для повідомлення про помилки.
Побудова застосування DAO.
.Для побудови застосування DAO необхідно перш за все створити джерело даних. Нехай ним буде база даних, створена в Microsoft Access. База даних Employee складається з 2 таблиць, де міститься інформація про працівників (їх імя та вік), та відомості про робочі плани (назва плану та максимальний вік робітника, якому буде дозволено займатися цим планом).
Створення застосування-DAO здійснено за допомогою AppWizard. Проект однодокументний, в якості джерела даних (Data Source) вибано DAO, а дійсним файлом бази даних базу даних Employee.
Структура застосування, яка створюється AppWizard схожа на відповідну для ODBC.
Класи застосування:
Новий клас CDAODBSet (DAODB назва створюваного проекту) породжений від CDaoRecordset і представляє набір рядків, які будуть вибиратися з обєднання всіх таблиць. AppWizard вставляє змінні, які відповідають стовпцям (полям) таблиць.
Обявлення класу CDAODBSet:
class CDAODBSet : public CDaoRecordset
{
public:
CDAODBSet(CDaoDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CDAODBSet)
// Field/Param Data
//{{AFX_FIELD(CDAODBSet, CDaoRecordset)
Cstring m_LastName;
Cstring m_FirstName;
long m_Age;
Cstring m_Name;
long m_MaxAge;
//}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDAODBSet)
public:
virtual Cstring GetDefaultDBName(); // REVIEW: Get a comment here
virtual Cstring GetDefaultSQL(); // default SQL for Recordset
virtual void DoFieldExchange(CDaoFieldExchange* pFX); // RFX support
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CdumpContext& dc) const;
#endif
};
Реалізація класу CDAODBSet показує, як ці змінні ініціалізуються в конструкторі класу. Звертання до цих змінних є також в реалізації функції DoFieldExchange, сгенерованої мастером AppWizard. Ця функція здійснює обмін даними між змінними-членами в класі і полями в базі даних.
Реалізація класу CDAODBSet:
IMPLEMENT_DYNAMIC(CDAODBSet, CDaoRecordset)
CDAODBSet::CDAODBSet(CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
//{{AFX_FIELD_INIT(CDAODBSet)
m_LastName = _T(“”);
m_FirstName = _T(“”);
m_Age = 0;
m_Name = _T(“”);
m_MaxAge = 0;
m_nFields = 5;
//}}AFX_FIELD_INIT
m_nDefaultType = dbOpenDynaset;
}
Cstring CDAODBSet::GetDefaultDBName()
{
return _T(“D:\\Visual Studio\\MyProjects\\DAODB\\Employee1.mdb”);
}
Cstring CDAODBSet::GetDefaultSQL()
{
return _T(“[Employees],[Plans]”);
}
void CDAODBSet::DoFieldExchange(CDaoFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CDAODBSet)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Text(pFX, _T(“[LastName]”), m_LastName);
DFX_Text(pFX, _T(“[FirstName]”), m_FirstName);
DFX_Long(pFX, _T(“[Age]”), m_Age);
DFX_Text(pFX, _T(“[Name]”), m_Name);
DFX_Long(pFX, _T(“[MaxAge]”), m_MaxAge);
//}}AFX_FIELD_MAP
}
Для виконання задачі DoFieldExchange використовує функції DFX_. Ці функції є DAO-аналогами функцій RFX_, що використовуються для обміну полями ODBC.
ФункціїDFX_.
Імя функції |
Тип поля |
Тип ODBC SQL |
FX_Binary |
CByteArray |
DAO_BYTES |
DFX_Bool |
BOOL |
DAO_BOOL |
DFX_Byte |
BYTE |
DAO_BYTES |
DFX_Currency |
COleCurrency |
DAO_CURENCY |
DFX_DateTime |
COleDateTime |
DAO_DATE |
DFX_Double |
double |
DAO_R8 |
DFX_Long |
long |
DAO_I4 |
DFX_LongBinary |
CLongBinary |
DAO_BYTES |
DFX_SHORT |
||
short |
||
DAO_I2 |
||
DFX_Single |
||
float |
||
DAO_R4 |
||
DFX_Text |
||
Cstring |
||
DAO_CHAR,DAO_WCHAR |
Клас документа CDAODBDoc містить нову змінну m_dAODBSet типу CDAODBSet. Ця змінна представляє набір записів, з якими повязаний документ. Клас перегляду CDAODBView містить вказівник типу CDAODBSet (m_pSet); в реалізації по замовченю він встановлений для вказівки на змінну m_dAODBSet обєкта-документу. Клас перегляду також містить нову функцію OnGetrecordset, яка в реалізації по замовченню повертає m_pSet.
Настройка застосування.
В діалогове вікно IDD_DAODB_FORM додано відповідні статичні елементи керування та елементи керування редагуванням. За допомогою діалогового вікна Add Member Variable майстера ClassWizard ідентифікуємо змінні діалогового вікна відповідними змінними наборами записів. Це робиться за допомогою відповідної змінної m_pSet.
Для зміни критерія вибору можна скористатися функцією CDAODBSet::GetDefaultSQL. Реалізація цієї функції по замовченню повертає імена імена таблиць, з яких вибираються записи. В SQL потрібний нам вибір можна було б реалізувати:
SELECT Employees.LastName, Employees.FirstName, Employess.Age, Plans.Name, Plans.MaxAge
FROM Employees, Plans
Where Employees.Age<Plans.MaxAge
ORDER BY Employees.LastName, Employees.FirstName, Plans.Name
Вибрати відомості про прізвища та імена працівників, а також назви планів, для тих працівників, вік яких не перевищує максимальний вік, допустимий для цього плану.
При цьому вивід повинен бути відсортований спочатку за прізвищами працівників, потім за їх іменами, і накінець, за назвами планів.
Для ствоення відповідного запиту можна використовувати змінні класу CDaoRecordset. Цей клас пропонує дві змінні, одна з яких (m_strFilter) відповідає умові SQL WHERE , а інша (m_strSort) умові SQL ORDER BY.
Оновлення CDAODBSet::GetDefaultSQL
Cstring CDAODBSet::GetDefaultSQL()
{
m_strFilter=_T(“[Employees].[Age]<[Plans].[MaxAge]”);
m_strSort=_T(“[Employees].[LastName],[Employees].[FirstName],[Plans].[Name]”);
return _T(“[Employees],[Plans]”);
}
Застосування має такий вигляд:
За допомогою Component Galery до проекта було ще додано екранну заставку (Splash Screen)
Та системна інформація для діалогового вікна About (System Info for About Dialog).
Візуальні інстументи бази даних.
Visual C++ інтегрує в Visual Studio ряд інструментів, повязаних з базами даних. Тепер можна створювати бази даних, заповнювати таблиці, створювати і тестувати запити та відлагоджувати збережені процедури на віддаленому або локальному сервері, не залишаючи середовище Visual Studio.
Багато з можливостей розробки баз даних доступні для більшості джерел даних, інші, такі як створення таблиці, характені для Microsoft SQL Server.
Дві можливості представляють особливий інтерес. Перша Query Designer, який дозволяє створювати і тестувати запити SQL з Visual Studio: друга відладчик SQL, який дозволяє відлагоджувати збережені процедури, що виконуються на Microsoft SQL Server.
Для демонстації вищезазначених можливостей була створена база даних за допомогою Microsoft Access. Ця база містить дві таблиці: таблиця Books відображає книги з їх назвами, авторами та ISBN індексами; таблиця Authors містить відомості про авторів. Обидві таблиці зєднуються відношенням “багато-до-багатьох”: Books.Authors -> Authors.Name.
Для доступу до бази даних з Visual Studio необхідно створити проект бази даних (Database project). Доступ до джерела даних здійснюється через вказівку імені файлу джерела даних. Це файл Books.DSN.
У вкладці FileView у вікні Workspace є лише один файл файлове джерело даних (файл DSN):
У вкладці DataView можна побачити таблиці і поля, а також запити, якщо вони були створені:
Таким чином, тепер можна перевіряти і змінювати зміст таблиць, створювати SQL запити. Не можна створювати нові таблиці.
Для додавання або зміни даних достатньо двічі натиснути на відповідній таблиці у вкладці DataView. При цьому також зявляється вікно QUERY.
Створення запитів.
Побудуємо запит: вибрати всі книги, написані американськими авторами.
New Query можна створити натиснувши на імені бази даних у вкладці FileView:
Вибір таблиці здійснюється перетаскуванням відповідного імені таблиці з вікна DataView в вікно перегляду діаграм вікна Query. Встановлення зєднання між полями аналогічне (просте перетаскування):
Критерій вибору відображається в панелі сітки:
Панель SQL відображає відповідний SQL-запит:
Панель результатів відображає результати запитів:
Можна створювати не тільки запити-SELECT, а й INSERT, UPDATE, DELETE.
Запит UPDATE не має завершеного набору; при виконанні цього запиту Visual Studio в діалоговому вікні відображає тільки кількість записів, що були модифіковані:
Висновки.
В даній роботі, за допомогою створення власних прикладів, були розглянуті основні можливості програмування баз даних в Visual C++, зокрема використовуючи ODBC та DAO, а також можливості візуального конструювання баз даних.
Резюме:
ODBC могутній, незалежний від постачальника механізм доступу до інформації з різних джерел даних.
DAO - представляє засновану на OLE технологію, що використовується в Visual Basic for Application та Microsoft Access для доступу до баз даних за допомогою Jet-машини баз даних Microsoft.
Visual C++ пропонує візуальні інструменти для роботи з базами даних.
Список створених проектів:
В ході написання даної курсової роботи були створені такі програмні продукти:
Список використаної літератури.