3 Разработка прикладных программы, используя MyODBC

Эта глава содержит информацию относительно разработки прикладных программ, которые используют MyODBC как интерфейс, чтобы обратиться к серверу MySQL.

3.1 Базисные шаги прикладной программы MyODBC

В общем виде, чтобы работать с сервером MySQL из любой программы через ODBC/MyODBC, надо сделать следующее:

Большинство прикладных программ использует некоторое изменение этих шагов.

3.2 Настройка MyODBC DSN

Источник данных идентифицирует путь для данных, который может включать сетевую библиотеку, сервер, базу данных и другие атрибуты. В нашем случае источник данных представляет собой путь к базе данных MySQL. Чтобы соединиться с источником данных, Driver Manager проверяет системный реестр Windows для получения специфической информации подключения.

ODBC Driver Manager и MyODBC Drivers использует вход системного реестра, созданный ODBC Data Source Administrator . Этот вход содержит информацию относительно каждого источника данных и связанного с ним драйвера. Прежде, чем Вы сможете соединяться с источником данных, информация о подключении должна быть добавлена к системному реестру.

Чтобы добавлять и конфигурировать источники данных, используйте ODBC Data Source Administrator. ODBC Administrator модифицирует информацию о подключениях к источникам данных. Поскольку Вы добавляете источники данных, ODBC Administrator модифицирует информацию системного реестра для них.

Чтобы открыть ODBC Administrator из Control Panel:

Чтобы добавить источник данных в Windows:

  1. Откройте ODBC Data Source Administrator.
  2. В диалоговом окне ODBC Data Source Administrator нажмите Add. Откроется диалоговое окно Create New Data Source.
  3. Выберите там MySQL ODBC 3.51 Driver и нажмите на Finish. Появится диалоговое окно MySQL ODBC 3.51 Driver - DSN Configuration.
  4. В окне Data Source Name впечатайте имя источника данных, к которому Вы хотите обращаться. Это может быть любое имеющее силу имя, которое понравилось.
  5. В окне Description введите описание необходимое для DSN.
  6. В окне Host or Server Name (or IP) напечатайте имя сервера MySQL, к которому Вы хотите обращаться. По умолчанию это local host.
  7. В окне Database Name укажите имя MySQL базы данных, которая будет применяться как заданная по умолчанию база данных.
  8. В окне User задайте имя пользователя базы данных (user ID).
  9. В окне Password надо задать пароль.
  10. В окне Port напечатайте номер порта, если это не значение по умолчанию 3306.
  11. В окне SQL Command Вы можете вводить факультативную команду SQL, которую серверу надлежит выполнить сразу после установления подключения.

Теперь нажмите OK, чтобы добавить этот источник данных. Обратите внимание: при щелчке на OK диалоговое окно Data Sources dialog, и ODBC Administrator модифицирует информацию системного реестра. Имя пользователя и строка подключения станут заданными по умолчанию значениями подключения для этого источника данных. Вы можете также проверить, достаточны ли Ваши параметры настройки, чтобы соединиться с сервером, используя кнопку Test Data Source. Эта возможность появилась только начиная с MyODBC 3.51.

Driver Options: Вы можете также видеть кнопку Options, которая отобразит диалог дополнительных параметров, которые управляют поведением драйвера.

Обратите внимание, что параметры Driver Trace Options будут заблокированы (нарисованы серым цветом) при использовании обычной версии DLL.

Чтобы изменить источник данных в Windows:

  1. Откройте окно ODBC Data Source Administrator . Выберите соответствующую вкладку DSN.
  2. Выберите источник данных MySQL, который Вы хотите изменить, а затем нажмите modify и щелкните по Configure. Откроется диалоговое окно MySQL ODBC 3.51 Driver - DSN Configuration.
  3. Измените соответствующие поля источника данных, а затем нажмите OK.

Когда Вы закончите изменять информацию в этом диалоговом окне, ODBC Administrator модифицирует информацию системного реестра.

Чтобы настроить источник данных в Unix:

