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;
二、错误信息
错误信息主要由EFDDBEngineException属性呈现。
Errors -- TFDDBError对象的集合。
ErrorCount -- Errors集合中的错误数量。
Kind -- 独立于DBMS的错误种类。
Message -- 实际的错误信息。
并由TFDDBError属性。
ErrorCode -- DBMS供应商特定的错误代码。
Kind -- DBMS独立的错误种类。
Message -- 错误信息。
为了简化应用程序的调试或使异常记录的信息量更大,EFDDBEngineException提供了SQL和Params属性。
另外,根据错误区域和DBMS提供高级错误信息的能力,以下的TFDDBError属性是有用的。
当涉及到SQL解析错误时,CommandTextOffset返回SQL命令文本中的偏移。
当涉及到违反约束条件、DB对象更改失败或其他一些错误时,ObjName属性会返回一个数据库对象的名称。
当涉及到一个数组DML错误时,那么RowIndex返回错误所属的数组行索引。
三、处理异常情况
异常可以通过以下方式之一进行处理。
使用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可以将完整的异常信息放入剪贴板。
相关文章:

Delphi 中 FireDAC 数据库连接(处理错误)
参见:Delphi 中 FireDAC 数据库连接(总览)本主题描述了如何用FireDAC处理数据库错误。一、概述EFDDBEngineException类是所有DBMS异常的基类。单个异常对象是一个数据库错误的集合,可以通过EFDDBEngineException.Errors[]属性访问…...

算法小抄3-理解使用Python容器之列表
引言 首先说一个概念哈,程序算法数据结构,算法是条件语句与循环语句组成的逻辑结构,而数据结构也就是容器. 算法决定数据该如何处理,而容器则决定如何数据如何存储. 不同的语言对容器有不同的实现方式, 但他们的功能都是相似的, 打好容器基础,你就可以在各式各样的语言中来回横…...

Vue3中watch的value问题
目录前言一,ref和reactive的简单复习1.ref函数1.2 reactive函数1.3 用ref定义对象类型数据不用reactive二,watch的value问题2.1 ref2.1.1 普通类型数据2.1.2 对象类型数据2.1.3 另一种方式2.2 reactive三,总结后记前言 在Vue3中,…...

【线性筛+DP】最大和
看错题了,呃呃,其实就是个简单DP最大和 - 蓝桥云课 (lanqiao.cn)题意:思路:设dp[i]为以1为终点的最大和,然后枚举状态和决策就行了主要是线性筛的应用,它可以预处理出一个数的最小质因子是多少Code…...

openpnp - configure - 丢弃(Discard)位置的设置
文章目录openpnp - configure - 丢弃(Discard)位置的设置概述笔记设置丢弃位置吸取元件失败后, 吸嘴一直吸气的处理ENDopenpnp - configure - 丢弃(Discard)位置的设置 概述 测试时, 吸取了一个元件, 吸取成功了, 现在想将这个料丢掉. 点击控制面板-Special页中的Discard不好…...

java Object 万字详解 (通俗易懂)
基本介绍构造方法成员方法hashCode()getClass()toString()equals()finalize()JavaBean重写Object类的方法重写toString重写equals一、基本介绍Object类是java类层次最顶层的基类(父类),所有类都是直接或间接继承自Object类,因此&a…...

Java并发简介(什么是并发)
文章目录并发概念并发和并行同步和异步阻塞和非阻塞进程和线程竞态条件和临界区管程并发的特点提升资源利用率程序响应更快并发的问题安全性问题缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题保证并发安全的思路互斥同步(阻塞同步…...

团队API管理工具-YAPI
团队API管理工具-YAPI 推荐一款接口管理平台,操作简单、界面友好、功能丰富、支持markdown语法、可使用Postman导入、Swagger同步数据展示、LDAP、权限管理等功能。 YApi是高效、易用、功能强大的api管理平台,旨在为开发、产品、测试人员提供更优雅的接…...

学习记录 --- Pytorch优化器
文章目录参考文献什么是优化器optimizer的定义optimizer的属性defaultsstateparam_groupsoptimizer的方法zero_grad()step()add_param_group()state_dict()、load_state_dict()优化一个网络同时优化多个网络当成一个网络优化当成多个网络优化只优化网络的某些指定的层调整学习率…...
Flink State 状态后端分析
flink状态实现分析 state * State* |* -------------------InternalKvState* | |* MergingState |* | |* …...

和年薪30W的阿里测开工程师聊过后,才知道我的工作就是打杂的...
前几天和一个朋友聊面试,他说上个月同时拿到了腾讯和阿里的offer,最后选择了阿里。 阿里内部将员工一共分为了14个等级,P6是资深工程师,P7是技术专家。 其中P6和P7就是一个分水岭了,P6是最接近P7的不持股员工&#x…...
C#开发的OpenRA的界面布局数据加载
C#开发的OpenRA的界面布局数据加载 当显示完成加载界面之后,就是进行其它内容处理。 因为后面内容的加载会比较长时间,所以首先显示加载界面是一种非常友好的方法。 因此在软件设计里,尽可能先显示界面,让用户先看到程序正在运行, 然后再处理时间长的加载。如果不这样做,…...

并查集结构
文章目录并查集特点构建过程查找两个元素是否是同一集合优化查找领头元素设置两个元素为同一集合构建结构应用场景并行计算集合问题并查集特点 对于使用并查集构建的结构,可以使得查询两个元素是否在同一集合,以及合并集合的操作无限接近O(1) 构建过程…...

全国CSM敏捷教练认证将于2023年3月25-26开班,报名从速!
CSM,即Certified Scrum Master,是Scrum联盟发起的Scrum认证。 CSM可以帮助团队正确使用Scrum,从而提高项目整体成功的可能性。 CSM深刻理解Scrum的价值观、实践以及Scrum框架。 CSM是“服务型领导”,帮助Scrum团队一起紧密合作。 …...

JavaEE进阶第六课:SpringBoot ⽇志⽂件
上篇文章介绍了SpringBoot配置文件,这篇文章我们将会介绍SpringBoot ⽇志⽂件 荔枝1.日志有什么用2.自定义日志输出2.1获取程序日志对象2.2使用相关方法输出日志2.3日志级别2.3.1日志级别的作用2.3.2日志级别如何设置2.4日志格式3.持久化日志4.更简单的日志输出4.1使…...
外置MOS管平均电流型LED降压恒流驱动器
产品描述 AP5125 是一款外围电路简单的 Buck 型平均电 流检测模式的 LED 恒流驱动器,适用于 8-100V 电压 范围的非隔离式大功率恒流 LED 驱动领域。芯片采用 固定频率 140kHz 的 PWM 工作模式, 利用平均电 流检测模式,因此具有优异的负载调整…...

python+pytest接口自动化(6)-请求参数格式的确定
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…...

开发手册——一、编程规约_3.代码格式
这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码…...
十七、Django-restframework之序列化器(二)
1. 序列化器 REST framework提供了一个serializer类,它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化,允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器 在crm应用目录下创建serializers.py文件&a…...

python GUI图形化编程-----wxpython
一、python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是pyth…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...