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

1 ... 163 164 165 [ 166 ] 167 168 169 ... 264


/* Проверить результаты выполнения каждой из трех инструкций */ 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 возвращает код завершения запроса и делает доступной для обработки таблицу результатов запроса.



1 ... 163 164 165 [ 166 ] 167 168 169 ... 264

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