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

本文介绍了FireDAC在处理数据库错误时的机制,包括EFDDBEngineException异常类和TFDDBError错误类的使用,以及如何通过try/except结构、OnError事件处理程序来管理异常。此外,还提到了终端用户错误对话框TFDGUIxErrorDialog在显示数据库错误信息中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参见: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的错误代码。例如,处理唯一键违例的代码可能如下:

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;
二、错误信息
  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;
try
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  on E: EFDDBEngineException do begin
    FDConnection1.Rollback;
    // do something here
    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 := 'Please, try the operation later. At moment, the record is busy'
    else if (oExc.Kind = ekUKViolated) and SameText(oExc[0].ObjName, 'UniqueKey_Orders') then
      oExc.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可以将完整的异常信息放入剪贴板。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值