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

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

Alexander S. Salieff

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


SQLHDBC myhdbc;

ret = SQLAllocHandle(SQL_HANDLE_DBC, myenv, &myhdbc);

ret = SQLConnect(myhdbc, (SQLCHAR*)"MySQL-Test", SQL_NTS, (SQLCHAR*) "root",SQL_NTS,(SQLCHAR*) "", SQL_NTS);

Теперь можно выполнять SQL-запросы. Этот процесс состоит из нескольких шагов - нужно создать стейтмент запроса, связать переменные (в которые будут переданы результаты запроса) со стейтментом, номером поля, типом и переменной для сохранения кода ошибки, потом выполнить запрос и с помощью фетчинга вытащить результаты в связанные переменные:

SQLHSTMT myhstmt;

SQLINTEGER myid, myage;

SQLCHAR myname[40];

ret = SQLAllocHandle(SQL_HANDLE_STMT, myhdbc, &myhstmt);

SQLBindCol(myhstmt,1,SQL_C_ULONG,&myid, sizeof(myid),&ret);

SQLBindCol(myhstmt,2,SQL_C_CHAR, &myname, 40,&ret);

SQLBindCol(myhstmt,3,SQL_C_ULONG,&myage, sizeof(myage),&ret);

ret=SQLExecDirect(myhstmt,"SELECT id, name, age FROM mytable ORDER BY id",SQL_NTS);

while(SQLFetch(myhstmt)!=SQL_NO_DATA)

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

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

SQLFreeHandle(SQL_HANDLE_STMT,myhstmt);

SQLDisconnect(myhdbc);

SQLFreeHandle(SQL_HANDLE_DBC,myhdbc);

SQLFreeHandle(SQL_HANDLE_ENV, myenv);

Если хочется еще

Рассмотренная схема ODBC, состоящая из трех звеньев, является куда более гибким механизмом, чем может показаться на первый взгляд. Каждый из трех семейств указателей (SQLHENV, SQLHDBC и SQLHSTMT) имеет большой набор атрибутов и обслуживающих вызовов. Ниже я рассмотрю несколько примеров тонкой настройки ODBC, чтобы дать толчок к изучению этой области.

К примеру, мы решили сообщить ODBC-engin'у, что планируем придерживаться не больше не меньше, а именно третьей версии CLI. Пожалуйста:

ret=SQLSetEnvAttr(myenv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

Другая беда - тебя может совсем не устраивать стандартный таймаут на соединение с базой (к слову, он может достигать нескольких минут, тут уж никакие progressbar’ы не спасут от пользовательской ярости), и ты захочешь задать свой. Хорошо: перед соединением с базой скажем, что это должно занять не более пяти секунд:

ret=SQLSetConnectAttr(myhdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);

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