QSqlQuery准备好的语句 - 正确用法

ak.*_*ak. 3 sql qt prepared-statement

我正在尝试确定使用QSqlQuery准备好的语句的正确方法.文档在这个问题上并不十分具体.

void select(const QSqlDatabase &database) {
    QSqlQuery query(database);
    query.prepare("SELECT * FROM theUniverse WHERE planet = :planet");
    query.bindValue(":planet", "earth");
    query.exec();
}
Run Code Online (Sandbox Code Playgroud)

那么这段代码会在连接中创建一个永久性的预备语句database吗?这个准备好的语句是否会在调用之间持续存在select(),即它会在函数返回并被释放时保存QSqlQuery query吗?

或者我应该在堆上创建QSqlQuery并反复使用相同的实例?

ak.*_*ak. 5

好的,我的想法是你必须在堆上创建QSqlQuery,准备查询并使用它执行以下操作:

  1. QSqlQuery::bindValue(s)
  2. QSqlQuery::exec
  3. 用数据读取数据 QSqlQuery::[next|first|last|...]
  4. QSqlQuery::finish
  5. 冲洗并重复

以下剪切对于在堆上创建,准备和检索查询很有用:

QSqlDatabase database;
QMap<QString, QSqlQuery *> queries; //dont forget to delete them later!

QSqlQuery *prepareQuery(const QString &query)
{
    QSqlQuery *ret = 0;
        if (!queries.contains(query)) {
            QSqlQuery *q = new QSqlQuery(database);
            q->prepare(query);
            queries[query] = ret = q;
        } else {
            ret = queries[query];
        }
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)