yandex rtb 1
ГоловнаЗворотній зв'язок
yande share
Главная->Різні конспекти лекцій->Содержание->3.1.4 Схема доступу до джерела даних з використанням ODBC API

Організація баз даних і знань

3.1.4 Схема доступу до джерела даних з використанням ODBC API

Першим кроком при реалізації доступу до джерела даних за допомогою ODBC API без застосування пула з'єднань є створення дескриптора (ідентифікатора) оточення. Після виділення пам’яті під дескриптор оточення додаток повинен викликати функцію SQLSetEnvAttr для завдання значення атрибуту дескриптора оточення SQL_ATTR_ODBC_VERSION..

Після створення дескриптора оточення створюються дескриптори з'єднань. Кожен дескриптор з'єднання формується викликом функції SQLAllocHandle з типом дескриптора, рівним SQL_HANDLE_DBC. Драйвер виділяє пам'ять для зберігання інформації про з'єднання й повертає значення дескриптора з'єднання. Далі для реального з'єднання із джерелом даних викликається функція SQLConnect або функція SQLDriverConnect.

Для виконання SQL-операторів створюються дескриптори операторів. Вони дозволяють одержати доступ до інформації про виконаного оператора, ім'я курсору й атрибути. Дескриптор оператора формується викликом функції SQLAllocHandle зі значенням типу дескриптора, таким що дорівнює SQL_HANDLE_STMT.

При створенні дескриптора оператора драйвер автоматично створює ще чотири дескриптори й записує покажчики на них в атрибути дескриптора оператора SQL_ATTR_APP_ROW_DESC, SQL_ATTR_APP_PARAM_DESC, SQL_ATTR_IMP_ROW_DESC й SQL_ATTR_IMP_PARAM_DESC. Ці чотири дескриптори називаються неявно розміщеними дескрипторами.

Для явного розміщення дескриптора додатка варто викликати функцію SQLAllocHandle зі значенням типу дескриптора, таким що дорівнює SQL_HANDLE_DESC. При цьому формується дескриптор, названий явно розміщеним дескриптором.

Явно розміщені дескриптори також асоціюються з дескриптором з'єднання: вони залишаються доступними доти, поки додаток має з'єднання з БД. Оскільки явно розміщені дескриптори асоціюються з дескриптором з'єднання, то додаток може асоціювати такі дескриптори з декількома дескрипторами операторів для даного з'єднання. Неявно розміщений дескриптор додатка не може бути асоційований більш ніж з одним дескриптором оператора.

3.1.5 Послідовність дій додатка-клієнта для реалізації доступу до джерела даних

З'єднання із джерелом даних

Для безпосереднього підключення до БД ODBC API надає такі три функції: SQLConnect - з'єднання з джерелом даних по DSN, імені й паролю користувача; SQLDriverConnect - з'єднання з джерелом даних по зазначеному рядку з'єднання або за допомогою відображуваного діалогу для інтерактивного уведення параметрів з'єднання; SQLBrowseConnect - з'єднання з джерелом даних із попереднім послідовним запитом атрибутів з'єднання.

Функція SQLConnect має такий формальний опис:

SQLRETURN SQLConnect(

SQLHDBC ConnectionHandle, - вказує дескриптор

 з'єднання;

SQLCHAR *     ServerName, - ім'я джерела даних;

SQLSMALLINT NameLength1, - визначають довжину                         параметрів;

SQLCHAR *     UserName,  - описують ім'я користувача;

SQLSMALLINT NameLength2, - визначають довжину                         параметрів;

SQLCHAR *     Authentication, - описують пароль;

SQLSMALLINT NameLength3); - визначають довжину

                        параметрів.

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

SQLRETURN SQLDriverConnect(;

SQLHDBC    ConnectionHandle, - вказує дескриптор з'єднання;

SQLHWND   WindowHandle, - це покажчик батьківського

 вікна або NULL;

SQLCHAR * InConnectionString, - задає повністю або  частково рядок з'єднання або порожній рядок;

SQLSMALLINT StringLength1, - задає довжину в байтах;

SQLCHAR * OutConnectionString, - це покажчик на буфер, у якому після  успішного підключення до джерела даних повертається повний рядок з'єднання;

SQLSMALLINT       BufferLength, - задається розмір буфера;

SQLSMALLINT *StringLength2Ptr, - повертає покажчик на буфер, в якому розміщується загальне число символів повного рядка з'єднання;

SQLUSMALLINT DriverCompletion); - це прапорець, що вказує, чи буде менеджер драйверів і драйвер пропонувати діалоги для формування завершеного рядка з'єднання.

Останній параметр визначається такими значеннями:

SQL_DRIVER_PROMPT - підказка пропонується й ураховується навіть у тому випадку, якщо значення атрибута вже задано в рядку з'єднання. Спочатку відображається вікно з доступними джерелами даних (для атрибута DSN);

SQL_DRIVER_COMPLETE - підказка пропонується тільки в тому випадку, якщо необхідний для підключення атрибут не заданий у рядку з'єднання;

SQL_DRIVER_COMPLETE_REQUIRED - підказка пропонується тільки в тому випадку, якщо необхідний для підключення атрибут не заданий у рядку з'єднання й при цьому запитуються тільки необхідні значення атрибутів;

