SqlQuery多次命名占位符

SqlQuery one named placeholders several times

本文关键字:占位符 SqlQuery      更新时间:2023-10-16

我试过了

  QSqlQuery query;
  query.prepare("DELETE FROM names WHERE id_col = :ID OR id_parent = :ID");
  query.bindValue(":ID", idVal);
  query.exec();

假设idVal将被绑定两次,但是执行此查询时只删除包含id_parent = idVal的行,而id_col = idVal保持未删除。所以只有第二次将idVal绑定到查询。

当我重写成

  QSqlQuery query;
  query.prepare("DELETE FROM names WHERE id_col = ? OR id_parent = ?");
  query.bindValue(0, idVal);
  query.bindValue(1, idVal);
  query.exec();

一切正常。

是否可以在QSqlQuery中多次使用一个命名占位符?

来自QSqlQuery::bindValue()文档:

查询中的值不能绑定到多个位置,例如:

INSERT INTO testtable (id, name, samename) VALUES (:id,:name,:name)

绑定到name将绑定到第一个:name,但不绑定到第二个:name。

最后一句话似乎有一点错误,因为它看起来像绑定到第二个名称,但无论如何,这清楚地说明了你想要实现的是Qt不支持的。

你的选择是坚持使用你已经有的解决方案,或者使用Mahmoud Gamal在你的问题的评论中提供的解决方案

要查看实际执行的查询,可以使用QSqlQuery::executedQuery() .

你应该显式地设置占位符的值:

QSqlQuery query;
query.prepare("DELETE FROM names WHERE id_col = :ID_COL OR id_parent = :ID_PAR");
query.bindValue(":ID_COL", idVal);
query.bindValue(":ID_PAR", idVal);
query.exec();

先试一下:

select * from names where :ID in 
((select id_col FROM names WHERE id_col = :ID)
OR
(select id_parent FROM names WHERE id_parent = :ID)
);

如果上面的select返回了正确的数据,那么使用以下语句作为查询:

delete from names where :ID in 
((select id_col FROM names WHERE id_col = :ID)
OR
(select id_parent FROM names WHERE id_parent = :ID)
);