Главная ]
3.3.2.Подготовка инструкции запроса без параметров
Программирование
Базы данных



 

После того, как 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. Это выглядит так:

  • Приведите типы данных  параметров (необязательно).

  • Выделите   память  для локальных данных, указанных полем sqldata XSQLVAR. Этот шаг только требуется, если память для локальных переменных выделена до времени выполнения. Следующий пример иллюстрирует динамическое выделение  памяти для локальных переменных:

  • Значение параметра должно быть совместимого типа данных(обязательно)

  • Определите  индикатор  NULL - значения для параметра.

Следующий пример кода иллюстрирует эти шаги, и выполняет цикл для каждой структуры 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
Rambler's Top100 Рейтинг@Mail.ru
Сайт создан в системе uCoz