1

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

4

1 回答 1

2

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

改变

void MyMeth(QString firstname, QString lastname) const;

void MyMeth(QString firstname, QString lastname);
于 2013-09-23T01:35:44.013 回答