delphi - Firedac TFDquery.RowsAffected - 当应该返回 0 时返回 1
问题描述
我有一个带有唯一字段“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
标志。
如果禁用该标志,则仅考虑实际修改的记录。
如果启用该标志,则考虑所有已处理的记录(无论它们是否被修改)。
默认情况下,禁用,但 FireDAC 在调用mysql_real_connect()CLIENT_FOUND_ROWS
时启用它。
推荐阅读
- java - 如何使用弹簧应用程序检查亚马逊 s3 存储桶的总大小和剩余大小?
- html - 如何在引导程序4中垂直对齐无序列表
- firebase - Flutter:Fire Base 存储图像上传的后期初始化错误
- flutter - 将 setState 扩展为仅在已安装时运行
- javascript - 删除 2 个字符串的字符以使它们在打字稿中变位
- reactjs - 将网络应用上传到 Firebase 的过程
- c++ - 删除彼此太近的矢量线?
- azure-devops - 无法在 azure board 中对任务转换应用规则
- android - 如何在android 12中通过听筒播放音频?
- javascript - JavaScript:如何从 URL 获取第一个参数,实际上是第一个键?