0

QSqlTableModelメソッドsetDataを使用submitAllして、Qt アプリケーションからデータベース テーブルを挿入/更新していますcommit。ロギングのために、対応する SQL ステートメントを記録する必要があります。どうやってやるの?(私は見てQSqlTableModel::query()いますが、SELECTのみを返すようです)

これが私がやっていることの簡略化されたバージョンです。

QSqlTableModel *_dataTableModel = qobject_cast<QSqlTableModel*>(dataTableView->model());
_dataTableModel->setData(item, value);
_dataTableModel->database().transaction();
_dataTableModel->submitAll();
_dataTableModel->database().commit()
QSqlQuery _currentQuery = _dataTableModel->query();
qDebug() << _currentQuery.lastQuery();

更新または挿入を行った場合でも、最後の行には常に SELECT が出力されます。


アップデート

以下は、自己完結型のコード スニペットです。セットアップは、私は と を備えた UI を持っているというQTableViewことQPushButtonです。clicked()押しボタンの信号がaddNewRow()スロットに取り込まれ、任意の値が最初のセルに挿入されます。lastQuery()挿入ステートメントであると予想される結果を出力していますが、これは指定されたテーブルの SELECT ステートメントです。私は何を間違っていますか?

main.cpp

{
    QApplication a(argc, argv);
    test1 w;
    // connect to and open database
    w.setDataTable("MY_TEST_TABLE");
    w.show();
    return a.exec();
}

test1.h

public:
    void setDataTable(QString dataTableName);

private slots:
    void addNewRow();

test1.cpp

void test1::setDataTable( QString dataTableName )
{
    QSqlTableModel *tableModel = new QSqlTableModel(); 
    tableModel->setTable(dataTableName);
    tableModel->select();   
    ui.tableView->setModel(tableModel);
}

void test1::addNewRow()
{
    QSqlTableModel *tableModel = qobject_cast<QSqlTableModel*>(ui.tableView->model());
    if(!tableModel->insertRow(tableModel->rowCount())) {
            return;
    }       
    tableModel->setData(tableModel->index(0, 0), QVariant("123345")); 
    tableModel->database().transaction(); 
    if(!tableModel->submitAll()) {
            return;
    }  
    if (!tableModel->database().commit()) {                                          
            return;
    }     
    qDebug() << tableModel->query().lastQuery();
} 
4

1 に答える 1

0

公式ドキュメントに基づく:

レコードの挿入、更新、および削除

QSqlQuery は、SELECT だけでなく、任意の SQL ステートメントを実行できます。次の例では、INSERT を使用してレコードをテーブルに挿入します。query.exec("INSERT INTO 従業員 (ID、名前、給与)" "VALUES (1001, 'Thad Beaumont', 65000)");

これは、選択だけでなく、すべてのステートメントで機能します。raw モードでこの方法を実行する場合は、常にQString最初のステートメントを作成QSqlQuery::exec()し、それを操作に使用してログに記録するか、次のメソッドを使用して、たとえば動的に実行される場合は最後のステートメントをクエリすることもできます。

QString QSqlQuery::lastQuery() const

現在使用されているクエリのテキストを返します。現在のクエリ テキストがない場合は空の文字列を返します。

したがって、残りのビットは、モデル クラスからクエリ オブジェクトを取得する方法だけです。これは、次の方法で実行できます。

QSqlQuery QSqlQueryModel::query() const

このモデルに関連付けられた QSqlQuery を返します。

于 2013-12-26T05:35:39.827 に答える