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); |