QSqlQueryModel编写的语句(使用QSqlQuery)无法正常工作

时间:2014-08-28 09:01:55

标签: postgresql qt5 qsqlquery

使用带有预处理语句的QSqlQueryModel时遇到问题。当手动执行语句时,一切正常,但是当它绑定到模型时 - 它不会执行。另一方面,当我使用"静态"设置模型时query(通过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日志中我只有准备语句,没有执行的迹象......但是当用&#34; static&#34;取消注释该行时查询(并评论上面的一个)它的工作正常......

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

1 个答案:

答案 0 :(得分:3)

  

我必须在绑定之前对查询对象运行execute()   模特?

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

  

请注意,查询必须处于有效状态,且不得为   isForwardOnly()。

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

  

成功执行SQL语句将查询的状态设置为活动状态   这样isActive()返回true。否则,查询的状态将设置为   无效。在任何一种情况下,当执行新的SQL语句时,   查询位于无效记录上。必须是活动查询   导航到有效记录(以便isValid()返回true)之前   可以检索值。