Добрый день.
Как в QRelationalTableModel, расположенной в QTableView, сохранить изменения внесенные из QTableView в базу данных.
вызов database().transaction() срабатывает нормально, однако вызов submitAll() и database().commit() приводит к ошибке
лог ошибки
"ERROR: syntax error at or near "="
LINE 1: ...REPARE qpsqlpstmt_1 AS UPDATE SET "serial_number"=$1 WHERE ...
^
(42601) QPSQL: Unable to prepare statement"
"ERROR: syntax error at or near "="
LINE 1: ...REPARE qpsqlpstmt_1 AS UPDATE SET "serial_number"=$1 WHERE ...
^
(42601) QPSQL: Unable to prepare statement"
правильно ли я понимаю механизм транзакций работает примерно так:
я открываю транзакцию model -> database().transaction();
делаю изменения в модели
и вношу (или отменяю) изменения в базу с помощью model -> database().commit();
Транзакция открывается, а вот model -> submitAll() и model -> database().commit(); возвращают false
код как пытаюсь это использовать
#include "ViewModel.h"
#include <QTableView>
#include <QPushButton>
#include <QVBoxLayout>
#include "Model/FSqlRelationalTableModel.h"
#include <QDebug>
ViewModel::ViewModel(QString sql, QWidget *parent) :
QWidget(parent)
{
setClassSetting();
setModel(sql);
}
ViewModel::ViewModel(QWidget *parent) :
QWidget(parent)
{
setClassSetting();
}
ViewModel::~ViewModel() {
model -> database().rollback();
}
void ViewModel::setClassSetting() {
table = new QTableView;
save = new QPushButton("Сохранить изменения");
model = new FSqlRelationalTableModel;
table -> setModel(model);
QString text = model -> database().transaction()? "transaction open": "transaction not open";
qDebug() << text;
baseLayout = new QVBoxLayout;
baseLayout -> addWidget(table);
baseLayout -> addWidget(save);
setLayout(baseLayout);
connect(save, &QPushButton::clicked, this, &ViewModel::slotSave);
}
void ViewModel::slotSave() {
QString text = model -> submitAll()? "model submit": "model not submit";
qDebug() << text;
// QString submit = model -> submit()? "is submit": "not submit";
//qDebug() << submit;
QString string = model -> database().commit()? "commit" : "not commit";
qDebug() << string;
}
void ViewModel::setModel(QString sql) {
model -> database().rollback();
model -> sendQuery(sql);
model -> database().transaction();
}
#include "FSqlRelationalTableModel.h"
#include <QtSql/QSqlRelationalTableModel>
#include <QtSql/QSqlQuery>
/**
* @brief FSqlRelationalTableModel::FSqlRelationalTableModel
* @param query
* @param parent
* форк QSqlRelationalTableModel
*/
FSqlRelationalTableModel::FSqlRelationalTableModel(QString query, QObject *parent) :
QSqlRelationalTableModel(parent)
{
sendQuery(query);
}
FSqlRelationalTableModel::FSqlRelationalTableModel(QObject *parent) :
QSqlRelationalTableModel(parent)
{
}
/**
* @brief FSqlRelationalTableModel::sendQuery
* @param sql
* Принимает строку и передает ее методу setQuery();
*/
void FSqlRelationalTableModel::sendQuery(QString sql) {
QSqlQuery query(sql);
this -> setQuery(query);
}