FireDAC][Phys][ODBC][SQLSRV32.DLL] SQL_NO_DATA FDquery

根据你的描述,出现 SQL_NO_DATA 错误通常是因为应用程序试图删除一条数据库里已经不存在的记录,但这个操作本身并不一定是程序错误。

🔍 问题原因分析

综合搜索结果和常见的FireDAC应用场景,这个错误通常发生在以下情况:

  • 数据已被删除 :最常见的原因是,你的应用程序正尝试使用 ApplyUpdates 等提交一个缓存起来的删除操作,但目标记录在此期间已经被其他用户或进程从数据库中删除了。FireDAC执行删除语句后,发现没有影响任何行(即"没有数据被删除"),就会触发这个错误-1

  • 触发器或存储过程干扰 :当对表执行操作(尤其是插入操作)时,如果该表上存在触发器,并且触发器内部进行了其他数据操作,也可能导致驱动程序返回 SQL_NO_DATA 状态-5

  • ODBC驱动程序处理机制 :从底层的ODBC机制来看,SQL_NO_DATA 也是一个标准返回码,表示"没有可用信息",在遍历完所有结果集或执行某些操作未影响数据行时可能出现-9

🛠️ 解决方法

针对"删除不存在记录"这个主要情况,你可以通过以下几种方式来处理这个异常:

1. 忽略无害的删除错误

这是最直接的方案。你可以在 TFDQueryOnUpdateError 事件中捕获错误,并判断如果是删除操作未找到记录,则手动标记该错误已处理。

pascal

复制

下载

复制代码
procedure TForm1.FDQuery1UpdateError(ASender: TDataSet; AException: EFDException;
  ARow: TFDDatSRow; ARequest: TFDUpdateRequest; var AAction: TFDErrorAction);
begin
  // 判断是否为删除操作且错误是SQL_NO_DATA
  if (ARequest = arDelete) and (AException is EFDDBEngineException) then
  begin
    // 你可以在这里检查更具体的错误代码,但通常针对这种情况直接忽略是安全的
    AAction := eaApplied; // 告知FireDAC此错误已处理,更新成功
  end;
end;

代码逻辑参考自Stack Overflow上的讨论-1

2. 调整FireDAC的更新选项

设置 TFDQuery.UpdateOptions.CountUpdatedRecords 属性为 False。这可以阻止FireDAC去严格检查每次更新操作所影响的行数,从而可能避免此错误-5。但请注意,这可能会掩盖其他本应被发现的更新问题。

3. 在数据库层面设置(如果因触发器引起)

如果错误是由于表上的 插入或更新触发器 引起的,另一个方案是修改触发器,在其开头添加 SET NOCOUNT ON; 语句。这会阻止SQL Server返回受影响的行数信息,从而避免FireDAC产生混淆-5

sql

复制

下载

复制代码
CREATE TRIGGER YourTriggerName
ON YourTableName
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON; -- 添加这行
    -- ... 触发器其他逻辑
END

💡 如何选择方案

  • 如果你的应用场景是多用户并发操作,数据可能被他人提前删除 ,推荐使用 方法1。它精准地处理了特定情况,不影响其他错误的正常报告。

  • 如果经过排查,确认错误只发生在特定有触发器的表 上,可以考虑 方法3

  • 方法2 作为一种通用设置,可能会带来副作用,建议在明确影响范围后谨慎使用。

如果需要进一步分析,可以告诉我你执行删除操作的具体代码逻辑,这有助于判断问题是否由其他原因引起。

相关推荐
浅念-1 小时前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql
updayday8541 小时前
离职域账号状态变更与Ping64操作记录核对
大数据·网络·数据库·安全·智能路由器
Nturmoils2 小时前
只恢复一张表,别把整个库都还回去
数据库
龙腾AI白云2 小时前
大语言模型:从语言理解到通用智能的跃迁
数据库·人工智能·机器学习·知识图谱
SelectDB3 小时前
快手基于 Apache Doris 千亿多模态检索的实践
大数据·数据库·数据分析
SelectDB3 小时前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
大数据·数据库·数据分析
这个DBA有点耶3 小时前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比
数据库·mysql·架构
其实防守也摸鱼3 小时前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
TDengine (老段)4 小时前
TDengine 常见问题 TOP7
大数据·数据库·时序数据库·常见问题·tdengine·涛思数据
+VX:Fegn08954 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计