Программирование >>  Sql: полное руководство 

1 ... 171 172 173 [ 174 ] 175 176 177 ... 264


функции SQLParamData о И SQLPutData () реализуют альтернативный метод отложенной передачи параметров инструкции SQL. Суть его заключается в следующем. Вы, как обычно, вызываете для очередного параметра функцию SQLBmdParamO , но вместо адреса буфера указываете, что для данного параметра будет использоваться режим отложенной передачи, и задаете специальный тег, который будет идентифицировать этот параметр в дальнейшем.

Запросив выполнение инструкции с помощью функции SQLExecDirect () или SQLExecute (), программа вызывает функцию SQLParamData (), чтобы определить требуются ли этой инструкции параметры. Если таковые действительно требуются то функция SQLParamData () возвращает специальный код (sql need data) и тег параметра, для которого необходимо предоставить значение. Получив эту информацию, программа передает нужное значение с помощью функции SQLPutData(). После этого программа снова вызывает функцию SQLParamData (), чтобы выяснить, для какого еще параметра требуются динамические данные. Весь этот процесс циклически повторяется до тех пор, пока библиотеке CLI не будут предоставлены все значения параметров, после чего инструкция SQL будет, наконец, вьшолнена

Описанный альтернативный метод передачи параметров гораздо более сложен, чем простое связывание параметров с профаммными буферами. Однако у него есть два важных преимущества. Первое из них заклкчается в том, что реальная передача данных (и выделение для них памяти) может быть отложена до того момента, когда эти данные пофебуются. А второе преимущество состоит в том, что эта методика позволяет передавать очень длинные значения парамефов по частям. Функцию SQLPutData () МОЖНО вызывать для одного и того же парамефа несколько раз, в каждом вызове задавая очередную порциЬ данных. Например, если в предложении VALUES инсфукции INSERT должсн быть передан текст документа, его можно передавать по тысяче символов за раз, повторяя вызовы функции SQLPutData (), пока весь документ не будет отправлен на сервер. Это позволяет избежать создания в прОфамме слишком большого буфера для хранения всего документа.

Управление транзакциями

Операции завершения и отмены ф1анзакции, реализуемые инсфукциями commit и ROLLBACK, можно вьшолнить И посрсдством CLL Обе эти инсфукции заменены функцией SQLEndTran О, объявление которой приведено на рис. 19.16. Эта функция использовалась для завершения фанзакции в профаммах, представленных на рис. 19.11 и 19.15. Какую конкретно операцию должна выполнить функция SQLEndTran (), следует указать в парамефе complType.

Функция SQLCancel О, объявление которой также приведено на рис. 19.16, непосредственно в управлении фанзакциями не участвует, но на практике используется совместно с операцией отмены фанзакции. Она отменяет инишшрованное функцией SQLExecDirect О ИЛИ SQLExecute () выполнение инсфукции SQL, для которой используется отложенная передача парамефов. Если профамма решает, что вместо передачи значения очередного парамефа следует просто отменить вьшолнение инсфукции, она вызывает функцию SQLCancel О. Кроме того, функция SQLCancel О может использоваться в многопотоковом приложении для отмены еще не завершенной инструкции, выполняемой функцией SQLExecDirect () или SQLExecute (). Пока поток, вызвавший одну из этих функций, ждет завершения инсфукции, другой параллельно выполняющийся поток может вызвать функцию SQLCancel О, передав ей тот же дескрштгор инсфукции. Особенности этого процесса и то, насколько прерываемыми являются функции CLI, зависят от конкретной реализации библиотеки.



/* Завершение или отмена транзакции */

short SQLEndTran(

short hdlType, /* Входной: тип дескриптора */

long txnHdi, /* Входной: дескриптор среды или сеанса */

short complType) /* Входной: тип операции (COMMIT или ROLLBACK) */

/* Отменяет выполнение текущей инструкции SQL */ short SQLCancel(

long StmtHdl) /* Входной: дескриптор инструкции */

рис 19.16. 0ytfkn си, служащие япя упрашгвния транзакциями ш

Обработка результатов запроса

Функции CL1, о которых мы говорили до сих пор, могут использоваться для вьнтолнения любых инструкций DML и DDL, не связанных с выборкой данных (т.е. инструкций UPDATE, DELETE И INSERT) Для обработки запросов на выборку требуются некоторые дополнительные функции CL1, объявления которых приведены на рис. 19.17, - ведь нужно не только выполнить запрос, но и получить его результаты. Проще всего это сделать с помощью функций SQLBmdCol () и SQLFetch (). Чтобы получить результаты запроса, приложению нужно выполнить следующие действия (предполагается, что соединение с базой данных уже установлено):

