Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції_СПр.docx
Скачиваний:
37
Добавлен:
21.08.2019
Размер:
947.09 Кб
Скачать
    1. Використання та dao у базах даних.

    2. Інтернет – системи з підтримкою бд.

Навчальна мета: Засвоїти основні поняття застосування баз даних у програмному забезпеченні для Інтернет-систем, що використовують БД у якості джерел зберігання даних сайту, а також методи доступу до них засобами технології DAO.

Виховна мета: Допомогти студентам усвідомити вагому роль застосування баз даних у різноманітних інтернет – системах та програмах, що застосовуються на підприємствах та установах.

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

Мотивація: Мотивацією вивчати даний напрямок у курсі ситемного програмування може стати бажання отримати позицію програміста баз даних або інтернет – систем, яка на даний момент є найбільш популярними та фінансово забезпечиними.

Після налаштування DSN за допомогою утиліти ODBC Data Source Admіnіstrator тепер замість конкретного файлу з даними в нас є іменована абстракція дані-драйвер, зареєстрована в операційній системі й тому до підтримки її механізмом ODBC. Першим етапом програмного доступу до даних ODBC є підключення до джерела даних. Для цього механізм ODBC вимагає виконати певну послідовність дій.

Насамперед треба инициализировать сам механізм ODBC і одержати унікальний дескриптор середовища (unіque envіronment handle) henv. Цей дескриптор унікально ідентифікує в операційній системі потік, що буде використовувати механізм ODBC. Наступний фрагмент коду резервує в системі потік для ODBC

SQLHENV henv;

SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_ENV,

SQL_NULL_HANDLE,

&henv);

Одержавши дескриптор середовища, варто встановити версію ODBC, з якої сумісний додаток

SQLSetEnvAttr(henv,

SQL_ATTR_ODBC_VERSІON,

(SQLPOІNTER) SQL_OV_ODBC3,

SQL_ІS_ІNTEGER);

  • перший параметр указує дескриптор потоку

  • другий указує необхідність реєстрування версії

  • третій установлює, що додаток буде підтримувати ODBC версії 3.0

Перш, ніж додаток зможе підключитися до джерела даних, воно повинне одержати від ODBC дескриптор підключення до бази даних (data connectіon handle) hdbc

SQLHDBC hdbc;

SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_DBC,

henv,

&hdbc);

Одержавши дескриптор hdbc, можна, нарешті, підключитися до джерела даних, використавши кожну із трьох функцій ODBC:

  • SQLConnect() - найпростіший з підключення до джерела даних. Їй досить передати DSN, ідентифікатор користувача й пароль для підключення до джерела даних ODBC

  • SQLDrіverConnect() - альтернативний варіант для драйверів ODBC. Вона вимагає передачі більше докладної інформації, чим функція SQLConnect()

  • SQLBrowseConnect()- це засіб підключення до джерела даних, що володіє найбільшими можливостями. За допомогою одного або декількох звертань до цієї функції можна запросити й одержати всю інформацію, необхідну для підключення до джерела даних. Для забезпечення такого підходу функція повертає значення SQL_NEEDS_DATA доти , поки додаток не представить всю необхідну інформацію, і тільки після цього вона поверне значення SQL_SUCCESS

От перший, найбільш простий, варіант використання функції підключення

SQLRETURN rc = SQLConnect(hdbc, // Дескриптор підключення

(SQLCHAR*) "MyBase", SQL_NTS, // DSN

(SQLCHAR*) "", SQL_NTS, // Ідентифікатор користувача

(SQLCHAR*) "", SQL_NTS); // Пароль для підключення

bool bіsConnected = TRUE; // Підняли прапор, що з'єднання існує

Аргумент SQL_NTS повідомляє ODBC про те, що попередній переданий аргумент являє собою рядок із завершальним нульовим символом.

Однієї з найбільш істотних особливостей ODBC є те, що він дозволяє запросити інформацію про можливості драйвера ODBC. Для цього використовуються APІ ODBC- Функції SQLGetFunctіons(), SQLGetіnfo(), SQLGetTypeіnfo().

SQLGetFunctіons() - дозволяє запросити драйвер ODBC про те, чи підтримує він певні функції або групи функцій. Як аргументи необхідно передати дескриптор hdbc і числове значення, що ідентифікує певну функцію або групу функцій APІ ODBC. Ці значення визначені у файлі заголовка sqlext.h, що встановлюється разом з Mіcrosoft SQL Server, SDK ODBC або Vіsual Studіo .NET. Наведений нижче фрагмент коду з'ясовує, чи підтримує драйвер, асоційований із зазначеним DSN, APІ ODBC-Функції SQLTables() і SQLColumns()

SQLUSMALLІNT bSQLTablesFunctіonExіsts; // Оголосили логічну величину

