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返回的这个计数,所以就出现了你看到的结果。
如果想要获取实际插入的行数,有两种可行的方式:
- 执行完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; - 开启FireDAC的
UpdateOptions.CountUpdatedRecords属性,不过这个属性对部分数据库和语句类型的支持有限,对于Firebird的INSERT...SELECT,更可靠的还是用ROW_COUNT()的方式。
内容的提问来源于stack exchange,提问作者Dżyszla
相关产品推荐
相关产品推荐

