Получение кодов завершения – LINTER_Error
Прототип функции
L_LONG LINTER_Error( L_WORD ConnectID, /* идентификатор соединения */ L_WORD CursorID, /* идентификатор курсора */ L_WORD StatementID, /* идентификатор оператора */ L_LONG *ApiCode, /* код завершения LinAPI */ L_LONG *LinCode, /* код завершения ЛИНТЕР */ L_LONG *SysCode, /* код завершения ОС */ L_CHAR *Message, /* буфер сообщения */ L_SWORD *MessLen); /* длина буфера сообщения */
Входные параметры
Параметр | Описание | |
---|---|---|
ConnectID
| Идентификатор соединения | |
CursorID
| Идентификатор курсора | |
StatementID
| Идентификатор оператора | |
MessLen
| Размер (в байтах) буфера Message |
Выходные параметры
Параметр | Описание | |
---|---|---|
ApiCode
| Код завершения LinAPI | |
LinCode
| Код завершения СУБД ЛИНТЕР | |
SysCode
| Код ошибки операционной среды сервера | |
Message
| Буфер сообщения | |
MessLen
| Размер (в байтах) сообщения |
Описание
Помещает в выходные параметры (если они отличны от NULL-значения) коды завершения LinAPI, СУБД ЛИНТЕР и операционной системы, а также сообщение, соответствующее коду завершения LinAPI или СУБД ЛИНТЕР.
Коды завершения LinAPI приведены в приложении 1.
Параметр SysCode
в некоторых случаях несет в себе совсем иное содержание:
-
при ошибке трансляции запроса (коды завершения СУБД ЛИНТЕР от 2000 до 2999) в
SysCode
будет представлена дополнительная информация о местоположении ошибки: первые два байта – номер строки в тексте SQL-запроса, последующие два байта – номер позиции в строке, где выявлен ошибочный фрагмент; -
при ошибках выполнения оператора с кодами завершения СУБД ЛИНТЕР 1051, 1052 и 1055 в
SysCode
находится номер параметра, при обработке которого произошла ошибка.
Если необходимо получить ошибки по одному объекту (соединению, курсору или оператору), то указывается его ID. Остальные идентификаторы должны быть равны нулю.
Параметры LinCode
и SysCode
несут в себе полезную информацию, только если код ошибки LinAPI равен eLINTERError
.
В пользовательском приложении лучше определить собственную функцию обработки ошибок, которая может иметь вид:
void processing_error( L_LONG ret_cod, /* код завершения функции LinAPI */ L_WORD con_id, /* ID соединения */ L_WORD cur_id, /* ID курсора */ L_WORD stmt_id, /* ID оператора */ L_CHAR *message) /* пользовательское сообщение */ { L_LONG lRet; L_LONG apierr =0 /* код LinAPI */ Error =0 /* код ЛИНТЕР */ Syserr =0 /* код OC */ /* ошибка получается только по одному объекту */ if(ret_cod ==LINAPI_ERROR ) /* получение кодов ошибок по требуемому объекту */ if(lRet =LINTER_Error(con_id, cur_id, stmt_id, &apierr, &error, &syserr, NULL, NULL)) printf("\n Diagnostic error: %ld",lRet); else { printf("\n ApiErr=%ld, LinErr=%ld, SysErr=%ld\n%s", apierr, error, syserr, message); if ((apierr ==eLINTERError) && error > 2000 && error < 3000) { /* получение строки и позиции при синтаксической ошибке */ printf("\n Syntax error: line %d, position %d\n", (short)syserr, *(short*)((char*)&syserr +2)); } } else printf("\n Return code = %ld", ret_cod); }