|
Программирование >> Sql: полное руководство
/* Получаем необходимые дескрипторы и подключаемся к базе данных */ SQLAllocHandle(SQL HANDLE ENV, SQL NULL HANDLE, Senv hdl); SQLAllocHandle(SQL HANDLE DBC, env hdl, Sconn hdl); SQLAllocHandle(SQL HANDLE STMT, conn hdl, Sstmtl hdl); SQLAllocHandle(SQL HANDLE STMT, conn hdl, Sstmt2 hdl); SQLConnect (conn hdl, svr name, SQL NTS, user name, SQL NTS, user pswd, SQL NTS); /* Спрашиваем у пользователя, из какой таблицы он хочет извлечь данные */ prmtf ( *** Программа формирования запросов ***\п ); printf( Введите имя таблицы для запроса: ); gets(querytbl); /* Начинаем формирование инструкции SELECT в буфере */ strcpy(stmtbuf, select ); /* Запрашиваем имена столбцов из системного каталога SQL Server */ strcpy(stmt2buf, select column name from columns where table name = ); strcat(stmt2buf, querytbl); SQLExecDirect(stmt2 hdl, stmt2buf, SQL NTS); /* Обрабатываем результаты запроса */ SQLBindCol(stmt2 hdl, 1, SQL C CHAR, querycol, 31, (int *)0); while (status = SQLFetch(stmt2 hdl) == SQL SUCCESS) { printf( Включить столбец %s (y/n)? , querycol); gets(inbuf); If (inbuf[0] = y ) ( /* Пользователь выбрал столбец; включаем его в список */ if (first col++ > 0) strcat(stmtbuf, , ); strcat(stmtbuf, querycol); Рис. 19.20, Использование CU дпя рения динамических запросов /* Заканчиваем инструкцию SQL предложением FROM */ strcat(stmtbuf, from ), strcat(stmtbuf, querytbl); /* Выполняем запрос и готовимся к получению SQLExecDirect (stmtl fidl, stmtbuf, SQL NTS) ; его результатов */ /* Запрашиваем информацию о каждом столбце, выделяем память и связываем столбцы с буферами */ SQLNumResultCols (stmtl fidl, Scolcount) ; for (1=0; 1 < colcount; i++) { item name[i] = nameptr = malloc(32); mdptr = sitem ind[i] ; SQLDescribeCol (stmtl lidl, i, nameptr, 32, Snamelen, Stype, Ssize, Sdigits, Snullable); switch(type) { case SQL CHAR: case SQL VARCHAR: /* Выделяем строковый бфер и связываем с ним столбец */ item data[i] = dataptr = malloc(size + 1) ; item type[i] = SQL C CHAR; SQLBindCol(stmtl hdl, i, SQL C CHAR, dataptr, size+1, indptr); break; case SQL TYPE DATE: s case SQL TYPE TIME: \ case SQL TYPE TIME WIT$ TIMEZONE: case SQL TYPE TIMESTAM>V case SQL TYPE TIMESTAMP WITH TIMEZONE: case SQL INTERVAL DAY: case SQL INTERVAL DAY TO HOUR: case SQL INTERVAL DAY TO MINUTE: case SQL INTERVAL DAY TO SECONC: case SQL INTERVAL HOUR: case SQL INTERVAL HOUR TO MINUTE: case SQL INTERVAL HOUptlTO SECOND: case SQL INTERVAL MINUTE: case SQL INTERVAL MINUTE TO SECOND: case SQL INTERVAL MONTH: case SQL INTERVAL SECOND: case SQL INTERVAL YEAR: case SQL INTERVAL YEAR TO MONTH /* Просим CLI преобразовать значение даты/времени в строку фиксированной длины */ item data[il = dataptr = malloc(31); item type[il = SQL C CHAR; SQLBindCol(stmtl hdl, i, SQL C CHAR, dataptr, 31, indptr); breaJc; case SQL INTEGER: case SQL SMALLINT: /* Преобразовать целое число в формат длинного целого, принятый в языке С */ item data[i] = dataptr = malloc(sizeof(integer)); item type[i] = SQL C SLONG; SQLBindCol(stmtl hdl, i, SQL C SLONG, dataptr, sizeof(integer), indptr); breaJc; Рис. 19.20. Испси7ьзованив CU, 1вшалнвиия динамических з<щросов caseSQL NUMERlC: case SQL DECIMAL: case SQL FLOAT: case SQL REAL: case SQL DOUBLE: /* В демонстрационных целях конвертируем числа, относящиеся к этим типам данных, в формат чисел с плавающей запятой, принятый в языке С */ item data[il = dataptr = malloc(sizeof (long)); item type[il = SQL C DOUBLE; SQLBindCol(stmtl hdl, i, SQL C DOUBLE, dataptr, sizeof (double) , mdptr) ; break; default: /* Остальные типы данных не обрабатываются */ printf( Не могу обработать тип данных %d\n , type); exit О ; /* Извлекаем строки из таблицы результатов запроса и отображаем их на экране */ wtiile (status = SQLFetcti(stmtl hdl) == SQL SUCCESS) ( /* Цикл вывода данных для каждого столбца текущей строки */ printf( \п ); for(i = 0; 1 < colcount; i++) { /* Выводим имя столбца */ prmtf ( Столбец %d (%s) : , i + l, item name [i] ) ; /* Проверяем, не содержит ли столбец значение NULL */ if (item ind[il == SQL NULL DATA) ( puts( содержит NULLXn ); continue; /* Обрабатываем данные каждого возвращаемого типа (возможно, преобразованного) отдельно */ switcti (item type [i] ) { case SQL C CHAR: /* Получены текстовые данные ~ просто выводим их */ puts(item data[il); break; case SQL C LONG: /* Четырехбайтовое целое - конвертируем и выводим */ printf ( %ld , *((int *) (item data[i]))); break; case SQL C DOUBLE : /* Число с плавающей запятой - конвертируем и выводим */ prmtf ( %ld , *( (double *) (item data [i 1 )) ) ; break; printf( ХпКонец данных.\n ); /* Освобождаем выделенную память */ Рис ]9.ЩИслопьзоватв СО тння дннамич&стк запросов
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |