SqlQuery多次命名占位符
SqlQuery one named placeholders several times
我试过了
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)
);
相关文章:
- 将模板与类模板扣除占位符参数匹配
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- Tensorflow C++ 占位符初始化
- std::bind 不会接受 bind 占位符的 std::cref - 为什么?
- qt 中的占位符
- 我可以在 c++ 中使用占位符作为数组的索引吗?
- 为什么协程不允许使用占位符返回类型?
- TensorFlow类占位符以及其他定义输入张量的方法
- QtLineEdit 占位符:如何让用户在插入模式下将字符 1 替换为 1
- 非类型模板参数中的占位符类型是否涉及作为模板参数传递的函数的重载解析?
- 是否可以使用自动占位符来推断非类型模板参数中的函数结果
- 如何使用 msgfmt 验证格式字符串中的位置表示法占位符
- 无法推断出占位符的概念
- 编译器错误boost :: asio ::占位符:: boost v1.69的错误
- std::绑定可变参数模板、绑定参数和占位符
- 尾随返回类型中的占位符类型的用途是什么
- 如何在折叠过程中获取成员类型的提升::mpl 占位符
- 将具有任意参数和占位符的函数存储在类中,然后再调用它
- 回调中的占位符_1是如何工作的
- SqlQuery多次命名占位符