Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 에러 핸들링하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Handling Errors (FireDAC)"를 번역한 글: 번역일: 2022년 3월 29일)

위로 가기: [DocWiki 번역] 연결(connection)을 가지고 작업하기 (FireDAC)

데이터베이스 에러를 FireDAC에서 다루는 방법을 설명한다.

목차


1 일반 사항 (General)

EFDDBEngineException 클래스는 모든 DBMS 예외를 담는 기반 클래스이다. 데이터베이스 에러들을 모아놓은 컬렉션인 EFDDBEngineException.Errors[] 프로퍼티를 통해 접근할 수 있고  TFDDBError 클래스를 통해 표현된다.

FireDAC에는 EFDDBEngineException 예외와 TFDDBError 에러 클래스가 "personalization(개인화)"되고 unification(통일)되어 있다.  "personalization(개인화)"란 각 드라이버마다 해당 DBMS에 고유한 정보를 담는 고유한 예외 클래스와 에러 클래스가 있다는 의미이다.

 

DBMS 예외(Exception) 클래스 에러(Error) 클래스
Advantage Database FireDAC.Phys.ADSWrapper.EADSNativeException FireDAC.Stan.Error.TFDDBError
DataSnap server FireDAC.Phys.TDBXBase.ETDBXNativeException FireDAC.Stan.Error.TFDDBError
dbExpress v4 FireDAC.Phys.TDBXBase.ETDBXNativeException FireDAC.Stan.Error.TFDDBError
Firebird FireDAC.Phys.IBWrapper.EIBNativeException FireDAC.Phys.IBWrapper.TFDIBError
IBM DB2 FireDAC.Phys.DB2.EDB2NativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Informix FireDAC.Phys.Infx.EInfxNativeException FireDAC.Phys.Infx.TFDInfxError
InterBase FireDAC.Phys.IBWrapper.EIBNativeException FireDAC.Phys.IBWrapper.TFDIBError
Microsoft Access FireDAC.Phys.MSAcc.EMSAccessNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Microsoft SQL Server FireDAC.Phys.MSSQL.EMSSQLNativeException FireDAC.Phys.MSSQL.TFDMSSQLError
MySQL FireDAC.Phys.MySQLWrapper.EMySQLNativeException FireDAC.Phys.MySQLWrapper.TFDMySQLError
ODBC FireDAC.Phys.ODBCWrapper.EODBCNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Oracle FireDAC.Phys.OracleWrapper.EOCINativeException FireDAC.Phys.OracleWrapper.TOCIError
PostgreSQL FireDAC.Phys.PGWrapper.EPgNativeException FireDAC.Phys.PGWrapper.TFDPgError
SQLite FireDAC.Phys.SQLiteWrapper.ESQLiteNativeException FireDAC.Stan.Error.TFDDBError
Sybase SQL Anywhere FireDAC.Phys.ASAWrapper.EASANativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError
Teradata Database FireDAC.Phys.TData.ETDataNativeException FireDAC.Phys.ODBCWrapper.TFDODBCNativeError

TFDDBError에는 ErrorCode 프로퍼티가 있다. 여기에는 DBMS의 네이티브 에러 코드가 들어있다.

"Unification(통일)"이란 드라이버의 예외(exception) 클래스들은 모두 EFDDBEngineException로부터 상속받는다는 의미이다. 이 유일한 기반 클래스인 EFDDBEngineException에는 어느 드라이버에도 종속되지 않는 독립적인 정보가 담긴다. Kind 프로퍼티는 DBMS에 종속되지 않는 에러 코드이다. 예를 들어, 고유 키 위반을 다루는 코드는 다음과 같다. 

try
  FDQuery1.ExecSQL('insert into MyTab(code, name) values (:code, :name)', [100, 'Tokyo']);
except
  on E: EFDDBEngineException do begin
    if E.Kind = ekUKViolated then
      ShowMessage('Please enter unique value !');
    raise;
  end;
end;

 

2 에러 정보 (Error Information)