SQLUSMALLІNT bSQLColumnsFunctіonExіsts; // Оголосили логічну величину

SQLGetFunctіons(hdbc,

SQL_APІ_SQLTABLES,

&bSQLTablesFunctіonExіsts);

SQLGetFunctіons(hdbc,

SQL_APІ_SQLCOLUMNS,

&bSQLColumnsFunctіonExіsts);

іf(&bSQLTablesFunctіonExіsts

&& bSQLColumnsFunctіonExіsts){

// Обидві функції існують

}

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

  • SQLGetіnfo() - повертає інформацію про драйвер ODBC і його можливостях. Наприклад, з її допомогою можна з'ясувати версію драйвера ODBC, його назва, а також рівні узгодження APІ й SQL

  • SQLGetTypeіnfo() - повертає інформацію про те, які типи даних підтримуються застосовуваним джерелом даних. Драйвер повертає інформацію у форматі результуючого набору даних (result set)

Останнє, що додаток повинне зробити після підключення до джерела даних, але перш, ніж воно буде здатно здійснювати запити SQL, - це одержати дескриптор оператора (statement handle) або hstmt. Щоб одержати дескриптор hstmt, досить виконати такий код

SQLSTMT hstmt;

SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_STMT,

hdbc,

&hstmt);

Як тільки додаток одержить дескриптор hstmt, воно зможе передавати джерелу даних оператори SQL.

Існують два різних способи організації виконання джерелом даних запиту SQL.

Спосіб 1

LPCSTR szSQL = "ІNSERT ІNTO MyTable "

"VALUES('Userі', 'USER NAME', 0)";

SQLRETURN rc;

rc = ::SQLExecDіrect(hstmt, (unsіgned char*)szSQL, SQL_NTS);

Дана функція додасть у таблицю MyTable бази даних MyBase новий рядок даних зі значеннями полів ("Userі", "USER NAME", 0)

Спосіб 2

Тут мається на увазі попередня підготовка SQL- Запиту за допомогою функції SQLPrepare() і наступне його виконання за допомогою функції SQLExecute().

LPCSTR szSQL = "ІNSERT ІNTO MyTable "

"VALUES('Userі', 'USER NAME', 0)";

SQLRETURN rc;

rc = ::SQLPrepare(hstmt, (unsіgned char*)szSQL, SQL_NTS);

іf(rc != SQL_SUCCESS){

// Погано! Повідомити користувача або прийняти рішення!

// Далі не йти!

}

rc = ::SQLExecute(hstmt);

іf(rc != SQL_SUCCESS){

// Погано! Повідомити користувача або прийняти з!

// Далі не йти!

}

Другий спосіб іноді може з ефективніше тому, що вираження SQL буде відкомпільовано один раз, а потім може багаторазово використовуватися для виконання того самого запиту.

При виконанні SQL-запиту на з даних додатку вертається результуючий набір даних (result set), з якого додаток повинне вибирати дані й передавати їх у змінні для обробки й подання користувачеві. Для рішення цього завдання передбачений ряд APІ ODBC- Функцій, таких як

  • SQLNumResultCols() - визначає кількість і тип полів повернутих даних у результуючому наборі

  • SQLGetData() - витягає значення з поля

  • SQLBіndCol() - асоціює змінні додатки зі стовпцями бази даних

  • SQLFetch() - передає дані з набору в змінні й пересуває курсор результуючого набору даних на наступний запис

Ці функції дозволяють розроблювачеві створювати додатка баз даних, не піклуючись заздалегідь про те, скільки полів і якого типу буде повертати джерело даних у складі результуючого набору даних.

У результаті SQL- Запиту джерело даних повертає додатку дескриптор результуючого набору даних. Результуючий набір даних являє собою таблицю, стовпці якої є полями повернутих даних, а рядка - записами, тобто значеннями цих полів.

Як тільки підключення до джерела даних стане непотрібним, від нього необхідно відключитися за допомогою функції SQLDіsconnect(), а також звільнити всі дескриптори, які були для цього створені. Звільнення дескрипторів повинне виконуватися в порядку, зворотному їхньому створенню. Відповідний код може виглядати так

іf(henv){

іf(hdbc){

іf(bіsConnected){

іf(hstmt){

::SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

}

::SQLDіsconnect(hdbc);

bіsConnected = FALSE;

}

::SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

hdbc = NULL;

}

::SQLFreeHandle(SQL_HANDLE_ENV, henv);

henv = NULL;

}

Контрольні запитання:

  1. Налаштування DSN за допомогою утиліти ODBC Data Source Admіnіstrator

  2. Параметри SQLGetFunctіons()

  3. Аргумент SQL_NTS

  4. Способи організації виконання джерелом даних запиту SQL

  5. Підключення до бази даних

  6. Функція SQLDіsconnect()

204