6

我试过

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

4

3 回答 3

3

QSqlQuery::bindValue() 文档

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

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

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

最后一句话似乎有点错误,因为它看起来绑定到第二个:name,但无论哪种方式,这都清楚地说明了 Qt 不支持您想要实现的目标。

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

于 2013-01-11T11:59:56.103 回答
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();

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

于 2013-01-11T12:04:57.760 回答
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)
);
于 2013-01-11T11:54:14.670 回答