Программирование >>  Sql: полное руководство 

1 ... 174 175 176 [ 177 ] 178 179 180 ... 264


char \

stmt2buf[2001] ;

текст запроса на выборку

имен столбцов */

char

querytbl[32};

введенное пользователем

имя таблицы */

char

querycol[32] ;

заданный пользователем столбец */

first col = 0;

это первый выбранный столбец? */

short

colcount;

количество столбцов в таблице

результатов запроса */

char

*nameptr;

адрес буфера, в который записывается

имя столбца */

short

namelen;

возвращаемая длина имени столбца */

short

type;

возвращаемый код типа данных.

содержащихся в столбце */

short

size;

возвращаемый размер столбца */

short

digits;

возвращаемое количество

десятичных цифр */

short

nullable;

возвращаемый признак

допустимости значений NULL */

short

индекс столбца */

char

inbuf[101];

данные, вводимые пользователем */

char

*item name[100] ;

массив имен столбцов */

char

*item aata[lOOj;

массив буферов, хранящих

данные для столбцов */

item md[100];

массив индикаторов для столбцов */

short

item type[100] ;

массив типов данных столбцов */

char

*dataptr;

адрес буфера для текущего столбца */

/* Получаем необходимые дескрипторы и подключаемся к базе данных */ 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.ЩИслопьзоватв СО тння дннамич&стк запросов



1 ... 174 175 176 [ 177 ] 178 179 180 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика