c++ - 如何使用 QSqlQuery 重用准备好的语句?

标签 c++ sql qt prepared-statement qsqlquery

因此,使用(和重用)准备好的语句的部分目的是数据库驱动程序执行更少的工作。来自 Perl,我习惯于准备 SQL 查询并存储对该准备好的查询的引用,以便我以后可以绑定(bind)一些值并执行查询,必要时可以执行多次。

使用 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 构造函数之外的准备好的查询中绑定(bind)新值。我找到了 this ,但我怀疑它是 cargo-cult,因为如果 "query" 保持不变,多次调用 QSqlQuery::prepare("query") 实际上是一个 noop (即使 QSqlQuery 对象不同)。某些驱动程序是这样吗?否则,我错过了什么?我应该如何重用准备好的查询?

最佳答案

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

改变

void MyMeth(QString firstname, QString lastname) const;

void MyMeth(QString firstname, QString lastname);

关于c++ - 如何使用 QSqlQuery 重用准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948384/

相关文章:

c# - 如何更改 SWIG 生成的 CSHARP 文件中的构造函数代码

sql - 过滤SQL查询返回的结果

php - 我应该回滚失败的 SELECT 语句还是提交成功的语句?

qt - QML中如何动态创建Popup

c++ - 如何将带有数据的 header 添加到 Qt 中的 QTableWidget?

c++ - 机器的基本字符集

c++ - Boost Variant 本质上是 C/C++ 中的 union ?

sql - 表值参数上的条件Where 语句?

c++ - 使用 Qt 发送电子邮件

c++ - 当我将 lambda 表达式复制到 std::function 时出了什么问题