将行插入QSqlTableModel

时间:2017-11-15 22:43:41

标签: c++ qt qt5 qtsql qsqltablemodel

当要编辑行时,索引将传递到编辑对话框中 编辑工作正常 当我想添加一行时,我不会将索引传递给对话构造函数,因此它知道它应该添加一个新行。
这是功能代码对对话按钮的反应

void DialogAddCl::on_buttonBox_clicked(QAbstractButton *button)
{
    // prepare
    m->database().transaction();
    QString debugstr;
    auto chi4 = ui->buttonBox->buttonRole(button);
    int rowCount = m->rowCount();
    switch (chi4) {
    case QDialogButtonBox::AcceptRole:
        if (!ind->isValid())
            // insert
            if (!m->insertRow(rowCount, *ind))
            {
                QMessageBox::critical (this, "Error inserting into model", m->lastError().text(), QMessageBox::Cancel);
                break;
            }
            else
            {
                m->setData(m->index(rowCount, 0), rowCount+1);
            }
        else
        {
            // update
            rowCount = ind->row();
        }
        m->setData(m->index(rowCount, 1), ui->name->text());
        m->setData(m->index(rowCount, 2), ui->addr->text());
        // 12 other setData() calls

        if (m->submitAll())
        {
            m->database().commit();
        }
        else
        {
            // rollback if error
            m->database().rollback();
            debugstr = QString(m->database().lastError().text());
            QMessageBox::critical (this, "Database returned an error",
                                   m->database().lastError().text(), QMessageBox::Cancel);
        }
    case QDialogButtonBox::RejectRole:
        this->close();
        break;
    case QDialogButtonBox::ResetRole:
        fillFields();
        break;
    default:
        break;
    }

}

这是一个dialogaddcl.h:

private:
    Ui::DialogAddCl *ui;
    QSqlTableModel* m;
    QModelIndex* ind;

因此,如果我编辑现有记录,m->submitAll()工作正常,如果我尝试提交新插入的行,则失败。我已经通过调试进行了检查,setData()调用即使在添加时也能正常工作,因此数据库不会期望NOT NULL字段并发出错误。 顺便说一句,也许有人可以指出一种方法来捕捉实际的错误文本?我尝试使用debugstr,但它始终只包含空字符串。我打印的错误消息也是如此

1 个答案:

答案 0 :(得分:2)

要向QSqlTableModel插入一行,您不应直接使用setData(),如果您不能使用insertRecord(),则表示该行和QSqlRecordQSqlRecord可以通过模型的record()方法获得。

InsertDialog dial;
if(dial.exec()== InsertDialog::Accepted){
    db.transaction();
    QString f = dial.firstname();
    QString l = dial.lastname();

    QSqlRecord record = model.record();
    /* since the id field has the autoincrement attribute,
     * it is not necessary to indicate its value,
     * that is because this field of the request is removed.
    */
    record.remove(record.indexOf("id"))
    record.setValue("firstname", f);
    record.setValue("lastname", l);
    /*-1 is set to indicate that it will be added to the last row*/
    if(model.insertRecord(-1, record)){
        qDebug()<<"successful insertion";
        model->submitAll();
    }
    else{
        db.rollback();
    }
}

在下面的link中,您将找到一个示例。