1. Получить дескриптор инструкции посредством функции SQLAllocHandle О .

2. Вызвать функцию SQLPrepare (), передав ей текст инструкции SELECT.

3. Вызвать функцию SQLExecute () для выполнения запроса.

4. Вызвать функцию SQLBmdCol () по одному разу для каждого столбца таблицы результатов запроса, который должен быть возвращен приложению. Каждый вызов функции связывает возвращаемый столбец с программным буфером.

5 С помощью функции SQLFetch () по очереди извлечь все строки из таблицы результатов запроса, пока при очередном вызове функции не будет возвращено значение, указывающее, что все строки получены. Функция SQLFetch () помещает содержимое строки в программные буферы, предварительно связанные со столбцами в таблице результатов запроса с помощью функции SQLBmdCol ().

6. Когда все результирующие данные получены, профамма должна вызвать функцию SQLCloseCursor () для прекращения доступа к таблице результатов запроса.

/* Связывает столбец в таблице результатов запроса

с программным буфером */ short SQLBindCol(

long StmtHdl, /* Входной: дескриптор инструкции */ short colNr, /* Входной: номер связываемого столбца */

short tgtType, /* Входной: тип данных, помещаемых в буфер */ void *value, /* Входной: указатель на буфер */

long bufLen, /♦ Входной: длина буфера */

long *lenlnd) /* Входной: указатель на буфер, в который

помещается реальная длина содержимого столбца или индикатор значения NULL */

Перемещает указатель набора записей на следующую строку в таблице результатов запроса */

19.17. Функции CLI служаи(и0для обработки результатов запроса



short SQLFetch(

long StmtHdl) /* Входной: дескриптор инструкции */

/* Перемещает указатель набора записей вверх или вниз по таблице результатов запроса */

short SQLFetchScroll(

long StmtHdl, /* Входной: дескриптор инструкции */ short fetchDir, /* Входной: направление перемещения */ long offset) /* Входной: смещение (количество строк) */

/* Получение данных из одного столбиа в таблице результатов запроса */ short SQLGetData(

long StmtHdl, /* Входной: дескриптор инструкции */ short colNr, /* Входной: номер получаемого столбца */

short tgtType, /* Входной: тип данных, помещаемых в буфер */ void *value, /* Выходной: указатель на буфер */

long bufLen, /* Входной: длина буфера */

long *lenlnd) /* Выходной: указатель на буфер, в который

помещается реальная длина содержимого столбца или индикатор значения NULL */

/* Закрытие набора записей - прекращение доступа

к таблице результатов запроса */ short SQLCloseCursor(

long StmtHdl) /* Входной: дескриптор инструкции */

/* Назначение имени открытому набору записей */

short SQLSetCursorName(

long StmtHdl, /* Входной: дескриптор инструкции */ char *cursName, /* Входной: им набора записей */ short nameLen) /* Входной: длина имени */

/* Получение имени открытого набора записей */ short SQLGetCursorName(

long StmtHdl, /* Входной: дескриптор инструкции */ char *cursName, /* Выходной: буфер для возвращаемого имени */ short bufLen, /* Входной: длина буфера */

short *namLen) /* Выходной: указатель на буфер, в который

помещается реальная длина глученного имени */

Рис. 19.17 Функции си, служащие для обработки результатов запроса

Пример программы, выполняющей запрос на выборку с помощью функций CL1, приведен на рис. 19.18. Функционально он идентичен профамме, представленной на рис 19.7, использующей функции DB-Library в SQL Server Если вы сравните эти две профаммы, то увидите, что в них используются вызовы соверщенно разных библиотечных функций (и с pa3HbnviH парамефами), но логическая схема их работы одинакова. Каждый вызов функции SQLBindCol () устанавливает связь между одним столбцом в таблице результатов запроса (идентифицируемым по номеру) и профаммным буфером (идентифицируемым по аяресу). Функция SQLFetch () использует эти связи для копирования данных из столбцов таблицы результатов запроса в соответствующие профаммные буферы. Если буфер предназначен для получения сфок переменной длины, то используется еще один буфер, в который помещается значение длины реально записанных в первый буфер данных. Если же столбец содержит значение NULL, в этот второй буфер записьшается соответствующая константа-индикатор Получив все сфоки из таблицы результатов запроса, профамма вызывает функцию SQLCloseCursor О



1 ... 171 172 173 [ 174 ] 175 176 177 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика