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

1 ... 166 167 168 [ 169 ] 170 171 172 ... 264


3 ДлА каждого столбца программа вызывает функцию dbcolname (), чтобы узнать имя столбца, функцию dbcoltype О , чтобы узнать его тип данных, и функцию dbcollen О , чтобы узнать его максимальную длину.

4 Для приема каждого столбца программа выделяет буфер и вызывает функцию dbbind О , чтобы связать каждый столбец со своим буфером

5 После привязки всех столбцов программа многократно вызывает функцию dbnextrow (), чтобы извлечь каждую строку из таблицы результатов запроса.

mam О

/* Это простая универсальная программа для выполнения запросов. Вначале она запрашивает у пользователя имя таблицы, а затем имена столбцов, которые должны быть включены в запрос. После того как пользователь вводит запрашиваемую информацию, программа выполняет запрос и отображает на экране полученные результаты.

LOGINREC *loginrec; /* структура данных для хранения

регистрационной информации */ DBPROCESS *dbproc; /* структура данных, описывающая соединение */

char stmtbuf[20011; /* текст инструкции SQL, который должен быть

выполнен */

char querytbl[32]; /* заданная пользователем таблица */

char querycol[323; /* заданный пользователем столбец */

mt status; /* код завершения */

mt first col = 0; /* это первый выбранный столбец? */

mt colcount, /* число столбцов в таблице результатов запроса

mt i; /* индекс для столбцов */

char mbuf [101]; /* информация, введенная пользователем */

char *item name[100]; /* массив для отслеживания имен столбцов */

char *item data[1001; /* массив для отслеживания буферов столбцов */

mt item type[100]; /* массив для отслеживания типов данных

столбцов */

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

mt length; /* длина буфера для текущего столбца */

/* Подключиться к SQL Server */ loginrec = dblogm (); DBSETLUSERdogmrec, scott ) ; DBSETLPWD (loginrec, tiger ); dbproc = dbopen(loginrec, );

/* Попросить пользователя ввести имя таблицы для запроса */ prmtf ( *** Программа формирования запросов ***\п ); printf( Введите имя таблицы для запроса: ); gets(querytbl) ;

/* Начать создание инструкции SELECT в буфере */ strcpy(stmtbuf, select );

/* Обратиться к системному каталогу SQL Server за именами столбцов */

dbcmd(dbproc, select name from syscolumns );

dbcmd(dbproc, where id = (select id from sysobjects );

dbcmd(dbproc, where type = U and name = ),

dbcmd(dbproc, querytbl);

dbcmd(dbproc, ) );

dbsqlexec(dbproc) ;

c 19.10. Программа формирования динамичвааосзапросов для SQLServer



/* Обработать результаты запроса */ dbresults(dbproc), dbbind(dbproc, querycol),

while (Status = dbnextrow(dbproc) == SUCCEED) {

printf ( Включить столбец %s (y/n) , querycol);

gets(inbuf),

if (inbuf[0] y) {

/* Пользователь выбрал столбец; добавить столбец в список */

if (first col++ > 0) strcat(stmtbuf, );

strcat(stmtbuf, querycol).

/* Закончить инструкцию SELECT предложением FROM */ strcat(stmtbuf, from ), strcat(stmtbuf, querytbl);

/* Дать команду на выполнение запроса и узнать, как он был выполнен */

dbcmd(dbproc, stmtbuf);.- (Т)

dbsqlexec (dbproc) ;---

dbresults (dbproc) ;--- \

/* Получить описание столбцов, выделить для них память и выполнить привязку */

colcount = dbnumcols (dbproc) ; -

for (1=0, 1 < colcount; 1++) {

item name[i] = dbcolname (dbproc, 1);.-

type = dbcoltype (dbproc, 1);.----

switch(type) {

case SQLCHAR:

case SQLTEXT:

case SQLDATETIME:

length = dbcollen(dbproc, 1) +1;

item data[i] = address = malloc(length);

item type[i] = NTBSTRINGBIND;

dbbind (dbproc, 1, NTBMRINGBIND, length, address);--®

brea)c; /

case SQLINTl: case SQLINT2: case SQLINT4:

item data[i] = address = malloc(sizeof(long)),

item type[i] = INTBIND;

dbbind(dbproc, 1, INTBIND, sizeof(long), address); break;

case SQLFLT8. V

case SQLMONEY:

item data [1 ] = address = malloc (sizeof (double) ) ;

item type[i] = FLT8BIND;

dbbind(dbproc, 1, FLT8BIND, sizeof(double), address); break;

/* Извлечь строки из таблицы результатов запроса и отобразить их на экране while (status = dbnextrow (dbproc) == SUCCEED) { --CS)

/* Цикл вывода данных для каждого столбца строки */ printf( \ ) ,

for (1 = 0; 1 < colcount; 1++) {

Рис. 19.10. Программа формирования динамических яапросовдля SQL Server



/* Вквести на экран метку столбца /

prmtf ( Столбец # %d (%s): , i + l, iten name [i] ) ,

/* Обработать данные каждого типа отдельно */ switch(item type[1]) {

case NTBSTRINGBIND:

/* аекстовые данные - просто отобрази1ь их на экране */

puts(item data[il ) ;

break,

case INTBIND:

/* Четырехбайтовые целочисленные данные - преобразовать их

и отобразить на экране */ printf( %ld , *((int *) (item data[i]))); break;

case FLT8BIND:

/* Данные с плавающей запятой - преобразовать их и отобразить

на экране / prmtf ( %lf , *( (double *) (item data [ 11 ) ) ) , break,

prmtf ( ХпКонец данных . \n } ;

/* Освободить выделенную память */ for (i =0; 1 < colcount; i++) ( free(item data [i]);

dbexit (dbproc), exit(D),

Phc. J9.W. Программа формирования динамических запросх>в для SQL Server

Программа для SQL Server (рис. 19.10) выполняет ту же задачу, что и профамма с динамическим SQL (рис. 18.9). Будет полезно сравнить две эти профаммы и применяемые в них методы

Как в случае применения всфоенного SQL, так и при использовании библиотеки DB-Library профамма формирует инструкцию select в своих буферах и передает ее в СУБД для обработки В динамическом SQL эту задачу выполняет специальная инструкция prepare, в SQL Server используются функции dbcmd () и dbsqlexec ()

В обоих случаях профамма должна запрашивать у СУБД описание столбцов таблицы результатов запроса. В динамическом SQL это делает специальная инсфукция describe, а описание возвращается в область sqlda. В случае библиотеки DB-Library описание возвращается в профамму посредством вызовов API-функций. Обратите внимание на то, что профамма, приведенная на рис 19.10, имеет свои собственные массивы для отслеживания информации о столбцах.

В обоих случаях программа должна вьщелять буферы для приема результатов запроса и связывать столбцы с этими буферами В динамическом SQL профамма осуществляет привязку столбцов, помещая адреса буферов в структуры sqlvar



1 ... 166 167 168 [ 169 ] 170 171 172 ... 264

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