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

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

Alexander S. Salieff

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


Количество столбцов и строк, которое вернет запрос, не всегда известно. Часто узнать это просто необходимо, например, для оптимизации выделения динамической памяти или других не менее важных задач. На самом деле, это не проблема. После того, как SQLExecDirect отработал без ошибок, все можно будет узнать:

int cols, rows;

ret=SQLNumResultCols(myhstmt,&cols);

ret=SQLRowCount(myhstmt,&rows);

В предыдущей главе мы явно указывали символьное имя DSN'а. Часто случается и такое, что заранее неизвестно, с каким DSN'ом соединяться и вообще какие DSN'ы прописаны на данный момент. Это запросто может произойти при написании софта общего назначения, который должен работать с произвольным DSN'ом из всех установленных в системе. В такой ситуации очень хотелось бы получить список всего, что есть. И стандарт ODBC (по крайней мере, начиная с версии 3.0) вполне позволяет это сделать. Запросим все имеющиеся в наличии Data Source Name и комментарии к ним:

char l_dsn[101]={0},l_desc[101]={0};

short int l_len1, l_len2, l_next=SQL_FETCH_FIRST ;

while(SQLDataSources(myenv,l_next,l_dsn, 100,&l_len1, l_desc, 100, &l_len2)==SQL_SUCCESS)

{

printf("DSN Name=(%s) Description=(%s)\n",l_dsn,l_desc);

l_next=SQL_FETCH_NEXT;

}

Не хочется искать код ошибки в мануалах? И такое бывает. На самом деле, ничто не мешает развернуть его в более многословную и удобочитаемую форму:

char msg[201], statm[201];

int msglen;

SQLGetDiagRec(SQL_HANDLE_DBC, myhdbc,1, statm, &ret, msg,200,&msglen);

fprintf(stderr, "Error: Message-%s Statment-%s (%d)\n", msg, statm, ret);

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

OTL: облегчи себе жизнь

Было несложно обратить внимание на то, что ODBC CLI имеет несколько громоздкий интерфейс, перегруженный тонкими настройками и повторяющимися типовыми действиями. К тому же стандарт разработан под голый ANSI C, что подразумевает полное отсутствие ООП и некоторых плюсовых удобств. Все это заставляет программистов писать функциональные обертки к ODBC-вызовам, со временем создавать небольшую библиотечку, которой потом и пользуются. Я в свое время прошел через это, создавая свои обертки и пользуясь чужими, но один проект произвел на меня неизгладимое впечатление и стал моим любимым инструментом в DBC-проектах. Имя этого проекта - OTL (ODBC Template Library). Проект предоставляет набор простых и интуитивно понятных классов и методов, поточный интерфейс фетчинга, аналогичный механизмам iostream. Еще одной отличительной чертой проекта является то, что это не библиотека, а один-единственный заголовочный файл (весом приблизительно 0,5 Мб ;)). Обработка ошибок реализована через механизм исключений C++.

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

#define OTL_ODBC //Если используется Windows

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