SqlQuery一次多次命名占位符

时间:2013-01-11 11:36:17

标签: c++ sql qt binding

我试过

  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中多次使用一个命名占位符?

3 个答案:

答案 0 :(得分:3)

来自QSqlQuery::bindValue() documentation

  

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

     

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

     

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

最后一句似乎有点错误,因为它看起来与第二句:名字绑定,但无论如何,这清楚地表明你试图实现的目标不受Qt的支持。

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

答案 1 :(得分:1)

要查看实际执行的查询,您可以使用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();

如果您将来需要重构,它也会很有用。

答案 2 :(得分:0)

首先尝试:

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)
);

如果上面的选择返回了正确的数据,那么请使用以下内容作为您的查询:

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)
);