SQL_DRIVER_NOPROMPT - підказки не пропонуються.

Набір ключових слів, що вказують у рядку з'єднання, частково залежить від використаного драйвера. До загальноприйнятих ключових слів відносяться такі:

DSN - ім'я джерела даних (функція SQLDataSources повертає список доступних джерел даних);

FILEDSN - ім'я .dsn файлу, з якого буде прочитаний рядок з'єднання;

DRIVER - опис драйвера (список доступних драйверів повертається функцією SQLDrivers);

UID - ідентифікатор користувача;

PWD - для зазначеного ідентифікатора користувача або при відсутності пароля порожній рядок (PWD=;);

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

Ключові слова DSN й FILEDSN є в рядку з'єднання взаємовиключними: буде використане перше із зазначених. З іншими ключовими словами FILEDSN не є взаємовиключним: пріоритет має значення, зазначене безпосередньо в рядку стану. Очевидно, що значення ключового слова PWD не зберігається в .dsn файлі.

Функція SQLBrowseConnect реалізує ітераційний метод запиту значень атрибутів, необхідних для підключення до БД, повертаючи щоразу код відповіді SQL_NEED_DATA й ідентифікатор чергового запитуваного атрибута. Після визначення значень всіх необхідних атрибутів функція встановлює з'єднання з БД і при успішному завершенні операції повертає код відповіді, такий, що дорівнює SQL_SUCCESS або SQL_SUCCESS_WITH_INFO.

Функція SQLBrowseConnect має такий формальний опис:

SQLRETURN SQLBrowseConnect(;

SQLHDBC    ConnectionHandle;

SQLCHAR * InConnectionString, - описує рядок підключення або її  частину, зазначену при попередньому виклику функції;

SQLSMALLINT       StringLength1, - задає довжину буфера;

SQLCHAR * OutConnectionString, - визначає покажчик на буфер, що містить інформацію про відсутній атрибут рядка з'єднання;

SQLSMALLINT       BufferLength, - задає довжину буфера;

SQLSMALLINT *StringLength2Ptr); - указує загальне число байтів, що повинне бути повернуте в буфері.

Пул з'єднань

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

Використання з'єднань, поміщених у пул, може значно збільшити продуктивність додатків, які багаторазово встановлюють й розривають з'єднання. Прикладом таких додатків можуть служити серверні Інтернет-додатки середньої ланки, що постійно повторно встановлюють і розривають з'єднання.

З'єднання з пула можуть бути використані декількома компонентами в одному процесі. Це означає, що автономні компоненти в одному процесі можуть взаємодіяти один з одним без повідомлення один одного. З'єднання з пула може бути використане повторно декількома компонентами.

При роботі з пулом з'єднань використаний драйвер ODBC повинен бути повністю потокозахищеним, що дозволить одночасно виконувати різні виклики з різних потоків (наприклад, виконати приєднання в одному потоці, використати з'єднання в іншому потоці, а від'єднання виконати в третьому потоці).

Пул з'єднань управляється менеджером драйверів. З'єднання вибирається з пула при виклику додатком функції SQLConnect або функції SQLDriverConnect, а повертається в пул при виконанні функції SQLDisconnect. Розмір пула змінюється динамічно: якщо з'єднання не було використано протягом певного періоду часу, то воно віддаляється з пула.

Для використання додатком пула з'єднань необхідно:

для включення режиму пула з'єднань викликати функцію SQLSetEnvAttr з атрибутом середовища SQL_ATTR_CONNECTION_POOLING, такими, що дорівнює значенню SQL_CP_ONE_PER_DRIVER або значенню SQL_CP_ONE_PER_HENV. При виклику функції SQLSetEnvAttr дескриптор середовища вказується таким, що дорівнює значенню NULL, що визначає атрибут SQL_ATTR_CONNECTION_POOLING як атрибут рівня процесу. Значення SQL_CP_ONE_PER_DRIVER визначає, що окремий пул з'єднань підтримується для кожного драйвера. При необхідності мати один пул для різних драйверів указується значення SQL_CP_ONE_PER_HENV (окремий пул з'єднань підтримується для кожного середовища).

Створити дескриптор з'єднання, викликавши функцію SQLAllocHandle зі значенням параметра типу дескриптора, таким, що дорівнює SQL_HANDLE_DBC. Менеджер драйверів буде шукати існуюче розподілене середовище з відповідними атрибутами середовища (при знаходженні необхідного середовища воно повертається додатку й менеджер драйверів збільшує значення лічильника на 1). Якщо такого середовища немає, то менеджер драйверів створює його й установлює значення лічильника таким, що дорівнює 1.

Для одержання з'єднання з пула викликати функцію SQLConnect або SQLDriverConnect. Менеджер драйверів використовує значення параметрів і значення атрибутів з'єднання для визначення необхідного з'єднання з пула з'єднань. При цьому враховується значення атрибута SQL_ATTR_CP_MATCH (відповідність необхідного з'єднання з'єднанню з пула).

Для розриву з'єднання викликати функцію SQLDisconnect. При цьому з'єднання повертається назад у пул і робиться доступним для подальшого використання.

 

 

31