Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не сохраняется новая запись в БД Postgres
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
gbcesc
Всем добрый день. Столкнулся с одной проблемой и не могу понять,что не так. Есть программа для работы с Базой Данных Postgres, подключение - все проходит успешно, таблица выводится. Удалить последнюю строку получается и это изменение сохраняется в саму БД, а вот добавить новую строку,чтобы она сохранилась никак не выходит. Помогите пожалуйста и скажите,что в коде не так? В Qt я новичок.

Код:

 #include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QMessageBox>
#include <QtSql/QSqlTableModel>
#include <QDataWidgetMapper>
#include <QMessageBox>
#include <QSqlQuery>
#include <QFile>
#include <QSqlRelationalDelegate>
#include <QSqlError>
#include <QApplication>
#include <QPushButton>
#include <QPrinter>
#include <QTextDocument>
#include <QPrintDialog>
#include <QTextCodec>
#include <QSqlQueryModel>
#include "dialog.h"
#include "dialog2.h"

MainWindow::MainWindow(QApplication *a, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QTextCodec *codec = QTextCodec::codecForName("CP1251");
    codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForLocale(codec);

    ui->tw->horizontalHeader()->setResizeMode(QHeaderView::Stretch);

    ui->tw->setItemDelegate(new QSqlRelationalDelegate(ui->tw));
    ui->tw->setWindowTitle("Информационная система торговой организации");

    QSqlDatabase db=QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setPort(5432);
    db.setDatabaseName("postgres");
    db.setUserName("postgres");
    db.setPassword("123123");

    if (!db.open())
    {
        QMessageBox::critical(parent,QObject::tr("Database Error"),db.lastError().text());
    }

    QSqlTableModel *model=new QSqlTableModel;
    model->setTable("trade");

    if (model->lastError().isValid() )
    {
       QMessageBox::critical(parent,QObject::tr("Query Error"),model->lastError().text());
    }

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Номер точки"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Тип торговой точки"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Число торговых залов"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Платежи за аренду, руб."));
    model->setHeaderData(4, Qt::Horizontal, QObject::tr("Коммунальные услуги, руб."));

    model->select();
    ui->tw->setModel(model);
    this->model = model;
    ui->tw->show();

    model->submitAll();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionExit_triggered()
{
    QMessageBox::information(0,"Info","exit pressed.");
}

void MainWindow::on_action_triggered()
{

    QSqlTableModel *model=new QSqlTableModel;

    model->setTable("trade");
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Номер точки"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Тип торговой точки"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Число торговых залов"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Платежи за аренду, руб."));
    model->setHeaderData(4, Qt::Horizontal, QObject::tr("Коммунальные услуги, руб."));

    model->select();
    ui->tw->setModel(model);
    delete this->model;
    this->model = model;
ui->tw->show();

}

void MainWindow::on_action_8_triggered()
    {
    model->insertRow(model->rowCount()); // добавление информации в базу данных
    }

void MainWindow::on_action_9_triggered()
    {
                model->removeRow(ui->tw->currentIndex().row()); // удаление текущей строки из базы данных
    }
maint
вставьте штук 10. Увидите что что то сохранилось. Постигнув эту истину найдете понятие транзакция и при выходе из программы будете делать что то вроде
    model->database().transaction();
    if (model->submitAll()) {
        model->database().commit();
        model->select();
    } else {
ОШИБКА !
gbcesc
Maint, Вы имеете ввиду создать кнопку выхода и вставить Ваш код туда? не могли бы Вы написать прямо в коде куда надо это вставлять? Если нужны исходники
maint
Цитата(gbcesc @ 14.4.2013, 0:59) *
Maint, Вы имеете ввиду создать кнопку выхода и вставить Ваш код туда? не могли бы Вы написать прямо в коде куда надо это вставлять? Если нужны исходники

да хоть в деструкторе, хоть сразу за insertRow. Для проверки сойдет и insertRow
gbcesc
К сожалению, ничего не происходит.все тоже самое. А Если попытаться сразу добавить много строк,то если заполнить одну сроку и потом добавить еще,то предыдущая строка сразу становиться пустой и так далее.
Majestio
Цитата(gbcesc @ 13.4.2013, 19:53) *
К сожалению, ничего не происходит.все тоже самое. А Если попытаться сразу добавить много строк,то если заполнить одну сроку и потом добавить еще,то предыдущая строка сразу становиться пустой и так далее.


Я бы предложил следующее:

1) Вынести model в класс, проинициализировать ее в конструкторе один раз через new (и не делать всяких там this->model = model)
2) Немного изменить порядок манипуляций с моделью

// в конструкроре ................................................................................
..........

model->setTable("trade");
// потом
model->select();
// потом
model->setHeaderData(0, Qt::Horizontal, QObject::tr("Номер точки"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Тип торговой точки"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Число торговых залов"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Платежи за аренду, руб."));
model->setHeaderData(4, Qt::Horizontal, QObject::tr("Коммунальные услуги, руб."));
// потом
ui->tw->setModel(model);
ui->tw->show();
// в конструкторе model->submitAll() не нужен, ибо только чтение

про добавление ....

если БД позволяет вставлять данные (NULL,NULL,....,NULL) - добавление должно пройти после сабмита модели, если хотябы одно поле NOT NULL - нужно добавить в модель реальные заполненные данные, иначе БД просто этот сабмин не скушает

Вот как-то так.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.