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



 

После того как структуры 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. Обработка  параметров структуры идет в четыре шага:

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

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

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

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

Эти шаги должны быть представлены в следующем порядке. Следующий пример кода иллюстрирует эти шаги, и выполняет цикл для каждой структуры 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 для каждого возвращаемого  элемента. Следующие шаги описывают этот процесс:

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

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

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

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

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