Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #52, МАРТ 2005 г.

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 (она аналогична описанной выше).

Содержание  Вперед на стр. 052-056-2