Access і ODBC (частина 2), MS Office, Програмні керівництва, статті

Рівні функціональних можливостей ODBC API

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

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

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

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


Рівні відповідності SQL

Рівень відповідності SQL – це показник того, які можливості мови SQL і типи даних підтримує драйвер. Граматика ODBC SQL може бути базовою (вона відповідає стандартним вимогам), мінімальної (Нижчий уроверь в порівнянні з базовим) і розширеної (забезпечує деякі загальноприйняті розширення SQL).

Як і у випадку рівнів ODBC API, існують функції, що дозволяють визначити, які оператори і типи даних підтримує драйвер.


Більш складна задача

У попередній частині я описав лише основи використання інтерфейсу доступу до даних ODBC. Створення повнофункціональних додатків, заснованих безпосередньо на цьому API, в порівнянні з розробкою на MS Access, являє собою виключно важку задачу.

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

Насамперед, відмовимося від використання класів для «обгортання» функцій, що відповідають за виділення і повернення ресурсів. Це не додасть нашій програмі надійності, але зате значно скоротить її обсяг і поліпшить читаність коду. А функцій таких буде багато – повний комплект для всіх трьох рівнів структури API (оточення-з’єднання-оператор).

Далі, доповнимо модуль ODBC_API новими оголошеннями констант і функцій:

“Константи ODBC “Константи для SQLDriverConnect
Global Const SQL_DRIVER_NOPROMPT = 0
Global Const SQL_DRIVER_COMPLETE = 1
Global Const SQL_DRIVER_PROMPT = 2
Global Const SQL_DRIVER_COMPLETE_REQUIRED = 3
“Константи для FreeStmt
Global Const SQL_CLOSE = 0
Global Const SQL_DROP = 1
Global Const SQL_UNBIND = 2
Global Const SQL_RESET_PARAMS = 3
“Типи даних
Global Const SQL_C_CHAR = 1
“Декларації функцій ODBC
Declare Function SQLDriverConnect Lib “odbc32.dll” (ByVal HDBC As Long, _
ByVal hWnd As Long, _
ByVal ConStrIn As String, _
ByVal ConStrInMax As Integer, _
ByVal ConStrOut As String, _
ByVal ConStrOutMax As Integer, _
ByRef ConStrOutLen As Long, _
ByVal DriverCompleation As Integer) As Integer

Declare Function SQLDisconnect Lib “odbc32.dll” (ByVal HDBC As Long) As Integer
Declare Function SQLTables Lib “odbc32.dll” (ByVal HSTMT As Long, _
ByVal TableQualifier As String, _
ByVal TableQualifierLen As Integer, _
ByVal TableOwner As String, _
ByVal TableOwnerLen As Integer, _
ByVal TableName As String, _
ByVal TableNameLen As Integer, _
ByVal TableType As String, _
ByVal TableTypeLen As Integer) As Integer
Declare Function SQLFetch Lib “odbc32.dll” (ByVal HSTMT As Long) As Integer
Declare Function SQLGetData Lib “odbc32.dll” (ByVal HSTMT As Long, _
ByVal ColNumber As Long, _
ByVal DataType As Integer, _
ByVal DataValue As String, _
ByVal DataValueMax As Integer, _
ByRef DataValueLen As Long) As Integer

Для безпосередньої роботи створимо форму, в якій розмістимо список драйверів ODBC, поля для введення параметрів підключення до сервера (ім’я сервера, ім’я бази даних на ньому, логін і пароль користувача), а також список таблиць, який і будемо намагатися заповнити. Ще передбачимо пару кнопок для надання більшої наочності нашим дослідам (хоча, можна обійтися і обробкою подій списків).

Список драйверів заповнимо за аналогією з попереднім прикладом, тільки не будемо створювати і наповнювати таблицю. Замість цього, як тип джерела рядків виберемо список значень, а при завантаженні форми запишемо в змінну найменування всіх знайдених драйверів і привласнимо її властивості «Джерело рядків» списку.

