|
|
После
того, как XSQLDA создана для хранения
элементов возвращаемых
инструкцией запроса, строка
инструкция может быть создана,
подготовлена, и описана. Когда строка
инструкция выполнена, InterBase создает список
выбора строк как
результат запроса. Подготовка
строки запроса включает следующие шаги: 1.
Создайте саму строку: char
*str = "SELECT * FROM CUSTOMER"; Инструкция,
кажется, имеет
только один элемент списка выбора (*).
Звездочка - символ подстановочных знаков,
который замещает все столбцы в таблице, так
что фактическое число возвращенных
элементов равняется числу столбцов в
таблице. 2.
Объявите и инициализируйте дескриптор
инструкции с помощью isc_dsql_allocate(): isc_stmt_handle
stmt; /*
Объявление дескриптора инструкции. */ stmt
= NULL; .
. . isc_dsql_allocate_statement(status_vector,
&db1, &stmt); 3. Проанализируйте
строку с помощью isc_dsql_prepare (), она выполняет
грамматический разбор инструкции, и
заполняет stmt.
Дескриптор инструкции используется в
последующих запросах к isc_dsql_describe_bind () и
isc_dsql_execute (): isc_dsql_prepare(status_vector,
&trans, &stmt, 0, str, 1, NULL); 4. Используйте
isc_dsql_describe () для заполения структуры XSQLDA
вывода информацией об элементах списка
выбора(столбцах), возвращаемых инструкцией: isc_dsql_describe(status_vector,
&stmt,1, out_sqlda); 5. Сравните
значение поля sqln
структуры XSQLDA со значением поля sqld, чтобы
удостовериться, что выделено достаточно
структур XSQLVAR для хранения информации о
каждом параметре. Sqln должен быть по крайней
мере таким же как sqld. Если не хватает памяти
для предварительного размещения
дескриптора вывода, то
перераспределте память заново таким
образом, чтобы отразить число параметров,
указанных в sqld, сбросьте sqln и version,
установите и их снова, и выполните опять
isc_dsql_describe_bind (): if
(out_sqlda->sqld > out_sqlda->sqln) {
n = out_sqlda->sqld;
free(out_sqlda);
out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
out_sqlda->sqln = n;
out_sqlda->version = SQLDA_VERSION1;
isc_dsql_describe(status_vector, &trans, 1, out_sqlda); } 6.
Обработайте каждый XSQLVAR параметр в структуре
XSQLDA.
Это выглядит так:
Следующий
пример кода иллюстрирует эти шаги, и
выполняет цикл для каждой структуры XSQLVAR
принадлежащей out_sqlda
XSQLDA: for
(i=0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++) { dtype
= (var->sqltype & ~1); /* drop flag bit for now */ switch(dtype) { case
SQL_VARYING: var->sqltype
= SQL_TEXT; var->sqldata
= (char *)malloc(sizeof(char)*var->sqllen + 2); break; case
SQL_TEXT: var->sqldata
= (char *)malloc(sizeof(char)*var->sqllen); break; case
SQL_LONG: var->sqldata
= (char *)malloc(sizeof(long)); break; .
. . /*
обработка других типов */ }
/* конец инструкции switch
*/ if
(var->sqltype & 1) { /*
выделяем память для хранения NULL
индикатора
*/ var->sqlind
= (short *)malloc(sizeof(short)); } }
/* конец цикла */
|
Дизайн: Piton Alien |