В Unix Вы можете конфигурировать DSN-входы непосредственно в файле ODBC.INI. Имеется пример файла odbc.ini с myodbc как DSN-имя для MyODBC 2.50 и myodbc3 для MyODBC 3.51 Drivers: ; ; odbc.ini configuration for MyODBC and MyODBC 3.51 Drivers ; [ODBC Data Sources] myodbc = MySQL ODBC 2.50 Driver DSN myodbc3 = MySQL ODBC 3.51 Driver DSNа [myodbc] Driver = /usr/local/lib/libmyodbc.so Description = MySQL ODBC 2.50 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET = [myodbc3] Driver = /usr/local/lib/libmyodbc3.so Description = MySQL ODBC 3.51 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET = [Default] Driver = /usr/local/lib/libmyodbc3.so Description = MySQL ODBC 3.51 Driver DSN SERVER = localhost PORT = USER = root Password = Database = test OPTION = 3 SOCKET =

Обратите внимание: если Вы используете unixODBC, то Вы можете использовать следующие инструментальные средства чтобы настроить DSN:

3.3 Параметры подключения

Можно определять следующие параметры для MyODBC или для MyODBC 3.51 в секции [Data Source Name] файла ODBC.INI или через параметр InConnectionString в вызове SQLDriverConnect().

ПараметрЗначение по умолчанию Комментарий
userODBC (в Windows)Имя пользователя для связи с MySQL.
serverlocalhostИмя сервера MySQL.
databaseБаза данных по умолчанию
option0Целое число, которым Вы можете определять как должен работать MyODBC 3.51. Описано чуть ниже.
port3306Порт TCP/IP, чтобы использовать, если server не равен localhost.
stmtИнструкция, которая будет выполнена, когда установлено подключение к MySQL.
passwordПароль для комбинации server user.
socketСокет или именованный канал Windows для связи.

Параметр OPTION используется, чтобы сообщить MyODBC 3.51, что пользователь не на 100% совместим с ODBC. Следующие параметры перечислены в том же самом порядке, в каком они появляются в MyODBC 3.51:

БитОписание
1Пользователь не может обрабатывать ситуацию, когда MyODBC возвращает реальную ширину столбца.
2Пользователь не может обрабатывать ситуацию, когда MySQL возвращает истинное число обработанных строк. Если этот параметр установлен, MySQL вернет число найденных строк. Нужно иметь MySQL 3.21.14 или более новый, чтобы это работало.
4Создать протокол трассировки в файле c:\myodbc.log (/tmp/myodbc.log). Это аналогично указанию MYSQL_DEBUG=d:t:O,c::\myodbc.log в AUTOEXEC.BAT.
8Не устанавливать ограничений пакета для результатов и параметров.
16-Не запрашивать ничего, даже если драйвер хочет запросить.
32Включить или отключить поддержку динамического курсора. Это не работает в MyODBC 2.50.
64Игнорировать использование имени базы данных в формате database.table.column.
128Использование экспериментальных курсоров ODBC manager.
256Отключить использование расширенной (экспериментальной) выборки.
512Дополнить поля типа CHAR до полной длины столбца.
1024SQLDescribeCol() возвратит полностью квалифицированные имена столбцов.
2048Использовать сжатый протокол клиент-сервер.
4096Сервер должен игнорировать пробел между именем функции и '(' (нужно для Power Builder). Это делает все ключевые слова именами функций!
8192Соединиться через именованный канал с сервером mysqld под NT.
16384Менять столбцы типа LONGLONG на столбцы INT (некоторые прикладные программы не могут корректно обрабатывать LONGLONG).
32768Вернуть user как Table_qualifier и Table_owner из SQLTables.
65536Читать параметры из групп client и odbc в файле my.cnf
131072Добавить некоторые дополнительные проверки безопасности (вроде бы не очень и надо, но...).
262144Выключить использование транзакций
524288Включить регистрацию запросов в файле c:\myodbc.sql (/tmp/myodbc.sql). Доступно только в режиме отладки в специальной версии драйвера.

Если Вы хотите иметь много параметров, Вы должны сложить вышеупомянутые числа. Например, установка опции в 12 (4+8) дает Вам отладку без ограничений на размеры пакета.

По умолчанию MYODBC3.DLL компилируется для оптимальной эффективности. Если Вы хотите отладить MyODBC 3.51 (например, чтобы получить трассировку), используйте MYODBCD3.DLL вместо стандартного файла MYODBC3.DLL.

