繁体   English   中英

Firedac TFDquery.RowsAffected - 当应该返回 0 时返回 1

[英]Firedac TFDquery.RowsAffected - returns 1 when should return 0

我有一个带有唯一字段“addr”的表“EMAIL”。 当我从 mysql 控制台(通过 Putty)进行查询时,它返回 ' 0 rows affected ' (因为 'id' 实际上并没有改变),但 FIREDAC 总是返回rowsAffected=1 (如果有更多字段,则返回 2 或 3)。 为什么会这样,我该如何解决?

+----+-------+------+------+
| id | owner | addr | pass |
+----+-------+------+------+
|  1 |  NULL | test | NULL |
+----+-------+------+------+
mysql> update EMAIL set id=last_insert_id(id);
Query OK, 0 rows affected (0.00 sec)                        // 0 affected!
Rows matched: 1  Changed: 0  Warnings: 0

FIREDAC (FDconnection + FDquery)

procedure test;
var conn:TFDCONNECTION;
    query:TFDQUERY;
begin;

conn:=TFDCONNECTION.Create(nil);
query:=TFDQUERY.Create(nil);
query.Connection:=conn;

conn.Params.Add('DriverID=MySQL');
conn.Params.Add('CharacterSet=utf8');
conn.Params.Add('Server=192.168.56.11'); //ubuntu server, v 14.14 5.7.30
conn.Params.Add('User_Name=root');
conn.Params.Add('Password=mypass');
conn.Params.Add('Database=MYDB');
conn.Params.Add('Port=3306');

query.SQL.Text:='update EMAIL set id=last_insert_id(id)';
query.ExecSQL;

//never shows '0', always thinks all the rows have been updated!
showmessage(inttostr( query.RowsAffected ));

query.Close;

conn.Free;
query.Free;
end;

[已解决。] 我编辑了“FireDAC.Phys,MySQL”的源代码,第 471 行,注释掉了“CLIENT_FOUND_ROWS”标志(感谢@Olivier)

对于 MySQL 数据库,在UPDATE查询的情况下,受影响的行数(由mysql_affected_rows()返回)取决于CLIENT_FOUND_ROWS标志。

如果禁用该标志,则仅考虑实际修改的记录。

如果启用该标志,则考虑所有已处理的记录(无论它们是否被修改)。

默认情况下, CLIENT_FOUND_ROWS被禁用,但 FireDAC 在调用mysql_real_connect()时启用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM