C++ 如何在QSqlQuery中重用准备好的语句?
因此,使用(和重用)准备好的语句的部分目的是数据库驱动程序执行更少的工作。来自Perl,我习惯于准备SQL查询并存储对该查询的引用,以便以后可以绑定一些值并在必要时多次执行查询C++ 如何在QSqlQuery中重用准备好的语句?,c++,sql,qt,prepared-statement,qsqlquery,C++,Sql,Qt,Prepared Statement,Qsqlquery,因此,使用(和重用)准备好的语句的部分目的是数据库驱动程序执行更少的工作。来自Perl,我习惯于准备SQL查询并存储对该查询的引用,以便以后可以绑定一些值并在必要时多次执行查询 用Qt C++(Qt 5.1),我尝试这样做: class MyClass { [...] QSqlDatabase db; QSqlQuery insert_query; }; MyClass::MyClass() {
用Qt C++(Qt 5.1),我尝试这样做:class MyClass { [...] QSqlDatabase db; QSqlQuery insert_query; }; MyClass::MyClass() { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("whatever"); db.open(); insert_query = QSqlQuery(db); insert_query.prepare("insert into players (firstname, lastname) values(:firstname, :lastname)")); } void MyClass::MyMeth(QString firstname, QString lastname) { insert_query.bindValue(":firstname", firstname); //COMPILE ERROR }
错误:没有匹配的成员函数用于调用“bindValue”
注意:候选函数不可行:“this”参数的类型为“const QSqlQuery”,但方法未标记为const
但是我想在MyClass构造函数之外的准备好的查询中绑定新值。我发现了,但我怀疑这是cargo cult,因为如果保持不变(即使“query”
对象不同),那么多次调用QSqlQuery
实际上就是一个noop。有些司机是这样吗?否则,我错过了什么?我应该如何重用准备好的查询?您的编译器错误与QSqlQuery的重用性无关。您是否将MyMeth声明为常量?删除QSqlQuery::prepare(“query”)
,它将阻止对非常量bindValue()的调用 改变常量
到void MyMeth(QString firstname, QString lastname) const;
答对 了我错过了这个,因为我忘了我在一个继承了const的重写方法中。我需要在另一个我控制签名的方法中绑定这些值。void MyMeth(QString firstname, QString lastname);