DataBase Connectivity в твоей программе Alexander S. Salieff Спецвыпуск: Хакер, номер #052, стр. 052-056-1 (salieff@mail.ru) Программирование с использованием DBC-технологий Писать кроссплатформенные приложения, взаимодействующие с базами данных, переносимые между операционными системами и архитектурами без правки исходного кода, - это ли не мечта каждого программиста? Но эту мечту не так уж и сложно воплотить в жизнь, в чем все мы сейчас и убедимся. В предыдущей статье было уделено много внимания истории развития и теории DBC-технологий и интерфейсов. Но пока сфера использования DBC ограничивалась лишь чужими программами. Очень часто хочется реализовать что-то свое - то, что отсутствует в имеющихся продуктах. Настало время научиться писать свои программы, использующие различные DBC-технологии. С чего начать? Наиболее стабильной, устоявшейся и уважаемой (хотя и не самой компактной и простой в плане кода) технологией является ODBC. С нее мы и начнем наши программерские изыски. Прежде всего понадобятся ODBC-библиотеки под ту платформу, под которую ты собираешься писать, и заголовочные файлы, которые обычно имеются в составе среды разработки, ориентированной на ODBC. Для UNIX-сред все нужное возьмем из пакетов UNIX-ODBC base+devel. В Windows ODBC-DLL'ки входят в состав дистрибутива, а библиотечные обертки и заголовочные файлы присутствуют в составе среды разработки (по крайней мере, в BCC и MSVC). Еще неплохо бы поднять локальную РДБ для тренировки на кошках. Мне было проще использовать для этого MySQL, входящий в состав установленного у меня Red Hat 9.0. Он поднимается простой командой /etc/rc.d/init.d/mysqld start, по умолчанию обзаводится пользователем root и пустым паролем. О том, как настроить на использование MySQL менеджер UNIX-ODBC, поговорили в предыдущей статье. Создадим в поднятой базе таблицу для издевательств с помощью любого доступного SQL-браузера: CREATE TABLE mytable ( id INTEGER NOT NULL, name CHAR(40), age INTEGER ); И наполним ее некоторым количеством значений: INSERT INTO mytable(id, name, age) VALUES(1, 'Masha', 16); INSERT INTO mytable(id, name, age) VALUES(2, 'Vasya', 25); Теперь все готово к экспериментам, и можно приступать непосредственно к программированию. ODBC API - основа основ Сначала подключим заголовочные файлы, в которых описаны необходимые функции и типы. Для каждой реализации требуется особое подключение, но разобраться обычно несложно. Главное, что содержимое в виде имен типов и объявлений функций идентично для всех платформ и архитектур. Для Linux делаем так: #include <odbc/sql.h> #include <odbc/sqlext.h> #include <odbc/sqltypes.h> Для Windows почти так же: #include <windows.h> #include <sql.h> #include <sqlext.h> Первое, что нам потребуется, - соединиться с базой данных. В первую очередь выделяется общий ODBC-дескриптор окружения типа SQLHENV, все остальные операции будут плясать от него: SQLHENV myenv; int ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&myenv); if ((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO)) {fprintf(stderr, "Error AllocHandle\n"); exit(1); } Обращаем внимание на обработку возврата функции (переменная ret). Это типовая операция, и ее нужно производить практически при каждом ODBC-вызове. Теперь можно создавать handle для соединения и, собственно, соединяться. Handle аллоцируется той же функцией SQLAllocHandle, но с другими атрибутами. Потом через созданный handle инициируется само соединение с DSN'ом MySQL-Test (заранее настроенном в ODBC-менеджере), при этом используется логин root с пустым паролем. Макрос SQL_NTS означает, что строки передаются в формате NULL-Terminated-String, этот формат является для C/C++ стандартом. Для краткости я опускаю обработку переменной ret (она аналогична описанной выше). |