에러 정보는 주로 EFDDBEngineException 클래스의 프로퍼티에 있다.

  • Errors: TFDDBError 오브젝트가 들어있는 컬렉션.
  • ErrorCount: Errors 컬렉션에 있는 에러의 갯수.
  • Kind: DBMS에 종속되지 않은 에러 종류.
  • Message: 실제 에러 메시지.

TFDDBError 클래스의 프로퍼티에도 있다.

  • ErrorCode: DBMS 제조사 고유 예러 코드.
  • Kind: DBMS에 종속되지 않은 에러 종류.
  • Message: 에러 메시지.

애플리케이션 디버깅을 단순하게 하고, 보다 충분한 정보를 예외 로그에 기록할 수 있도록 EFDDBEngineException에는 SQL 프로퍼티와 Params 프로퍼티가 있다.

또한, 아래의 TFDDBError 클래스의 프로퍼티에서는 에러 영역과 DBMS에서 제공하는 고급 에러 정보에서 얻을 수 있어서 매우 유용하다.

  • SQL 파싱(parsing, 구문 분석) 에러와 관련된 경우: CommandTextOffset은 SQL 명령문 안의 시작 지점(offset)을 반환한다.
  • 제약 조건 위반, DB 오브젝트 변경(alter) 실패, 기타 몇몇 에러들이 관련된 경우: ObjName 프로퍼티는 데이터베이스 오브젝트 이름을 반환한다.
  • Array DML 에러와 관련된 경우: RowIndex는 해당 에러에 연결된 행이  배열 안에서 어디에 있는 지 그 인덱스(index)를 반환한다.

 

3 예외 핸들링하기 (Handling Exceptions)

예외를 처리할 때는 다음 방법 중 하나를 사용한다.

  • try/except/end 구조 사용하기. 델파이에서 예외를 다루는 표준 방식이다.  예를 들면:
FDConnection1.StartsTransaction;
try
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  on E: EFDDBEngineException do begin
    FDConnection1.Rollback;
    // 여기에서 처리한다
    raise;
  end;
end;

 

  • TFDQuery.OnError 이벤트 핸들러 설정하기.
  • TFDConnection.OnError 이벤트 핸들러 설정하기. 예외 로그 남기기 또는 예외 "조정하기"에 좋은 방식이다. 예를 들면,
procedure TForm1.FDConnection1Error(ASender: TObject; const AInitiator: IFDStanObject;
  var AException: Exception);
var
  oExc: EFDDBEngineException;
begin
  if AException is EFDDBEngineException then begin
    oExc := EFDDBEngineException(AException);
    if oExc.Kind = ekRecordLocked then
      oExc.Message := '잠시 후 다시 시도하십시오. 이 레코드는 현재 사용 중입니다.'
    else if (oExc.Kind = ekUKViolated) and SameText(oExc[0].ObjName, 'UniqueKey_Orders') then
      oExc.Message := '고유한 주문 정보를 제공하십시오. 귀하의 주문은 이미 들어 있는 것으로 보입니다';
  end;
end;

FDConnection1.OnError := FDConnection1Error;

 

4 최종 사용자 에러 대화창 사용하기 (Using End User Error Dialog)

TFDGUIxErrorDialog 컴포넌트를 사용하면, 최종 사용자에게 데이터베이스에서 반환한 에러를 알려줄 수 있다.

FireDACErrorPicture.png
그림. FireDAC 에러 대화창

이 대화창을 사용하려면, TFDGUIxErrorDialog 컴포넌트를 폼 위 아무곳에 놓아둔다. 처리되지 않은 FireDAC 예외가 있을 때 이 대화창은 TApplication.OnException 이벤트 핸들러를 낚아챈다. "Query" 화면에서는 해당 예외와 관련된 SQL 명령문을 볼 수 있다. Copy 버튼 (또는 Ctrl+C 키보드)을 사용하여 대화창의 전체 예외 정보를 클립보드에 복사할 수 있다.

 

5 기타 자료 (See Also)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.