Delphi 10.3中使用FireDAC组件捕获Firebird错误码的方法
FireDAC 对接 Firebird 时捕获指定错误码的实现方法
你在 Delphi 10.3 + FireDAC 环境下可以按以下方式实现和 FIBPlus 完全等效的错误拦截逻辑:
- FireDAC 中所有数据库引擎抛出的原生错误统一封装为
EFDDBEngineException类,对应你之前使用的EFIBError,Firebird 返回的原生GDS错误码(就是你代码里用的335544347这类数值)存放在该类的Errors错误集合中。 - 注意不要直接读取
EFDDBEngineException顶层的ErrorCode属性,该值是FireDAC自身定义的通用错误码,不是Firebird原生错误码,必须遍历Errors集合下每个TFDError对象的ErrorCode,才能拿到和FIBPlus中IBErrorCode完全一致的原生错误码。
1. 直接在try...except块中捕获(和原有FIBPlus写法逻辑最接近)
首先在代码单元引用部分加入必要单元:
uses FireDAC.Stan.Error, FireDAC.Phys.FB;
错误拦截代码写法如下:
try // 此处写你的FireDAC数据库操作代码,比如执行SQL、打开数据集等 FDQuery1.ExecSQL; except on E: EFDDBEngineException do begin var i: Integer; for i := 0 to E.ErrorCount - 1 do begin case E.Errors[i].ErrorCode of // 匹配Firebird原生错误码,和FIBPlus的IBErrorCode取值完全一致 335544347: begin scMessageDlg('Field NAME is Null', mtError, [mbOk], 0); Break; end; // 其余错误码分支可按需求继续扩展 end; end; // 等效原有daAbort逻辑,终止流程且不弹出默认错误提示 Abort; end; end;
如果不想硬编码数字错误码,可以直接用FireDAC封装好的Firebird错误常量,命名规则和原生InterBase/Firebird常量完全一致,比如335544347对应的常量就是isc_not_null,直接替换数字即可,代码可读性更高。
2. 用组件OnError事件全局拦截(无需重复写try...except)
你可以直接给TFDConnection、TFDQuery等FireDAC组件绑定OnError事件,在事件里统一处理错误,不需要在每个数据库操作位置写异常捕获:
procedure TForm1.FDConnection1Error(ASender: TObject; const AInitiator: IFDStanObject; AError: Exception; var AAction: TFDErrorAction); var i: Integer; oFDErr: EFDDBEngineException; begin if not (AError is EFDDBEngineException) then Exit; oFDErr := EFDDBEngineException(AError); for i := 0 to oFDErr.ErrorCount - 1 do begin case oFDErr.Errors[i].ErrorCode of 335544347: begin scMessageDlg('Field NAME is Null', mtError, [mbOk], 0); // 设置为eaAbort即等效原有daAbort,拦截默认错误提示弹出 AAction := eaAbort; Break; end; end; end; end;
如果需要获取错误的原始描述文本,直接读取TFDError.Message属性即可,和FIBPlus的错误消息取值完全一致。
内容的提问来源于stack exchange,提问作者user2683734
相关产品推荐
相关产品推荐

