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

DataBase Connectivity в твоей программе

Alexander S. Salieff

Спецвыпуск: Хакер, номер #052, стр. 052-056-4


#define OTL_ODBC_UNIX //Если используется UNIX

#include <otlv4.h>

Теперь объявим объект OTL-соединения с РБД, инициализируем окружение и соединимся с DSN'ом MySQL-Test:

otl_connect db;

otl_connect::otl_initialize();

try {db.rlogon("UID=root;PWD=;DSN=MySQL-Test");}

catch(otl_exception& p)

{

cerr<<p.msg<<endl;

cerr<<p.stm_text<<endl;

cerr<<p.sqlstate<<endl;

cerr<<p.var_info;

//Соединение обломилось

...

}

//успешно соединились

...

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

int myid, myage;

char myname[40];

otl_stream i;

i.open(1024, "SELECT id, name, age FROM mytable ORDER BY id", db);

while (!i.eof())

{

i >> myid >> myname >> myage;

printf("ID=%d NAME=%s AGE=%d\n", myid, myname, myage);

}

Теперь, когда все данные получены, нужно разорвать соединение: db.logoff();

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

Альтернативные решения

Неужели кругом только ODBC и решения на его основе? Нет, это совсем не так. Многие производители помимо ODBC предлагают нативные методы DBC. Более того, когда программа заточена исключительно под работу с определенной БД, использовать нативные механизмы компактнее и удобнее, чем строить решение на базе ODBC. К примеру, MySQL API очень популярна для решения таких задач, и мы сейчас рассмотрим базовые основы реализации DBC подобным образом. Для начала понадобится библиотека MySQLClient и ее заголовочные файлы. В Linux-дистрибутивах она обычно идет в составе, для Windows ее придется скачать с официальных ресурсов.

Начинаем с подключения всех деклараций:

#include <mysql/mysql.h>

Переменная типа MYSQL содержит дескриптор соединения с БД, с ним оперирует и сама операция соединения. Мы соединимся с локальной базой как пользователь root с пустым паролем (начальные значения свежеустановленной и ненастроенной MySQL):

MYSQL mysql;

if (!(mysql_connect(&mysql,"localhost","root","")))

{

fprintf(stderr, "%s\n", mysql_error(&mysql));

exit(1);

}

У MySQL один СУРБД-сервер может обслуживать несколько баз, поэтому потребуется указать, какую базу будем использовать. Я под себя баз не создавал, а использовал ту, что отдается по умолчанию. Она зовется mysql (обрати внимание на пляску возврата функции, при коннекте было плохо, если false, а тут - если true). Обработку MySQL'ной ошибки я для краткости оберну в функцию exiterr :

if (mysql_select_db(&mysql,"mysql")) exiterr(&mysql);

Теперь создаем SQL-запрос. Его результат сохраняется во внутреннюю переменную типа MYSQL_RES, указатель на которую мы и получим для того, чтобы оперировать с ним в дальнейшем:

MYSQL_RES *res;

if (mysql_query(&mysql,"SELECT id, name, age FROM mytable ORDER BY id")) exiterr(1);

if (!(res = mysql_store_result(&mysql))) exiterr(1);

Соединение создано, запрос выполнен, теперь осталось получить его результаты. MySQL API предоставляет нам адаптивный тип MYSQL_ROW, воспринимающий все результаты фетчинга как строки. На данном этапе такое решение придется нам как нельзя кстати:

Назад на стр. 052-056-3  Содержание  Вперед на стр. 052-056-5