3.4 Связь с сервером MySQL

Прикладная программа может быть связана с любом числом источников данных и драйверов. Они могут быть вариантами того же самого драйвера и ряда источников данных или несколькими подключениями с тем же самым драйвером и источником данных. Прикладная программа должна сделать следующее, чтобы соединиться с сервером MySQL через MyODBC:

3.4.1 Распределение дескриптора среды

Прежде, чем прикладная программа сможет использовать любую функцию ODBC, надо инициализировать ODBC-связь с помощью интерфейса и сопоставить с ней дескриптор среды. Он обеспечивает доступ к глобальной информации типа имеющих силу дескрипторов подключения и активных дескрипторов подключения.

Чтобы распределить правильный дескриптор среды, прикладная программа:

  1. Объявляет переменную типа SQLHENV. Например, прикладная программа могла бы использовать объявление: SQLHENV henv;
  2. Вызывает SQLAllocHandle (в MyODBC 2.50 называется SQLAllocEnv) и передает адрес этой переменной и опции SQL_HANDLE_ENV как: SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv) или SQLAllocEnv(&henv)

Если прикладная программа связана через Driver Manager, то это обращение загружает Driver Manager. Он не вызывает SQLAllocHandle в драйвере потому, что пока не знает, который драйвер вызвать. Это откладывает вызов SQLAllocHandle в драйвере до получения вызовов из прикладной программы, чтобы соединиться с источником данных: тогда-то будет однозначно ясно, какой драйвер нужен.

Если прикладная программа связана непосредственно с драйвером, то это обращение загружает драйвер, и уже драйвер формирует информацию среды и возвращает распределенную структуру обратно прикладной программе.

3.4.2 Установка версии ODBC

Если Вы используете драйвер MyODBC 2.50, то Вы можете игнорировать этот раздел. Прежде, чем прикладная программа создаст соединение, необходимо установить атрибут SQL_ATTR_ODBC_VERSION среды, используя SQLSetEnvAttr: SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);

Этот атрибут заявляет, что прикладная программа следует спецификациям ODBC 2.x или ODBC 3.x при использовании следующих элементов:

MyODBC 3.51 контролирует версию спецификации ODBC, для которой прикладная программа написана и отвечает соответственно. Например, если прикладная программа следует версии ODBC 2.x и вызывает SQLExecute до вызова SQLPrepare, драйвер вернет: SQLSTATE S1010 (Function sequence error). Если прикладная программа поддерживает спецификацию ODBC 3.x, то это возвращает: SQLSTATE HY010 (Function sequence error).

3.4.3 Распределение дескриптора подключения

Дескриптор подключения обеспечивает доступ к информации относительно того, является ли подключение открытым или нет, имеют ли силу операторные и дескрипторные маркеры на подключении, и открыта ли сейчас транзакция.

Прежде, чем прикладная программа сможет соединиться с сервером MySQL или с драйвером, она должна распределить дескриптор подключения, следующим образом:

Если прикладная программа связана через Driver Manager, то Driver Manager распределяет память, чтобы сохранить информацию относительно подключения и возвращает дескриптор подключения прикладной программе. С другой стороны, если Вы непосредственно компонуете программу через библиотеку драйверов вместо Driver Manager, то эту работу делает уже драйвер.

3.4.4 Установка атрибутов соединения (подключения)

Атрибуты подключения представляют собой характеристики подключения. Например, они определяют, что транзакции происходят в уровне подключения, а уровень изоляции транзакции представляет собой атрибут подключения. Точно так же время ожидания входа в систему или число секунд, которые надо ждать при попытке соединиться перед тайм-аутом, тоже атрибуты подключения.

Атрибуты подключения установлены с помощью SQLSetConnectAttr, а их текущие параметры настройки могут быть получены с помощью SQLGetConnectAttr. Для прикладных программ драйвера MyODBC 2.50 Вы можете использовать SQLSetConnectOption и SQLGetConnectOption.

Атрибуты подключения могут быть установлены до или после подключения, в зависимости от типа атрибута. Время ожидания входа в систему SQL_ATTR_LOGIN_TIMEOUT применяется только при установлении связи и важно, только если установлено перед соединением.

