Получение кодов завершения – 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);
}