|
Программирование >> Sql: полное руководство
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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |