我使用QSqlTableModel
方法setData
,submitAll
和commit
从Qt应用程序插入/更新数据库表。
出于日志记录的目的,我需要记录相应的SQL语句。
我怎样才能做到这一点?
(我正在查看QSqlTableModel::query()
,但好像它只返回SELECTs)
以下是我正在做的简化版本。
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,即使我做了更新或插入。
这是一个自给自足的代码段。设置是,我有一个带有QTableView
和QPushButton
的用户界面。在clicked()
时隙中捕获按钮的addNewRow()
信号,并将任意值插入第一个单元。
我正在打印lastQuery()
的结果,期望它是insert语句,但它是给定表的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();
}
答案 0 :(得分:0)
插入,更新和删除记录
QSqlQuery可以执行任意SQL语句,而不仅仅是SELECT。以下示例使用INSERT将记录插入表中: QSqlQuery查询; query.exec(“INSERT INTO employee(id,name,salary)” “VALUES(1001,'Thad Beaumont',65000)”);
这适用于任何语句,而不仅仅是选择。如果您在原始模式下以这种方式执行此操作,则可以始终首先构建QString
,并将其用于QSqlQuery::exec()
操作,然后将其记录,或者您也可以使用following method查询最后一个语句,如果它是动态完成的,例如:
QString QSqlQuery :: lastQuery()const
返回当前正在使用的查询的文本,如果没有当前查询文本则返回空字符串。
因此,唯一剩下的就是如何从模型类中获取查询对象。这可以使用following method:
来完成QSqlQuery QSqlQueryModel :: query()const
返回与此模型关联的QSqlQuery。