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

news2024/9/22 10:07:03

参见: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可以将完整的异常信息放入剪贴板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第十届蓝桥杯省赛——6旋转(二维数组,找规律)

题目:试题 F: 旋转时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分【问题描述】图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。我们用一个 n m 的二维数组来表示一个图片,例如下面…

什么是项目管理资格认证

项目管理资格认证是项目管理协会(PMI)在全球范围内推出的针对项目经理的资格认证体系,包括项目管理专业人士(PMP)认证、PMI敏捷管理专业人士(PMI-ACP)认证、PMI商业分析专业人士(PMI-PBA)认证、项目集管理专业人士&…

驱动器,DRV10975ZRHFR原理图DRV83055QPHPRQ1规格参数

DRV10975器件是一款具有集成功率MOSFET的三相无传感器电机驱动器,可提供高达1.5A的持续驱动电流。该器件专为成本敏感型、低噪声、低外部组件数量应用而设计。DRV10975(明佳达电子)DRV10975ZRHFR IC MTR DRV MULTPHS 6.5-18V 24QFN电机类型 -…

拿下3个大厂offer的软件测试面试宝典,面试一文搞定

我是谁、工作几年、你上家公司做什么、负责什么、你的优势、为什么适合这个职位、我想做什么、在这个职位上想得到什么 【呕心沥血】耗时7天整理的金三银四必看的软件测试频面试题 涵盖 接口自动化测试框架面试题_哔哩哔哩_bilibili【呕心沥血】耗时7天整理的金三银四必看的软…

day26 员工薪水中位数

569. 员工薪水中位数 写一个SQL查询,找出每个公司的工资中位数。 以 任意顺序 返回结果表。 查询结果格式如下所示。 SQL:方法一 select id, company, salary from (selectid, company, salary,row_number() over(partition by company order by s…

aws batch 理解batch中的任务调度策略

参考资料 https://docs.amazonaws.cn/en_us/batch/latest/userguide/job_queue_parameters.html#job_queue_scheduling_policy https://docs.amazonaws.cn/en_us/batch/latest/userguide/scheduling-policies.html https://catalog.us-east-1.prod.workshops.aws/workshops/c…

【Python实战】快看:”又中奖了,中大奖了“周围的小伙伴都惊呆了~你还不麻溜滴~(代码版彩票小游戏上线啦)

导语 哈喽!北鼻们,晚上好。 夕阳🌇的第一缕阳光送给小可爱们~每天都要加油鸭! 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 彩票是一个恒古不…

206页16万字城市运行“一网统管”体系建设项目需求报告

本资料来源网络,知识分享,仅供个人学习,请勿商用。完整资料领取见文末,部分资料内容: 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…

文科生比不过理科生,转码IT互联网将成趋势?

今天看到“文科生转码或成趋势”的话题,觉得还是非常有意思哈,所以来聊聊看~ 值得一提的是,虽然现在高中考试改制后,已不再区分文理科生(理化生史地政6选3),但是大学本科及研究生以上&#xff…

最小基因变化

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如,"AACCGGTT" -->…

设计模式-工作线程 创建多少线程池合适

1、定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式(重用对象)。 例如,海底捞的服务员(线程),轮流…

“数字档案室测评”相关参考依据梳理

数字档案室建设无疑比数字档案馆建设应用范围更为广泛,涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪: 国家档案局两个内设业务指导司中,档案馆(室)业务指导司主要针对档案馆和机关档案室,而经济…

【Linux】磁盘结构、文件系统、软硬链接、动静态库链接

文章目录1、磁盘结构1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构2、文件系统2.1 4KB加载到内存2.2 文件系统结构3、软硬链接3.1 软链接3.2 硬链接4、动静态库4.1 什么是库?4.2 静态库和静态库链接4.3 动态库和动态库链接4.4 动静态库的加载下面了解到&…

python GUI图形化编程-----wxpython

一、python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是pyth…

Qt界面美化之自定义qss样式表

原生的QT界面不好看,有时候需要根据美工的设计图修改样式。如果使用QML的话搞界面是快,但是QML有点儿吃内存,有时简单的功能还是用传统c的widget方便些。好在有qss,传统界面也可以美化的。QSS称为Qt Style Sheets也就是Qt样式表&a…

项目设计模式和规范

1、责任链模式 自己的理解:避免发生方与接收方解耦 优点:①降低发送方与接收方的耦合 ②简化他们对象 ③方便扩展新增 处理者 缺点:①不方便排错 ②性能问题,且使用不当容易搞出死循环 应用场景:拦截器 Interceptor和过滤器 filter:符合模式的进行拦截或者过滤到,然…

华为云服务器安全注意事项

使用华为云服务器搭建集群的时候不能像我们平时使用虚拟机克隆那样随意(我指的是后期使用),要留意安全问题,防止被病毒攻击 注意事项: 1.root用户和创建的普通用户密码要设置复杂一些,不能123456或者00000…

腾讯云服务器租用报价表新鲜出炉(轻量和CVM价格)

腾讯云服务器分为轻量应用服务器和云服务器CVM,CVM为专业级云服务器,适用于企业级如科学计算、集群应用、高容灾等使用场景;轻量应用服务器适用于个人博客简单的Web应用或测试环境使用。 腾讯云服务器租用价格表2023新版报价出炉&#xff0c…

页面状态码的含义

使用互联网产品或服务的过程中,会遇到网页报错的情况, 比如404、505等,具体这些数字有什么含义呢?本文基本涵盖了99%的报错情况,可供大家查询使用。 状态码的定义 状态码一般是由3位数字和原因短语组成的&#xff08…

10 种顶流聚类算法 Python 实现(附完整代码)

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。 有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每…