Лекция №15: Открытый интерфейс доступа к базам данных – ODBC
Интерфейс ODBC (Open Database Connectivity) был разработан фирмой Microsoft как открытый интерфейс доступа к базам данных. Он предоставляет унифицированные средства взаимодействия прикладной программы, называемой клиентом (или приложением-клиентом), с сервером - базой данных.
В основу интерфейса ODBC были положены спецификация CLI-интерфейса (Call-Level Interface), разработанная X/Open, и ISO/IEC для API баз данных, а также язык SQL (Structured Query Language) как стандарт языка доступа к базам данных.
Интерфейс ODBC проектировался для поддержки максимальной интероперабельности приложений, которая обеспечивает унифицированный доступ любого приложения, использующего ODBC, к различным источникам данных. Так, если приложение, соответствующее стандарту ODBC и SQL, первоначально разрабатывалось для работы с базой данных Microsoft Access, а затем таблицы этой базы были перенесены в базу данных Microsoft SQL Server или базу данных Oracle, то приложение сможет и дальше обрабатывать эти данные без внесения дополнительных изменений.
Для взаимодействия с базой данных приложение-клиент вызывает функции интерфейса ODBC, которые реализованы в специальных модулях, называемых ODBC-драйверами. Как правило, ODBC-драйверы - это DLL-библиотеки, при этом одна DLL-библиотека может поддерживать несколько ODBC-драйверов. При установке на компьютер любого SQL-сервера (базы данных, поддерживающей один из стандартов языка SQL, например, SQL-92) автоматически выполняется регистрация в реестре Windows и соответствующего ODBC-драйвера.
Архитектура ODBC представлена четырьмя компонентами (рис. 1.1):
Рис. 1.1. Архитектура ODBC
Основное назначение менеджера драйверов - загрузка драйвера, соответствующего подключаемому источнику данных, и инкапсуляция взаимодействия с различными типами источников данных посредством применения различных ODBC-драйверов.
ODBC-драйверы, принимая вызовы функций, взаимодействуют с приложением-клиентом, выполняя следующие задачи:
Приложение-клиент одновременно может устанавливать соединения с несколькими различными источниками данных, используя разные ODBC-драйверы, а также несколько соединений с одним и тем же источником данных, используя один и тот же ODBC-драйвер.
Все функции ODBC API условно можно разделить на четыре группы:
Объявления всех функций и используемых ими типов данных содержатся в заголовочных файлах. Группа основных функций ODBC API разбита на три уровня:
Каждый ODBC-драйвер специфицируется как драйвер, поддерживающий определенный уровень функций ODBC API.
Прототипы функций ядра ODBC API находятся в файле Sql.h (C/C++, Visual Studio), а прототипы функций 1 и 2 уровней - в файле Sqlext.h.
Применение #define ODBCVER позволяет указать используемую версию (например, #define ODBCVER 0x0351).
Прототипы функций установки и инсталляции находятся в файле odbcinst.h.
Как уже отмечалось выше, открытый интерфейс доступа к базам данных фирмы Microsoft основан на следующих стандартах:
В настоящее время фирма Microsoft поддерживает версию 3.x ODBC API. Приложения, написанные на основе спецификации X/Open и ISO CLI, будут правильно работать с ODBC-драйверами версии 3.x или драйверами "согласованного стандарта" в том случае, если они компилируются с заголовочными файлами ODBC версии 3.x и линкуются с ODBC 3.x библиотеками, а доступ к ODBC-драйверу получают через менеджер драйверов ODBC 3.x. Аналогично, что и сами драйверы 3.x, написанные на основе спецификации X/Open и ISO CLI, будут правильно работать с приложениями при соблюдении этих же условий.
Драйвер ODBC 3.x всегда поддерживает все возможности, используемые приложением "согласованного стандарта", а приложение ODBC 3, которое использует только возможности, предоставляемые ISO CLI, и обязательные средства, описываемые X/Open CLI, всегда будет работать с драйвером "согласованного стандарта".
В дополнение к интерфейсу, специфицированному в стандартах ISO/IEC и X/Open CLI, ODBC реализует следующие возможности:
Для согласованности со стандартом ISO CLI и X/Open CLI в заголовочных файлах содержатся псевдонимы значений, используемых в ODBC API. Так, в псевдонимах "MAX" расширено до "MAXIMUM", "LEN" до "LENGTH", "MULT" до "MULTIPLE", "OJ" до "OUTER_JOIN", а "TXN" до "TRANSACTION". Например:
Индентификатор ODBC |
Псевдоним в заголовочном файле |
SQL_MAX_CATALOG_NAME_LEN |
SQL_MAXIMUM_CATALOG_NAME_LENGTH |
SQL_MAX_COLUMN_NAME_LEN |
SQL_MAXIMUM_COLUMN_NAME_LENGTH |
SQL_MAX_COLUMNS_IN_GROUP_BY |
SQL_MAXIMUM_COLUMNS_IN_GROUP_BY |
SQL_MAX_COLUMNS_IN_ORDER_BY |
SQL_MAXIMUM_COLUMNS_IN_ORDER_BY |
SQL_MAX_COLUMNS_IN_SELECT |
SQL_MAXIMUM_COLUMNS_IN_SELECT |
SQL_MAX_COLUMNS_IN_TABLE |
SQL_MAXIMUM_COLUMNS_IN_TABLE |
SQL_MAX_CONCURRENT_ACTIVITIES |
SQL_MAXIMUM_CONCURRENT_ACTIVITIES |
SQL_MAX_CURSOR_NAME_LEN |
SQL_MAXIMUM_CURSOR_NAME_LENGTH |
SQL_MAX_DRIVER_CONNECTIONS |
SQL_MAXIMUM_DRIVER_CONNECTIONS |
SQL_MAX_IDENTIFIER_LEN |
SQL_MAXIMUM_IDENTIFIER_LENGTH |
SQL_MAX_SCHEMA_NAME_LEN |
SQL_MAXIMUM_SCHEMA_NAME_LENGTH |
SQL_MAX_STATEMENT_LEN |
SQL_MAXIMUM_STATEMENT_LENGTH |
SQL_MAX_TABLE_NAME_LEN |
SQL_MAXIMUM_TABLE_NAME_LENGTH |
SQL_MAX_TABLES_IN_SELECT |
SQL_MAXIMUM_TABLES_IN_SELECT |
SQL_MAX_USER_NAME_LEN |
SQL_MAXIMUM_USER_NAME_LENGTH |
SQL_MULT_RESULT_SETS |
SQL_MULTIPLE_RESULT_SETS |
SQL_OJ_CAPABILITIES |
SQL_OUTER_JOIN_CAPABILITIES |
SQL_TXN_CAPABLE |
SQL_TRANSACTION_CAPABLE |
SQL_TXN_ISOLATION_OPTION |
SQL_TRANSACTION_ISOLATION_OPTION |
Источник данных DSN, используемый функциями ODBC API, первоначально должен быть создан. Это можно выполнить как программно - вызвав функцию ODBC API, так и интерактивно - используя утилиту ODBC (в зависимости от версии Windows, расположенную на панели управления или администрирования).
При использовании утилиты ODBC (рис. 1.2) на вкладке Пользовательский DSN отображается список всех зарегистрированных источников данных.
Рис. 1.2. Диалог утилиты ODBC
При добавлении нового источника данных отображается диалог со всеми зарегистрированными в реестре Windows ODBC-драйверами (рис. 1.3).
Рис. 1.3. Список зарегистрированных драйверов
В зависимости от выбранного ODBC-драйвера последовательно отображаются один или несколько диалогов для ввода параметров создаваемого DSN. Так, для создания источника данных, позволяющего работать с базой данных Microsoft SQL Server, следует определить имя создаваемого DSN, имя зарегистрированного SQL-сервера (рис. 1.4) и имя базы данных (на этом сервере), а также ряд дополнительных параметров.
Рис. 1.4. Создание DSN для базы данных Microsoft SQL Server
DLL-библиотека ODBCCP32.DLL предоставляет функции ODBC API ConfigDSN и SQLConfigDataSource, позволяющие выполнять регистрацию новых источников данных или удалять информацию об источниках данных из реестра Windows (и из файла ODBC.ini).
Функция ConfigDSN позволяет добавлять, изменять или удалять источники данных и имеет следующее формальное описание:
BOOL ConfigDSN(
HWND hwndParent,
WORD fRequest,
LPCSTR lpszDriver,
LPCSTR lpszAttributes);
Для использования в среде Visual Studio функций ConfigDSN и SQLConfigDataSource следует подключить заголовочный файл odbcinst.h.
Параметр hwndParent определяет дескриптор окна или NULL. Если дескриптор не указан, то при выполнении данной функции окно с предложением уточнить параметры не отображается. Параметр fRequest указывает тип запроса, который задается одной из следующих констант:
Параметр lpszDriver содержит описание драйвера, а параметр lpszAttributes - список атрибутов в форме "ключевое слово=значение" (например: DSN=MyDB\0UID=U1\0PWD=P1\0DATABASE=DB1\0\0). Список атрибутов завершается двумя null-байтами.
При успешном завершении функция возвращает значение TRUE, в противном случае вызовом функции SQLInstallerError можно получить один из следующих кодов ошибки:
Для записи информации об источнике данных в секцию [ODBC Data Sources] секции ODBC.INI реестра Windows функция ConfigDSN вызывает функцию SQLWriteDSNToIni, а для удаления - функцию SQLRemoveDSNFromIni.
Функция SQLConfigDataSource имеет следующее формальное описание:
BOOL SQLConfigDataSource(
HWND hwndParent,
WORD fRequest,
LPCSTR lpszDriver,
LPCSTR lpszAttributes);
Параметры функции SQLConfigDataSource аналогичны параметрам функции ConfigDSN, при этом параметр fRequest может принимать следующие значения:
Функция ConfigDSN относится к группе функций установки DLL (setup DLL), а функция SQLConfigDataSource - к группе функций инсталляции DLL (Installer DLL).
При выполнении функция SQLConfigDataSource использует значение параметра lpszDriver для получения из системной информации полного пути к Setup DLL конкретного драйвера, загружает эту DLL и вызывает функцию ConfigDSN, передавая ей свой список параметров (значение параметра fRequest преобразуется к значению, принимаемому функцией ConfigDSN). Перед вызовом ConfigDSN, в зависимости от типа обрабатываемого DSN, устанавливается режим USERDSN_ONLY (пользовательский DSN) или SYSTEMDSN_ONLY (системный DSN), а перед завершением выполнения функция SQLConfigDataSource возвращает режим BOTHDSN.
Все функции ODBC API возвращают значения, называемые кодами возврата. Код возврата определяет, была ли функция выполнена успешно, или характеризует тип произошедшей ошибки.
В заголовочном файле sql.h определены следующие коды возврата:
#define SQL_SUCCESS 0 |
Функция выполнена успешно |
#define SQL_SUCCESS_WITH_INFO 1 |
Функция выполнена успешно, но с уведомительным сообщением |
#if (ODBCVER >= 0x0300) #define SQL_NO_DATA 100 #endif |
Больше нет строк для извлечения их из результирующего набора. В предыдущей версии ODBC API этот код возврата обозначался как SQL_NO_DATA_FOUND. В версии 3.x код возврата SQL_NO_DATA_FOUND содержатся в заголовочном файле sqlext.h |
#define SQL_ERROR (-1) |
При выполнении функции произошла ошибка |
#define SQL_INVALID_HANDLE (-2) |
Указан неверный дескриптор |
#define SQL_STILL_EXECUTING 2 |
Функция, выполняемая асинхронно, пока не завершена |
#define SQL_NEED_DATA 99 |
Для успешного выполнения данной функции следует предварительно определить необходимые данные |
Первые два кода возврата определяют, что функция была выполнена, а остальные информируют о типе произошедшей ошибки.
Для определения типа кода возврата в заголовочном файле sqltypes.h введено следующее объявление:
typedef signed short RETCODE;
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.