2014-08-28 108 views
1

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

我prepere本查询:

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()吗?

回答

3

我一定要运行它结合 模型之前执行()查询对象吗?

是的。为QSqlQueryModel::setQuery(const QSqlQuery & query)的医生说:

注意查询必须是活动,决不能 isForwardOnly()。

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

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

+0

是 - 这就是它......我认为,如果QSqlQueryModel本身执行“静态”查询,它应该与准备好的一样...可惜在QSqlQueryModel文档中缺少这样一个示例...谢谢! – murison 2014-08-28 10:41:53