Kori 3월 30일, 2022에 포스트됨 공유하기 3월 30일, 2022에 포스트됨 Docwiki에 있는 "Handling Errors (FireDAC)"를 번역한 글: 번역일: 2022년 3월 29일) 위로 가기: [DocWiki 번역] 연결(connection)을 가지고 작업하기 (FireDAC) 데이터베이스 에러를 FireDAC에서 다루는 방법을 설명한다. 목차 1 일반 사항 (General) 2 에러 정보 (Error Information) 3 예외 핸들링하기 (Handling Exceptions) 4 최종 사용자 에러 대화창 사용하기 (Using End User Error Dialog) 5 기타 자료 (See Also) 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; TFDQuery.OnExecuteError 이벤트 핸들러를 설정하여, Array DML 고유한 에러를 다룬다. TFDQuery.OnUpdateError 이벤트 핸들러를 설정하여, 변경 전송(post) 에러를 다룬다. TFDConnection.OnLost, OnRestored, OnRecover 이벤트 핸들러를 설정하여, 연결(connection) 유실 예러를 다룬다. 4 최종 사용자 에러 대화창 사용하기 (Using End User Error Dialog) TFDGUIxErrorDialog 컴포넌트를 사용하면, 최종 사용자에게 데이터베이스에서 반환한 에러를 알려줄 수 있다. 그림. FireDAC 에러 대화창 이 대화창을 사용하려면, TFDGUIxErrorDialog 컴포넌트를 폼 위 아무곳에 놓아둔다. 처리되지 않은 FireDAC 예외가 있을 때 이 대화창은 TApplication.OnException 이벤트 핸들러를 낚아챈다. "Query" 화면에서는 해당 예외와 관련된 SQL 명령문을 볼 수 있다. Copy 버튼 (또는 Ctrl+C 키보드)을 사용하여 대화창의 전체 예외 정보를 클립보드에 복사할 수 있다. 5 기타 자료 (See Also) [DocWiki 번역] 연결을 복구하기 [DocWiki 번역] 명령(command) 실행하기 (FireDAC) FireDAC.Stan.Error Namespace TFDCustomConnection.OnError Event TFDAdaptedDataSet.OnError Event 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.