Firedac TFDquery.RowsAffected - 本应返回0的时候却返回1。

问题描述 投票:0回答:1

我有一个带有唯一字段'addr'的表'EMAIL'。当我从mysql控制台(通过Putty)进行查询时,它返回'。0行受影响'(因为'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)。

delphi firedac
1个回答
1
投票

对于一个MySQL数据库,在这样的情况下 UPDATE 查询,受影响的行数(由 mysql_affected_rows())取决于 CLIENT_FOUND_ROWS 标志,如果该标志被禁用,则只考虑实际被修改的记录。

如果该标志被禁用,那么只有实际被修改的记录才会被考虑在内,如果该标志被启用,那么所有处理过的记录(无论是否被修改)都会被考虑在内。

如果启用该标志,那么所有处理过的记录(无论是否修改)都会被考虑在内。

默认情况下。CLIENT_FOUND_ROWS 是禁用的,但FireDAC在调用 mysql_real_connect().

© www.soinside.com 2019 - 2024. All rights reserved.