You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireDAC中TFDQuery执行INSERT INTO SELECT时RowsAffected为何始终≥1?

FireDAC操作Firebird时INSERT...SELECT无匹配行却返回RowsAffected=1的原因

这种情况是Firebird数据库本身的特性导致的,和FireDAC的直接关联不大:

  • Firebird对于INSERT ... SELECT这类语句,返回的“受影响行数”逻辑和普通单条INSERT不同。即使SELECT子句没有匹配到任何数据、最终没有插入任何记录,Firebird仍然会返回1作为操作计数,它表示这条SQL语句成功执行,而非实际插入的行数。
  • FireDAC的RowsAffected属性只是直接获取Firebird返回的这个计数,所以就出现了你看到的结果。

如果想要获取实际插入的行数,有两种可行的方式:

  1. 执行完INSERT语句后,单独执行一条SELECT ROW_COUNT()语句来获取真实的插入行数,Firebird的ROW_COUNT()函数会返回最近一次DML操作实际影响的行数。
    示例代码:
    with TFDQuery.Create do
        try
            SQL.Text := 'INSERT INTO t(c1) SELECT c2 FROM t2 WHERE c2 = 0';
            ExecSQL;
            // 获取实际插入行数
            SQL.Text := 'SELECT ROW_COUNT()';
            Open;
            WriteLn(FieldByName('ROW_COUNT').AsInteger);
        finally
            Free;
        end;
    
  2. 开启FireDAC的UpdateOptions.CountUpdatedRecords属性,不过这个属性对部分数据库和语句类型的支持有限,对于Firebird的INSERT...SELECT,更可靠的还是用ROW_COUNT()的方式。

内容的提问来源于stack exchange,提问作者Dżyszla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:33:10