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;