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

1 ... 150 151 152 [ 153 ] 154 155 156 ... 264


struct sqlda *parmda; /* область SQLDA длч значений параметров */

struct sqlvar *parmvar; /* структура SQLVAR для текущего

значения параметра */ mt parmcnt; /* счетчик параметров */

int empl num; /* введенный пользователем

идентификатор служащего */ char empl num buf[4]; /* буфер для преобразования

идентификатора служащего в строку */ int ijj /* индекс массива columns [] */

int 3; /* индекс массива sqlvar в структуре sqlda */

char mbufllOl]; /* введенное пользователем значение */

/* Запросить у пользователя обновляемые столбцы */

printf ( *** Программа обновления данных о служащих ***\п\п );

parmcnt = 1;

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

/* Спросить о конкретном столбце */

prmtf ( Обновить столбец %s (у/п)? , columns [ i ]. name) ;

gets (mbuf) ;

if (inbuffO] == y) {

columns[1].selected = y;

parmcnt++;

/* Создать структуру SQLDA для передачи параметров */

parmda = raalloc(16 + (44 * parmcnt)); -Q

strcpy(parmda->sqldaid, SQLDA >; parmda->sqldabc = (16 + (44 * parmcnt)); parmda->sqln = parmcnt;

/* Начать формирование инструкции UPDATE */ strcpy(stmtbuf, update salesreps set );

/* Цикл no столбцам */ for (1 = 0, 3 = 0; 1 < COLCNT; 1++) {-©

/* Пропустить невыбранные столбцы */ if (columns[1].selected == n) continue;

/* Добавить в динамическую инструкцию UPDATE операцию присваивания */ strcat(stmtbuf, columns[1].name); strcat(stmtbuf, = ? );

If (parmcnt > (3+2)) strcat(stmtbuf, , );

/* Выделить память для данных и переменной-индикатора

и заполнить структуру SQLVAR информацией для данного столбца * I parmvar = parmda->sqlvar + 3;

parmvar->sqltype = columns [1] .typecode; -----

parmvar->sqllen = columns [1] .buflen; ---(£)

parmvar->sqldata = malloc(columns[i].buflen); --

parmvar->sqlind = raalloc(2);

strcpy(parmvar->sqlname.data, columns[1].name); 3++;

/* Заполнить последнюю структуру SQLVAR информацией о параметре,

содержащемся в предложении WHERE */ strcat(stmtbuf, where empl num = ? ); parmvar = parmda->sqlvar + (parmcnt-1);

Pw. ?&8. Применение инструкции EXECUTE и области 5010



parmvar->sqltype = 496; parmvar->sqllen = 4; parmvar->sqldata = empl num buf, parmvar->sqlind = 0,

parmda->sqld = parmcnt; M----

/* Скомпилировать динамическую инструкцию UPDATE */ exec sql prepare apdatestmt from :stmtbuf; if (sqlca.sqlcode < 0) {

printf( Ошибка при выполнении инструкции PREPARE: %ld\n , sqlca.sqlcode) ,

exit(l);

/* Цикл запроса параметров и выполнения обновлений */ for ( ; ; ) {

/* Запросить у пользователя идентификатор служащего,

данные о котором будут обновлены */ prmtf ( ХпВведите идентификатор служащего: ); scanf( %ld , Sempl num); itoa (empl num, empl num buf, 10); fflush (stdm) ; if (empl num 0) break;

/* Получить новые значения обновляемых столбцов */ for (3 = 0; 3 < (parmcnt-1); 3++) ( parmvar = parmda->sqlvar + 3;

printf( Введите новое значение для столбца %s: , parmvar->sqlname.data);

gets (inbuf) ; -

if (inbuffO] == *) {

/* Если пользователь вводит *, присвоить столбцу значение NULL /

*(parmvar->sqlind) = -1;

continue;

else {

/* В противном случае установить соответствующее значение

переменной-индикатора */ *(parmvar->sqlind) = 0;

switch(parmvar->bqltype) {

case 480: case 481:

/* Преобразовать введенные данные в 8-байтовое число с плавающей запятой */

ssoanf(inbuf, %lf , parmvar->sqldata) ;.-

break;

case 448: case 449:

/* Передать введенные данные в качестве строки

переменной длины */ strcpy(parmvar->sqldata, inbuf); parnvar->sqllen -= strlen (inbuf) ; break;

case 496: case 497:

/* Преобразовать введенные данные в 4-байтовое целое число */ sscanf (mbuf, %id , parmvar->sqldata) ; --

Рис. 18.8. Применение инсгруксцни ЕХЕШТЕ и области SQLDA



break;

/* Выполнить инструкцию */

exec sql execute updatestmt using descriptor parmda;.----

if (sqlca.sqlcode < 0) {

printf( EXECUTE error: %ld\n , sqlca.sqlcode);

exit(1);

/* Обновления закончены */

exec sql execute immediate commit worK ;

if (sqlca.sqlcode)

printf( Ошибка при выполнении инструкции COMMIT: %ld\n sqlca.sqlcode);

else

printf( \nBce обновления завершены.\n ); exit (0);

Рис. 18.8. Применение инсгрукции EXECUTE и облает SQLDA

Так как при запуске профаммы пользователь может выбирать (с целью обновления) разные столбцы, то для передачи парамефов при выполнении инструкции execute профамма должна использовать область sqlda. Данная профамма иллю-Сфирует общую методику применения области sqlda (кружки с цифрами на рис. 18.8 соответствуют пунктам данной методики):

1. Профамма резервирует область sqlda, достаточно большую для того, чтобы вместить все структуры sqlvar с описанием передаваемых параметров. Профамма заполняет также поле sqln, указывающее, сколько сфуктур sqlvar может быть выделено.

2. Для каждого передаваемого парамефа программа заполняет информацией, описывающей этот параметр, одну структуру sqlvar.

3. Программа определяет, каков тип данных парамефа, и помещает в поле sqltype соответствуюший код типа данных.

4. Профамма определяет длину парамефа и помешает ее в поле sqllen.

5. Профамма выделяет память для значения параметра и заносит адрес выделенной области памяти в поле sqldata.

6. Профамма выделяет память для переменной-индикатора, сопровождающей данный параметр, и заносит адрес этой переменной в поле sqlind.

7. Программа заполняет поле sqld, указывающее, сколько параметров будет передаваться. Это поле сообщает СУБД, сколько сфуктур sqlvar в области sqlda содержат правильные данные.

8. Профамма запрашивает у пользователя значения данных и помещает их в области данных, выделенные при выполнении пунктов 5 и 6.

9. Профамма выполняет инструкцию execute с предлюжением using descriptor чтобы передать парамефы посредством области sqlda.



1 ... 150 151 152 [ 153 ] 154 155 156 ... 264

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