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…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
