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();
}