如何获取与QSqlTableModel :: setData()相关联的已执行SQL语句?

时间:2013-12-26 05:05:57

标签: qt qtsql qsqltablemodel

我使用QSqlTableModel方法setDatasubmitAllcommit从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,即使我做了更新或插入。


更新

这是一个自给自足的代码段。设置是,我有一个带有QTableViewQPushButton的用户界面。在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();
} 

1 个答案:

答案 0 :(得分:0)

基于official documentation

  

插入,更新和删除记录

     

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。