Наступний важливий крок – встановити з’єднання з сервером. Інформація, яка повинна знадобитися – це, крім імені драйвера, імена сервера та БД, а також логін і пароль користувача, від імені якого буде здійснюватися підключення. Вся разом вона утворює так звану рядок підключення (Connection String), де перераховуються відповідні ключі і їх значення:

  strConStr = “DRIVER=” & Me.lbxDrivers & _
“;SERVER=” & Me.txtServer & _
“;DATABASE=” & Me.txtDataBase & _
“;UID=” & Me.txtLogin & _
“;PWD=” & Me.txtPassword & “;”

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

Public Function OpenConnection(HENV As Long, ConnectionString As String) As Long Dim intStatus As Integer “Для кодів повернення функцій ODBC. Dim lngHDBC As Long “Ідентифікатор з’єднання. Dim strConStrIn As String * MAX_DATA_BUFFER “Строковий буфер для передачі даних. Dim strConStrOut As String * MAX_DATA_BUFFER “Строковий буфер для отримання даних. Dim lngConStrOutLen As Long “Реальна довжина даних у буфері.
OpenConnection = 0
If Len (ConnectionString)

Основа нашої функції – функція ODBC API SQLDriverConnect. Першим параметром в ній йде вже знайомий нам ідентифікатор з’єднання, який треба попередньо отримати за допомогою функції SQLAllocConnect. Другий параметр – ідентифікатор вікна, яке буде батьківським для вікна діалогу введення параметрів з’єднання. Цей діалог забезпечується використовуваним драйвером ODBC, якщо ми того захочемо і вкажемо в останньому параметрі виклику функції відповідний режим. У нашому випадку діалог не потрібен і тому ми передаємо нульовий ідентифікатор вікна (у противному випадку можна передати, наприклад, hWndAccessApp) і SQL_DRIVER_NOPROMPT відповідно.

Третім і четвертим парамертамі йдуть рядок підключення і розмір текстового буфера, відведеного цьому рядку. Наступні три параметри функції призначені для повернення рядка підключення, сформованої самої функцією і, в нашому випадку, не використовуються.

Після того, як з’єднання встановлено, підготуємо ідентифікатор оператора за допомогою функції SQLAllocStmt і викличемо функцію SQLTables. Ця функція повертає набір відомостей про таблиці (TABLE), уявленнях (VIEW) та інших аналогічних об’єктах бази даних. Використовувати її потрібно також, як і всі функції, що працюють з результуючим безліччю, яким є, наприклад, результат виконання запиту на вибірку.

У двох словах, порядок дій такий: спочатку потрібно визначити кількість стовпців в результуючому безлічі (SQLNumResultCols), потім їх імена (SQLColumns) і типи даних (SQLDescribeCol). Для нашого прикладу все це не потрібно, так як точно відомо, що імена таблиць містяться в третьому стовпці, мають символьний тип даних, а назва стовпця не має значення. Тепер можна виділити буфери для даних кожного з стовпців за допомогою функції SQLBindCol. Ми цього робити не будемо, а скористаємося іншим способом вилучення даних (SQLGetData). Далі необхідно, встановлюючи покажчик на потрібну запис за допомогою функції SQLFetch або SQLExtendedFetch (остання підтримується не всіма драйверами), зчитувати дані стовпця в підготовлену для них змінну.

Як бачите, все це дуже складно і громіздко. Тому, багатьма фірмами розроблені різні програмні компоненти вищого рівня, істотно полегшують використання таких інтерфейсів, як ODBC. У MS Access для цього можна використовувати механізми приєднаних таблиць і запитів до сервера. У програмах на VBA зручно використовувати об’єкти доступу до даних DAO. Всі перераховані механізми мають ряд особливостей, які необхідно знати, враховувати і використовувати при роботі з даними через інтерфейс ODBC. Проте, це вже тема для окремої розмови.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*