当前位置: 首页 > news >正文

Delphi 中 FireDAC 数据库连接(处理错误)

参见:Delphi 中 FireDAC 数据库连接(总览)

本主题描述了如何用FireDAC处理数据库错误。

一、概述

EFDDBEngineException类是所有DBMS异常的基类。单个异常对象是一个数据库错误的集合,可以通过EFDDBEngineException.Errors[]属性访问,并由TFDDBError类表示。

FireDAC结合了 "个性化 "和EFDDBEngineException异常和TFDDBError错误类的统一。"个性化 "意味着一个驱动程序可以有自己的异常和错误类,其中包含DBMS的特定信息。

DBMS

Exception class

Error class

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)"意味着所有的驱动程序异常类都继承自EFDDBEngineException--一个单一的基类,包含独立于驱动程序的信息。它的Kind属性是一个独立于DBMS的错误代码。例如,处理唯一键违例的代码可能如下:

tryFDQuery1.ExecSQL('insert into MyTab(code, name) values (:code, :name)', [100, 'Tokyo']);
excepton E: EFDDBEngineException do beginif E.Kind = ekUKViolated thenShowMessage('Please enter unique value !');raise;end;
end;

二、错误信息

  1. 错误信息主要由EFDDBEngineException属性呈现。

  • Errors -- TFDDBError对象的集合。

  • ErrorCount -- Errors集合中的错误数量。

  • Kind -- 独立于DBMS的错误种类。

  • Message -- 实际的错误信息。

  1. 并由TFDDBError属性。

  • ErrorCode -- DBMS供应商特定的错误代码。

  • Kind -- DBMS独立的错误种类。

  • Message -- 错误信息。

为了简化应用程序的调试或使异常记录的信息量更大,EFDDBEngineException提供了SQL和Params属性。

另外,根据错误区域和DBMS提供高级错误信息的能力,以下的TFDDBError属性是有用的。

  • 当涉及到SQL解析错误时,CommandTextOffset返回SQL命令文本中的偏移。

  • 当涉及到违反约束条件、DB对象更改失败或其他一些错误时,ObjName属性会返回一个数据库对象的名称。

  • 当涉及到一个数组DML错误时,那么RowIndex返回错误所属的数组行索引。

三、处理异常情况

  1. 异常可以通过以下方式之一进行处理。

  • 使用try/except/end结构。这是一种标准的Delphi处理异常的方式。比如说:

FDConnection1.StartsTransaction;
tryFDQuery1.ExecSQL;FDConnection1.Commit;
excepton E: EFDDBEngineException do beginFDConnection1.Rollback;// do something hereraise;end;
end;
  • 设置TFDQuery.OnError事件处理程序。

  • 设置TFDConnection.OnError事件处理程序。这些都是处理异常记录或异常 "调整 "的好方法。比如说:

procedure TForm1.FDConnection1Error(ASender: TObject; const AInitiator: IFDStanObject;var AException: Exception);
varoExc: EFDDBEngineException;
beginif AException is EFDDBEngineException then beginoExc := EFDDBEngineException(AException);if oExc.Kind = ekRecordLocked thenoExc.Message := 'Please, try the operation later. At moment, the record is busy'else if (oExc.Kind = ekUKViolated) and SameText(oExc[0].ObjName, 'UniqueKey_Orders') thenoExc.Message := 'Please, provide the unique order information. It seems, your order was already put';end;
end;FDConnection1.OnError := FDConnection1Error;
  • 设置TFDQuery.OnExecuteError事件处理程序,用于处理Array DML的具体错误。

  • 设置TFDQuery.OnUpdateError事件处理程序,用于处理更新发布的错误。

  • 设置TFDConnection.OnLost, OnRestored, OnRecover事件处理程序,用于处理连接丢失的错误。

四、使用终端用户错误对话框

在TFDGUIxErrorDialog组件的帮助下,终端用户可以得到关于数据库返回错误的通知。

要使用该对话框,只需将该组件放在表单的某个地方。对话框钩住TApplication.OnException事件处理程序,当有一个未处理的FireDAC异常时,就会弹出对话框。在 "查询 "页面,你可以看到由异常产生的SQL命令文本。在对话框中按下Ctrl+C可以将完整的异常信息放入剪贴板。

http://www.lryc.cn/news/26458.html

相关文章:

  • 算法小抄3-理解使用Python容器之列表
  • Vue3中watch的value问题
  • 【线性筛+DP】最大和
  • openpnp - configure - 丢弃(Discard)位置的设置
  • java Object 万字详解 (通俗易懂)
  • Java并发简介(什么是并发)
  • 团队API管理工具-YAPI
  • 学习记录 --- Pytorch优化器
  • Flink State 状态后端分析
  • 和年薪30W的阿里测开工程师聊过后,才知道我的工作就是打杂的...
  • C#开发的OpenRA的界面布局数据加载
  • 并查集结构
  • 全国CSM敏捷教练认证将于2023年3月25-26开班,报名从速!
  • JavaEE进阶第六课:SpringBoot ⽇志⽂件
  • 外置MOS管平均电流型LED降压恒流驱动器
  • python+pytest接口自动化(6)-请求参数格式的确定
  • 开发手册——一、编程规约_3.代码格式
  • 十七、Django-restframework之序列化器(二)
  • python GUI图形化编程-----wxpython
  • 【Python 】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细
  • 【C++】C++11 异常
  • 关于Thread.start()后的困惑、imap
  • qml学习之qwidget与qml结合使用并调用信号槽交互
  • 【 华为OD机试 2023】 组装新的数组(C++ Java JavaScript Python)
  • 【洛谷 P2089】烤鸡(循环枚举)
  • windows10安装ubantu双系统
  • 【华为OD机试 2023】 人数最多的站点/小火车最多人时所在园区站点(C++ Java JavaScript Python)
  • 2024届暑期实习实录(阿里云大数据研发平台)
  • 空口协议probe req和probe rsp 、auth req和auth rsp 、assoc req和assoc rsp讲解
  • vscode ssh一直卡在wget的解决方案