【问题标题】:QSqlQueryModel prepared statement (using QSqlQuery) not workingQSqlQueryModel 准备好的语句(使用 QSqlQuery)不起作用
【发布时间】:2014-08-28 09:01:55
【问题描述】:

我在使用带有准备好的语句的 QSqlQueryModel 时遇到问题。手动执行语句时一切正常,但将其绑定到模型时 - 它不会执行。另一方面,当我使用“静态”查询(通过 QString)设置模型时 - 模型执行并加载数据。我究竟做错了什么?

我这样准备查询:

QSqlQuery query;
query.prepare(QString("SELECT \
        kontrahentid \
        , trim(format ('%s %s %s', kontrahentnazwafirmy, kontrahentnazwisko, kontrahentimie) ) as nazwa \
    FROM kontrahent \
    WHERE %1 ilike ? \
").arg(searchBy));
query.addBindValue(searchString);

当这样查询时它可以工作:

if (query.exec()) {
    while (query.next()) {
        qDebug() << "{" << query.value(0) << ", " << query.value(1) << "}";
    }
}

在 postgres 日志中,我有准备语句,并在之后执行它。 但是当将它绑定到模型时它不起作用:

QSqlQueryModel* model = new QSqlQueryModel(this);
model->setQuery(query);
//model->setQuery("SELECT kontrahentid, trim(format ('%s %s %s', kontrahentnazwafirmy, kontrahentnazwisko, kontrahentimie) ) as nazwa FROM kontrahent");
if (model->lastError().isValid()) {
    qDebug() << model->lastError();
    return;
}

for (int i = 0; i < model->rowCount(); ++i) {
    //int id = model.record(i).value("id").toInt();
    //QString name = model.record(i).value("name").toString();
    qDebug() << model->record(i).value(0) << model->record(i).value(1);
}

在 postgres 日志中,我只有准备语句,没有执行的迹象……但是当取消注释带有“静态”查询的行(并注释它上面的那个)时,它工作得很好……

我做错了什么?在将查询对象绑定到模型之前,我是否必须在查询对象上运行 execute()?

【问题讨论】:

    标签: postgresql qt5 qsqlquery


    【解决方案1】:

    在将查询对象绑定到之前,我是否必须在查询对象上运行 execute() 型号?

    是的。 QSqlQueryModel::setQuery(const QSqlQuery & query) 的文档说:

    请注意,查询必须处于活动状态且不得 isForwardOnly()。

    要使查询处于活动状态,它必须已被执行。 QSqlQuery 的文档说:

    成功执行的 SQL 语句将查询的状态设置为活动 所以 isActive() 返回 true。否则查询的状态设置为 不活动。无论哪种情况,在执行新的 SQL 语句时, 查询定位在无效记录上。活动查询必须是 之前导航到有效记录(因此 isValid() 返回 true) 可以检索值。

    【讨论】:

    • 是的 - 就是这样......我认为如果 QSqlQueryModel 自己执行“静态”查询,它应该对准备好的查询做同样的事情......可惜 QSqlQueryModel 文档中缺少这样的例子...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2014-10-09
    • 1970-01-01
    • 2015-10-11
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多