0

我正在使用QSqlTableModel方法从 Qt 应用程序插入/更新数据库表setDatasubmitAll并且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,即使我进行了更新或插入。


更新

这是一个自给自足的代码片段。设置是,我有一个带有 aQTableViewQPushButton. clicked()在插槽中捕获按钮的信号,并将addNewRow()任意值插入到第一个单元格。我正在打印lastQuery()期望它是插入语句的结果,但它是给定表的 SELECT 语句。我究竟做错了什么?

主文件

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

测试1.h

public:
    void setDataTable(QString dataTableName);

private slots:
    void addNewRow();

测试1.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 可以执行任意 SQL 语句,而不仅仅是 SELECT。下面的例子使用 INSERT 向表中插入一条记录: QSqlQuery 查询;query.exec("INSERT INTO 雇员 (id, name, 薪水) " "VALUES (1001, 'Thad Beaumont', 65000)");

这适用于任何语句,而不仅仅是选择。如果您在原始模式下这样做,您总是可以构建QString第一个,并将其用于QSqlQuery::exec()操作然后记录它,或者您也可以使用以下方法查询最后一条语句,如果它是动态完成的,例如:

QString QSqlQuery::lastQuery() 常量

返回正在使用的当前查询的文本,如果没有当前查询文本,则返回一个空字符串。

因此,剩下的唯一一点是如何从模型类中获取查询对象。这可以通过以下方法完成:

QSqlQuery QSqlQueryModel::query() 常量

返回与此模型关联的 QSqlQuery。

于 2013-12-26T05:35:39.827 回答