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



 

После создания XSQLDA для передачи параметров в SQL инструкцию, SQL инструкция может быть создана и подготовлена. Локальные  переменные, соответствующие параметрам метки - заполнителя в строке должны быть присвоены соответствующим полям sqldata структурах XSQLVAR:

  1. Создайте строку с параметрами метками-заполнителями, например:

char *str = "UPDATE DEPARTMENT SET BUDGET = ?, LOCATION = ?";

Эта инструкция содержит два параметра BUDGET и LOCATION.

  1. Объявите и инициализируйте дескриптор SQL инструкции, место подкоторый выделяется с помощью isc_dsql_allocate():

           isc_stmt_handle stmt; /* Обьявите дескриптор инструкции. */

           stmt = NULL; /* Установите в NULL перед выделением памяти. */

           . . .

           isc_dsql_allocate_statement(status_vector, &db1, &stmt);

  1. Проанализируйте строковую инструкцию с помощью isc_dsql_prepare (), она производит грамматический разбор SQL предложения. Она установит дескриптор инструкции (stmt) ко внутреннему представлению. Дескриптор инструкции используется в последующих запросах к isc_dsql_describe_bind () и isc_dsql_execute ():

             isc_dsql_prepare(status_vector, &trans, &stmt, 0, str, 1,in_sqlda);

  1. Используйте isc_dsql_describe_bind () чтобы заполнить  XSQLDA ввода информацией о параметрах содержащихся в инструкции SQL:

            isc_dsql_describe_bind(status_vector, &stmt, 1, in_sqlda);

  1. Сравните значение  поля sqln структуры XSQLDA со значением поля sqld, чтобы удостовериться, что выделено достаточно структур XSQLVAR для хранения информации о каждом параметре. Sqln должен быть по крайней мере таким же как sqld. Если не хватает памяти для предварительного размещения дескриптора вывода,  то перераспределте память заново таким образом, чтобы отразить число параметров, указанных в 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_describe_bind(status_vector, &stmt, 1, in_sqlda);

             }

  1. Обработайте каждый 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 указывает на структуру XSQLVAR. */

  dtype = (var->sqltype & ~1); /* drop NULL flag for now */

  switch(dtype)

  {

   case SQL_VARYING: /* приводит к SQL_TEXT*/

    var->sqltype = SQL_TEXT;

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

         var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);

         . . .

         break;

       case SQL_TEXT:

          var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);

    /* здесь присваивается значение параметру */

       . . .

     break;

       case SQL_LONG:

           var->sqldata = (char *)malloc(sizeof(long));

     /* присваивается значения параметру */

           *(long *)(var->sqldata) = 17;

     break;

     . . .

      } /* end of switch statement */

      if (var->sqltype & 1)

     {

          /* выделяется переменная для NULL индикатора */

           var->sqlind = (short *)malloc(sizeof(short));

     }

} /* конец цикла */

  1. Выполните инструкцию. Пример:

       isc_dsql_execute(status_vector, &trans, &stmt, 1, in_sqlda);  

<< Назад ] Содержание ] Далее >> ]

 

Дизайн: Piton Alien
Rambler's Top100 Рейтинг@Mail.ru
Сайт создан в системе uCoz