Russian Qt Forum

Qt => Базы данных => Тема начата: gharm от Апрель 16, 2014, 23:44



Название: сохранение изменений в базу через QRelationalTableModel
Отправлено: gharm от Апрель 16, 2014, 23:44
Добрый день.
Как в 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);
}