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

How do I reuse prepared statements with QSqlQuery?

本文关键字:语句 何使用 QSqlQuery      更新时间:2023-10-16

因此,使用(和重用)预准备语句的部分目的是数据库驱动程序执行更少的工作。来自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);