FAQ - Вопросы - ответы - советы - Базы данных
Вопрос:
Делаем APPLYUPDATES. Если при INSERT(UPDATE) произошла ошибка (поле NULL, сработал CHECK, ETC), то BDE всегда говорит "GENERAL SQL ERROR" вместо нормального сообщения об ошибке :-( Без CU все нормально, разумеется. Как бороть этот баг?
Ответ:
Используй нормальную трансляцию ошибок в APPLICATION.ONEXCEPTION. Вроде это.
PROCEDURE DBEXCEPTIONTRANSLATE(E: EDBENGINEERROR);
FUNCTION ORIGINALMESSAGE: STRING;
VAR
I: INTEGER;
DBERR: TDBERROR;
S: STRING;
BEGIN
RESULT := '';
FOR I := 0 TO E.ERRORCOUNT - 1 DO
BEGIN
DBERR := E.ERRORS[I];
CASE DBERR.NATIVEERROR OF
-836: { INTEBASE EXCEPTION }
BEGIN
S := DBERR.MESSAGE;
RESULT := #13#10 + COPY(S, POS(#10, S) + 1, LENGTH(S));
EXIT;
END;
END;
S := TRIM(DBERR.MESSAGE);
IF S '' THEN RESULT := RESULT + #13#10 + S;
END;
END;
BEGIN
CASE E.ERRORS[0].ERRORCODE OF
$2204:
E.MESSAGE := LOADSTR(SKEYDELETED);
$271E,$2734:
E.MESSAGE := LOADSTR(SINVALIDUSERNAME);
$2815:
E.MESSAGE := LOADSTR(SDEADLOCK);
$2601:
E.MESSAGE := LOADSTR(SKEYVIOL);
$2604:
E.MESSAGE := LOADSTR(SFKVIOLATION) + ORIGINALMESSAGE;
ELSE BEGIN
E.MESSAGE := FORMAT(LOADSTR(SERRORCODEFMT),
[E.ERRORS[0].ERRORCODE]) + ORIGINALMESSAGE;
END;
END;
END;
