|
Программирование >> Sql: полное руководство
for (1 =0; 1 < colcoant; { free(item data[i]) ; free(item name[i]) ; /* Отключаемся от сервера, освобождаем дескрипторы и выходим из программы */ SQLDisconnect(conn hdl); SQLFreeHandle(SQL HANDLE STMT, stmtl hdl); SQLFreeHandle(SQL HANDLE STMT, stmt2 hdl); SQLFreeHandle(SQL HANDLE DBC, conn hdl); SQLFreeHandle(SQL HANDLE ENV, env hdl); exit(0); Рис 19.20. Использование CU для выполнения динамических запросов Если сравнить программу, представленную на рис. 19.20, с профаммой, использующей встроенный SQL (рис. 18.9), то одним из главных отличий окажется то, что во всфоенном SQL применяется специальная область данных SQL (SQL Data Area - SQLDA), предназначенная для привязки столбцов и получения их описания. В CL1 эту задачу выполняют несколько функций: SQLNumResultCols (), SQLDescribeCol О и SQLBindCol О. Большинству профаммистов удобнее пользоваться функциями CLI. Однако CLI предоставляет также в распоряжение профаммистов альтернативный низкоуровневый метод, дублирующий возможности SQLDA. В этом альтернативном мефде вьшолнения динамических запросов используются специальные сфуктуры CLI, называемые описателями. Описатель CLI содержит низкоуровневую информацию о параметрах инсфукции SQL (описатель парамефов) или о столбцах таблицы результатов запроса (описатель записей) и соответствует дескриптору SQL2, сфуктура которого была описана в главе 18. Информация в описателе подобна той, чтоодержится в переменной части области sqlda - имя столбца или параметра, тип и дополнительный тип данных, длина данных, адрес буфера, адрес для индикатора значения null и т.д. Описатели параметров и записей соответствуют входным и выходным областям SQLDA, которые имеются в реализациях динамического SQL некоторых популярных СУБД. Описатели CLI идентифицируются дескрипторами. При подготовке инсфукции SQL к выполнению библиотека CLI создает для ее парамефов и для столбцов таблицы результатов запроса по два описателя: один из них представляет собой буфер прикладных значений, т е. тех значений, которыми оперирует непосредственно приложение, а второй - это буфер системных значений, которыми оперирует уже СУБД (над этими значениями могут выполняться дополнительные операции преобразования типов данных). В качестве альтернативы профамма может создать и свои собственные описатели. Дескрипторы описателей, связанных с конкретной инструкцией SQL, считаются ее атрибутами, и доступ к ним можно получить через дескриптор самой инсфукиии. Приложение может получать и устанавливать значения дескрипторов описателей с помощью функций управления афибутами, описанных далее в настоящей главе. Для получения хранящейся в описателе информации используются две функции. Функция SQLGetDescField () извлекает из описателя отдельное поле;идентифицируемое собственным кодом. Она обычно применяется для определения типов данных и размеров столбцов в таблице результатов запроса. Функция SQLGetDescRec О возвращает набор наиболее часто используемых полей, включая имя столбца иди парамефа, основной и дополнительный тип данных, длину, точность и степень 1асштабирования (если описываемый элемент является десятичным числом), а также индикатор, указывающий, может ли столбец содержать значения null. Аналогичная пара функций предназначена для занесения информации в описатель. Функция SQLSerDescField О устанавливает значение указанного поля описателя, а функция SQLSetDescRec о задает значения набора наиболее часто используемых полей. Для удобства в CLI включена также функция SQLCopyDesc (), копирующая всю информацию из одного описателя в другой. Ошибки си и диагностическая информация Каждая функция CLI возвращает целочисленное значение типа short, указывающее, как завершилась ее работа. Если код завершения свидетельствует об ошибке, можно воспользоваться функциями обработки ошибок (объявления которых приведены на рис. 19.21), чтобы выяснить, что именно произошло. Чаще всего с этой целью вывается функция SQLError (). Приложение передает ей дескрипторы среды SQL, сеанса подключения и инструкции и получает значение переменной SQLSTATE, системный код ошибки (сгенерированный подсистемой, в которой она произошла) и сообщение об ошибке в текстовой форме. /* Получение информации во время пооледнего в short SQLError( об ошибке, произошедшей ызова функции CLI */
дескриптор среды SQL */ дескриптор сеанса подключения */ дескриптор инструкции */ пятисимвольное значение переменной SQLSTATE */ указатель на буфер, в который записывается полученный системно-зависиьлый код ошибки */ буфер для сообщения об ошибке */ длина буфера */ указатель на буфер, в который записывается реальная длина полученного сообщения */ /* Определение количества строк, обработанных последней инструкцией SQL */ short SQLRowCount ( long StmtHdl, /* Входной: дескриптор инструкции */ long *rovjCnt) /* Выходной: указатель на буфер, в который записывается количество строк */ /* Получение значений набора полей из структуры CLI, содержащей диагностическую информацию */ short SQLGetDiagRec( /* Входной: /* Входной: /* Входной: short long short hdlType, inHdl, recNr, char long код типа дескриптора */ дескриптор CLI */ номер запрашиваемой записи с информацией об ошибке */ *sqlState, /* Выходной: пятисимвольное значение переменной SQLSTATE */ *nativeErr, /* Выходной: указатель на буфер, в который записывается полученный системно-зависимый код отибкм Рчс. 19.21. Функции си, служащие для обработки ошибок char *msgBuf, /* Выходной: буфер для сообщения об ошибке */ short bufLen, /* Входной: длина буфера */ short *msgLen) /* Выходной: указатель на буфер, в который записывается реальная длина полученного сообщения */ / Получение значения указанного поля из структуры CLI, содержащей диагностическую информацию */ short SQLGetDiagField( short hdlType, /* Входной: код типа дескриптора */ long inHdl, /* Входной: дескриптор CLI */ , short recNr, /* Входной: номер запрашиваемой записи \ с информацией об ошибке */ short diagld, /* Входной: идентификатор требуемого поля записи */ void *diagInfo, /* Выходной: полученная диагностическая информация */ short bufLen, /* Входной: длина буфера для диагностической информации */ short *actLen) /* Выходной: указатель на буфер, в который записывается реальная длина полученной информации */ Риа 19.21. ИИ С 1ужа1тв дпя обработки ошибок Функция SQLError О на самом деле возвращает только наиболее часто используе-1ую информацию из диагностический структуры CLI. Другие функции обработки оши-ок предоставляют более полную информацию, которую они получают путем непосред-твенного доступа к диагностическим записям, создаваемым и поддерживаемым CLI ! общем случае CL1 может сгенерировать несколько ошибок и соответственно создать есколько диагностических записей. Функция SQLGetDiagRec () возвращает одну ди-гностическую запись, идентифицируемую по ее номеру. Вызвав эту функцию несколько аз, приложение может получить основную информацию обо всех ошибках, произошед-1их в ходе выполнения последней вызванной функции CLI. Более полная информация южет быть получена путем исследования отдельных полей диагностической записи. Эту озможность предоставляет функция SQLGetDiagField (). Еще одна функция, SQLRowCount (), хотя и не имеет прямого отнощения к бработке ошибок, тоже вызывается после функции SQLExecute (). Она возврашает оличество строк, обработанных инструкцией SQL (например, значение 4 будет озвращено после выполнения инструкции UPDATE, обновившей четыре записи). Атрибуты СИ CLI поддерживает целый ряд опций, управляющих выполнением библиотечных пункций. Некоторые из них определяют относительно мелкие, но важные детали, как, апример, будет ли библиотека CLI считать, что все передаваемые ее функциям фоковые значения оканчиваются нулевым символом. Другие опции влияют на более юбальные аспекты работы CLI, например на допустимость произвольного доступа к аборам записей. Приложения управляют всеми этими опциями посредством атрибутов CLI. Атри-/ты организованы в иерархию, аналогичную иерархии дескрипторов CLL среда/се-ic/инсфукция . Афибуты среды определяют общие аспекты работы CLL А.фибуты -анса Ифают роль только в контексте конкретного сеанса подключения, созданного с эмощью функции SQLConnect о, и для разных сеансов могут бьяь различными, аконец, афибуты инсфукции влияют на выполнение конкретной инсфукцИИ, зентифицируемой ее дескриптором.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |