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, воспринимающий все результаты фетчинга как строки. На данном этапе такое решение придется нам как нельзя кстати: |