如何使用QSqlQuery重用预准备语句?

时间:2013-09-22 20:22:04

标签: c++ sql qt prepared-statement qsqlquery

因此,使用(和重用)预准备语句的部分目的是数据库驱动程序执行的工作量较少。来自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构造函数之外的预准备查询中绑定新值。我找到了this,但我怀疑这是货物崇拜,因为如果QSqlQuery::prepare("query")保持不变(即使"query" QSqlQuery,{{1}}不止一次实际上是一个noop对象不同)。对于一些司机来说这是真的吗?否则,我错过了什么?我该如何重用已准备好的查询?

1 个答案:

答案 0 :(得分:2)

您的编译器错误与QSqlQuery的重用性无关。您是否将MyMeth声明为const?删除const,它阻止调用非const bindValue()。

更改

void MyMeth(QString firstname, QString lastname) const;

void MyMeth(QString firstname, QString lastname);