[英]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.