|
Программирование >> Sql: полное руководство
/* Проверить результаты выполнения каждой из трех инструкций */ if (dbresults(dbproc) = SUCCEED) goto do errorr if (dbresults(dbproc) = SUCCEED) goto do error; if (dbresults(dbproc) != SUCCEED) goto do error; Риа ШЖПрЩненипакегЬ йитфщнй-в SQL Server При разработке профаммы, текст которой изображен на рис. 19.4, профаммист заранее знает, что пакет содержит фи инсфукции, и может сделать в профамме три соответствующих вызова функции dbresults (). Если число инсфукций в пакете заранее неизвестно, профамма может вызывать функщ1:ю dbresults () многократно - до тех пор, пока не получит код ощибки NO MORE RESULTS. Фрагмент профаммь!, приведенный на рис. 19.5, иллюсфирует эту методику. /* Выполнить инструкции, переданные ранее с помощью вызовов функции dbcmd() */ dbsqlexec(dbproc); J* Цикл проверки результатов выполнения каждой из инструкций пакета */ while (status = dbresults(dbproc) != N0 MORE RESULTS) ( if (status == FAIL) goto ]andle error; else printf( Инструкция выполнена.\n ); /* Цикл закончен; выполнение пакета завершилось успешно */ prmtf ( Пакет выполнен .\п ) ; exit(0); Рис 19.5. Обработка результатов выгюлнения паквтднструкций в SQL Server Обработка ошибок Значение, возвращаемое функцией dbresults (), сообщает профамме о том, успещно ли была выполнена соответствующая инсфукция пакета. Чтобы получить более детальную информацию об ощибке, профамма должна иметь свою собственную функцию обработки сообщений. Когда в SQL Server при выполнении инсфукиии возникает ощибка, библиотека DB-Library автоматически вызывает функцию обработки сообщений. Отметим, что библиотека вызывает эту функцию во время выполнения функции dbsqlexec О или dbresults (), Т.е. до того как они возвратят результат в профамму. Это позволяет функции обработки сообщений выполнить свою собственную обработку ощибки. На рис. 19.6 представлен фрагмент программы для SQL Server, который содержит функцию обработки сообщений msg rtn (). В начале своего выполнения программа регистрирует эту функцию, вызывая функцию dbmsghandle (). Предположим, что ошибка происходит в то время, когда SQL Server обрабатьгеает инструкцию delete. Когда профамма вызывает функцию dbsqlexec () или dbresults () и библиотека DB-Library получает от SQL Server сообщение об ошибке, она вызывает из выполняемой функции подпрофамму msg rtn () данной профаммы, передавая ей пять парамефов: dbproc - подключение, при котором произошла ошибка; msgno - номер ошибки; msgstate - код ситуации, в которой возникла ошибка; severity - категория сложности, показывающая, насколько серьезна данная ошибка; ш msgtext - сообшение об ошибке, соответствующее номеру msgno. у* Внешние переменные для хранения информации об ошибке */ mt errcode; /* сохраненный код ошибки */ char errmsg[256]; /* сохраненное сообщение об ошибке */ /* Определить собственную функцию обработки сообщений */ mt msg rtn(DBPROCESS *dbproc, DBINT msgno, int msgstate, mt severity, char *msgtext) extern int errcode; extern char *errmsg, , /* Вывести на экран сообщение об ошибке и ее номер */ printf( *** Ошибка: %d Сообщение: %s\n , msgno, msgtext); /* Сохранить информацию об ошибке для использования в программе */ errcode = msgno; strcpy(errmsg, msgstate); /* Вернуться в библиотеку DB-Library, чтобы закончить выполнение API-функции */ return(0); main() ( DBPROCESS *dbproc; /* Структура данных, описывающая соединение */ /* Инициализировать собственную функцию обработки сообщений */ dbmsghandle(msg rtn) /* Выполнить инструкцию DELETE */ dbcrcid(dbproc, delete from salesreps where quota < 100000.00 ), dbsqlexec(dbproc); dbresults(dbproc); Рис. 19.6, Обработка оши1 ок в программе дпя SQL Server функция msg rtn () данной программы обрабатывает сообщение следующим образом: она выводит его на экран и сохраняет код ошибки в программной переменной для дальнейшего использования. Когда функция обработки сообщений возвращает результат в библиотеку DB-Library (которая ее вызвала), библиотека заканчивает выполнение функции, сгенерировавшей ошибку, и возврашает в профамму флаг состояния fail. Профамма может обнаружить этот флаг и, если необходимо произвести свою собственную обработку ошибки. Процедура обработки ошибок, осуществляемая в SQL Server, представлена в рас-смафиваемой программе (plic. 19.6) несколько упрощенно. Помимо ошибок инструкций SQL, обнаруживаемых в SQL Server, ошибки могут также происходить и в самой библиотеке DB-Libfary. Например, если соединение с SQL Sewer будет разорвано, время ожидания ответа библиотекой DB-Library может превысить установленный лимит, в результате чего возникнет ошибка Библиотека обрабатывает такие ошибки, вызывая из выполняемой функции отдельную функцию обработки ошибок, которая во многом подобна описанной выше функции обработки сообщений Из сравнения рис. 19.6 с рис. 17.10 и 17.12 можно увидеть различия в методике обработки ошибок между библиотекой DB-Library и встроенным SQL: Во встроенном SQL профамма узнает об ошибках и предупреждениях, обращаясь к области sqlca SQL Server сообщает об ошибках и предупреждениях, вызывая из выполняемой функции специальные функции прикладной программы и передавая им код и описание возникшей ошибки. Во всфоенном SQL обработка ошибок осуществляется синхронно. Когда во время выполнения всфоенной инсфукции SQL происходит ошибка, управление возвращается профамме и проверяется значение переменных sqlcode/sqlstate. Обработка ошибок в SQL Server происходит асинхронно. Когда при выполнении APJ-функции происходит ошибка, SQL Server вызывает функцию обработки ошибок или сообщений, входящую в прикладную профамму, во время выполнения самой API-функции. Позднее эта API-функция возврашает в профамму код ошибки. Во встроенном SQL определен только один тип ошибки и существует один механизм сообщения о ней. В SQL Server определены два типа ошибок и существуют два Параллельных механизма. Короче говоря, обработка ошибок во всфоенном SQL осуществляется просто и понятно, но прикладная программа имеет ограниченное число вариантов ответных действий при возникновении ошибок Профамма для SQL Server обрабатывает ошибки более гибко. Однако схема вызова из выполняемой функции, которая используется в библиотеке DB-Library, довольно сложна, и если системные программисты с ней знакомы, то прикладные профаммисты могут ее и не знать. Запросы на выборку в SQL Server Методика выполнения профаммных запросов на выборку в SQL Server очень похожа на методику выполнения других инсфукций SQL. Для вьшолнения запроса профамма посылает в SQL Server инструкцию select и с помощью библиотеки DB-Library сфОка за сфокой извлекает таблицу результатов запроса. Профамма, представленная на рис. 19 7, иллюсфирует методику выполнения запроса в SQL Server: 1. Чтобы передать в SQL Server инструкцию select и дать команду на ее выполнение, программа вызывает функции dbcmd () и dbsqlexec (). 2. Когда после выполнения инсфукции select профамма вызывает функцию dbresults о, библиотека DB-Library возвращает код завершения запроса и делает доступной для обработки таблицу результатов запроса.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |