因此,使用(和重用)预准备语句的部分目的是数据库驱动程序执行更少的工作。来自Perl,我习惯于准备一个SQL查询并存储对该准备好的查询的引用,以便以后可以绑定一些值并在必要时多次执行查询。
使用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
}
error: no matching member function for call to 'bindValue'
note: candidate function not viable: 'this' argument has type 'const QSqlQuery', but method is not marked const
但是我想在 MyClass 构造函数之外的准备好的查询中绑定新值。我发现了这个,但我怀疑它是货物崇拜,因为如果"query"
保持不变(即使QSqlQuery
对象不同),多次调用QSqlQuery::prepare("query")
实际上是一个无聊的事情。某些驱动程序是这样吗?否则,我错过了什么?我应该如何重用准备好的查询?
您的编译器错误与 QSqlQuery 的重用性无关。您是否宣布MyMeth为const
?删除const
,它阻止了对非 const bindValue() 的调用。
改变
void MyMeth(QString firstname, QString lastname) const;
自
void MyMeth(QString firstname, QString lastname);