Атрибуты, которые определяют, использовать ли библиотеку курсоров ODBC (SQL_ATTR_ODBC_CURSORS) и сетевой размер пакета (SQL_ATTR_PACKET_SIZE), должны быть установлены прежде, чем соединение создано потому что, библиотека курсоров ODBC находится между Driver Manager и драйвером, а следовательно должно быть загружена перед драйвером. Подробный перечень атрибутов подключения, поддерживаемых драйверами MyODBC, есть в разделе "4.5.1 SQLSetConnectAttr".

3.4.5 Установление подключения, использующего MyODBC

После распределения среды и дескрипторов подключения и установки факультативных атрибутов подключения, прикладная программа готова соединиться с сервером MySQL или драйвером MyODBC (через Driver Manager). Имеются две различных функции для этого:

3.4.5.1 Соединение через SQLConnect

SQLConnect самая простая функция подключения. Требует имя источника данных и принимает факультативные user ID и пароль. Прикладная программа передает следующую информацию драйверу через SQLConnect:

DSN: имя источника данных.
UID: имя пользователя для связи с сервером (опционально).
PWD: соответствующий пароль (опционально).

Обратите внимание, что, если Вы уже определили имя пользователя и пароль в параметрах DSN или непосредственно в файле ODBC.INI, Вы можете только определить имеющий силу DSN, а драйвер внутренне получает другую требуемую информацию из записей в DSN сам.

Когда из прикладной программы вызван SQLConnect, Driver Manager использует имя источника данных, чтобы прочитать имя драйвера DLL из соответствующего раздела файла ODBC.INI или из системного реестра. Это затем загружает драйвер DLL и передает ему параметры SQLConnect. Если драйвер нуждается в дополнительной информации, чтобы соединиться с источником данных, он читает эту информацию из того же самого раздела файла ODBC.INI.

Если прикладная программа определяет имя источника данных, которое не значится в файле ODBC.INI или в системном реестре, или если прикладная программа не определяет имя источника данных, Driver Manager ищет заданную по умолчанию спецификацию источника данных. Если он находит заданный по умолчанию источник данных, то загружает заданный по умолчанию драйвер и передает ему определенное прикладная программой имя источника данных. Если не имеется никакого заданного по умолчанию источника данных, Driver Manager возвращает соответствующую ошибку.

Пример: следующий пример распределяет необходимую среду, дескриптор подключения и соединяется с сервером MySQL, используя DSN myodbc3. SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN retcode; /* Allocate environment handle */ retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Set the ODBC version environment attribute to version 3 */ retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Allocate connection handle */ retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Connect to data source myodbc3 */ retcode = SQLConnect(hdbc, (SQLCHAR*) "myodbc3", SQL_NTS, (SQLCHAR*) "myuser", SQL_NTS, (SQLCHAR*) "mypassword", SQL_NTS); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Set auto commit to ON */ retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTO_COMMIT, SQL_AUTOCOMMIT_ON,0); printf("\n autocommit returned :%d", redcode); /* Allocate statement handle */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { /* Process data */ ; ; ; /* Free stattemt handle */ SQLFreeHandle(SQL_HANDLE_STMT, hstmt); } /* Disconnect from the server */ SQLDisconnect(hdbc); } /* Close the connection handle */ SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } } /* Close the environment handle */ SQLFreeHandle(SQL_HANDLE_ENV, henv);

3.4.5.2 Связь через SQLDriverConnect

SQLDriverConnect используется, чтобы соединиться с сервером, используя строку подключения. Можно использовать SQLDriverConnect вместо SQLConnect по следующим причинам:

Строка подключения может состоять из одного или большего количества параметров MyODBC подключения, отделяемых точкой с запятой (;). Если драйвер должен запрашивать пользователя относительно информации подключения, то он отображает диалог подключения.

3.4.5.3 Строка подключения для SQLDriverConnect

Используя myodbc3 как MySQL ODBC 3.51 DSN: ConnectionString = "DSN=myodbc3"

DSN Less Connection: ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;\ DATABASE=test; USER=monty; PASSWORD=monty;\ OPTION=4;"

3.4.6 Получение информации о драйвере и источнике данных

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