2011-09-12 13 views
1

のレコードを更新する:私はレコードを更新しようとしていると私は、この持ってQSqlTableModel

tableModel->select(); 
    QModelIndex index = ui.tableView->currentIndex(); 
    QString sqlQuery = QString("UPDATE %1 SET firstname=:firstname, lastname=:lastname, country=:country, city=:city WHERE id=:id)").arg(tableName); 
    query.prepare(sqlQuery); 
    QSqlRecord recordz = tableModel->record(index.row()); 

    query.bindValue(":firstname", ui.fEdit->text()); 
    query.bindValue(":lastname", ui.lnEdit->text()); 
    query.bindValue(":country", ui.cEdit->text()); 
    query.bindValue(":city", ui.cityEdit->text()); 
    query.bindValue(":id", recordz.value("id").toInt()); 
    query.exec(); 
    tableModel->submitAll(); 

アプリケーションがエラーなしでコンパイルしますが、編集内容を保存しません。

+1

直接 'QModelIndex'オブジェクトの代わりに[' QModelIndex :: data() '](http://doc.qt.nokia.com/4.7/qmodelindex.html#data)を使用してください。 – manatwork

答えて

0
query.bindValue(":id", ui.tableView->currentIndex()); 

違反コードがあります。データ関数を使用して実際のインデックスまたは値を返すことができますが、tableViewインデックス!=あなたのSQLデータベースインデックスを覚えておいてください。 Qtでは、データベースのインデックスがインデックスと異なるため、最初のSQLクエリに実際のDB IDを含め、それを他の値と一緒に保存しておき、実行するとそのインデックスを返す必要があります更新クエリ。

+0

私は今query.bindValue( ":id"、tableModel-> data(index、Qt :: DisplayRole));を持っています。それでも更新することはできません。 – Gandalf

+0

query.bindValue( ":id"、tableModel-> record(index.row).value( "id"))を試してください。つまり、項目IDをtableViewに含める必要がありますが、項目IDを含めて隠しフィールドとしてマークすることができます。それはもっと長いアプローチです(そしておそらくもっと良い方法でしょう)が、それは信頼できるものです。 –

+0

query.bindValue( ":id"、tableModel-> record(index.row).value( "id")を使用すると、 'QSqlTableModel :: record(未解決のオーバーロードされた関数型>)' ));私はID列をQTableViewに表示しています。 – Gandalf

関連する問題