|
|
После
того как структуры XSQLDA
ввода и вывода были созданы для передачи
параметров строке инструкции, и принятия
возвращенных элементов
списка выборки после исполнения
инструкции, строка - инструкция может быть
создана и подготовлена. Когда
строка инструкция подготовлена, InterBase
заменяет параметры метки - заполнителя в
строке информацией о фактических
используемых параметрах. Информация о
параметрах должна быть передана в
структуру ввода XSQLDA (и возможно
откорректирована) прежде, чем инструкция
будет выполнена. Когда строка-инструкция
выполнена, InterBase сохраняет элементы списка
выбора в структуре вывода XSQLDA. Подготовка SQL
инструкции с метками-заполнителями идет
следующими шагами: 1.
Создайте саму строку с SQL
инструкцией. char
*str = "SELECT * FROM DEPARTMENT WHERE BUDGET = ?,LOCATION = ?"; Эта
инструкция содержит два параметра:
значение связанное со столбцом BUDGET
и значение связанное со столбцом LOCATION. 2.
Объявите и инициализируйте дескриптор SQL
инструкции с помощью 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 (),
isc_dsql_describe_bind (), и isc_dsql_execute2 (): isc_dsql_prepare(status_vector,
&trans, &stmt, 0,str, 1, out_xsqlda); 4. Используйте
isc_dsql_describe_bind () чтобы заполнить структуру
ввода XSQLDA информацией о параметрах
содержащихся в инструкции SQL: isc_dsql_describe_bind(status_vector,
&stmt, 1, in_xsqlda); 5. Сравните
поле sqln структуры XSQLDA с полем sqld, чтобы
определить может ли дескриптор ввода принять то число параметров
содержащихся в инструкции. Если нет,
освободите предварительно
выделеннeю
память для дескриптора
ввода, и заново перераспределите память
чтобы отразить число параметров указанных
sqld, сбросьте поля sqln и version
и выполните isc_dsql_describe_bind () снова: if
(in_sqlda->sqld > in_sqlda->sqln) { n
= in_sqlda->sqld; free(in_sqlda); in_sqlda
= (XSQLDA *)malloc(XSQLDA_LENGTH(n)); in_sqlda->sqln
= n; in_sqlda->version
= SQLDA_VERSION1; isc_dsql_decribe_bind(status_vector,
&stmt, 1, in_xsqlda); } 6.
Обработайте каждый XSQLVAR
параметр структуры ввода XSQLDA.
Обработка параметров
структуры идет в четыре шага:
Эти
шаги должны быть представлены в следующем
порядке. Следующий пример кода
иллюстрирует эти шаги, и выполняет цикл для
каждой структуры XSQLVAR в in_sqlda XSQLDA: for
(i=0, var = in_sqlda->sqlvar; i < in_sqlda->sqld; i++, var++) { /*
Обработайте каждый XSQLVAR
параметр здесь. Var
– указатель на структуру параметр*/ dtype
= (var->sqltype & ~1); switch(dtype) { case
SQL_VARYING: /* приведение к SQL_TEXT */ var->sqltype
= SQL_TEXT; /*
allocate proper storage */ var->sqldata
= (char *)malloc(sizeof(char)*var->sqllen); /*
Предоставьте значение для параметра. See
case SQL_LONG. */ .
. . break; case
SQL_TEXT: var->sqldata
= (char *)malloc(sizeof(char)*var->sqllen); /*
Provide a value for the parameter. See case SQL_LONG. */ .
. . break; case
SQL_LONG: var->sqldata
= (char *)malloc(sizeof(long)); /*
Присваиваем занчение пармтру. */ *(long
*)(var->sqldata) = 17; break; .
. . }
/* конец инструкции switch
*/ if
(sqltype
& 1) { /*
Резервирует переменную для хранения
индикатора NULL
*/ var->sqlind
= (short *)malloc(sizeof(short)); } }
/* end of for loop */ 7. Используйте
isc_dsql_describe () чтобы заполнить структуру
вывода XSQLDA информацией о элементах списка
выбора, возвращаемых инструкцией: isc_dsql_describe(status_vector,
&trans, &stmt, out_xsqlda); 8.
Сравните
поле sqln структуры XSQLDA с полем sqld, чтобы
определить может ли дескриптор вывода
хранить число элементов списка выбора,
указанных в инструкции. Если нет,
освободите выделенную предварительно
память для
дескриптору вывода, затем перераспределите
так память чтобы отразить число элементов
списка выбора, указанных sqld, сбросьте sqln и version,
и выполните все для output снова: 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, &stmt, out_xsqlda); } 9.
Подберите структуру XSQLVAR
для каждого возвращаемого элемента. Следующие шаги описывают этот
процесс:
Следующий
пример кода иллюстрирует эти шаги, выполняет цикл для каждой структуры XSQLVAR
принадлежащей out_sqlda
XSQLDA: for
(i=0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++) { dtype
= (var->sqltype & ~1);/ switch(dtype) { case
SQL_VARYING: var->sqltype
= SQL_TEXT; break; case
SQL_TEXT: var->sqldata
= (char *)malloc(sizeof(char)*var->sqllen); break; case
SQL_LONG: var->sqldata
= (char *)malloc(sizeof(long)); break; /*
обработка других типов */ }
/* конец
swicth */ if
(var->sqltype & 1) { var->sqlind
= (short *)malloc(sizeof(short)); } }
/* конец цикла */
|
Дизайн: Piton Alien |