Firedac TFDquery.RowsAffected - returns 1 什么时候应该 return 0
Firedac TFDquery.RowsAffected - returns 1 when should return 0
我有一个 table 'EMAIL' 具有唯一字段 'addr'。当我从 mysql 控制台(通过 Putty)进行查询时,它 returns '0 行受影响 ' (因为 'id' 实际上没有改变),但 FIREDAC 始终 returns 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() 时启用它。
我有一个 table 'EMAIL' 具有唯一字段 'addr'。当我从 mysql 控制台(通过 Putty)进行查询时,它 returns '0 行受影响 ' (因为 'id' 实际上没有改变),但 FIREDAC 始终 returns 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() 时启用它。