2014-08-28 51 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