Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ODBC+Oracle
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
Sonnenstein
И снова прошу о помощи=)

Ну как, не работает. Соединение проходит, можно редактировать, только вот проблемка - дублируется структура таблицы (т.е. столбцы вывелись два раза, соответственно, и находящаяся в них информация).
В Oracle таблица создается нормально, без дублирования. Использовала такой же код для кроссплатформенного клиента, работает расчудесно.
Подскажите, пожалуйста, как это можно исправить?

Раскрывающийся текст
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "editdialog.h"
#include "finddialog.h"
#include <QtGui>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->passEdit->setEchoMode(QLineEdit::Password);
    ui->splitter->setStretchFactor(1, 2);

    //делаем неактивными кнопки для работы с таблицей
    ui->openButton->setEnabled(false);
    ui->editButton->setEnabled(false);
    ui->createButton->setEnabled(false);
    ui->removeButton->setEnabled(false);
    ui->findButton->setEnabled(false);
    ui->resetButton->setEnabled(false);

    //уставливаем параметры соединения по умолчанию

    ui->dsnEdit->setText(tr("ash"));
    ui->passEdit->setText(tr("is"));

    //установка слотов на сигналы нажатия кнопок
    connect(ui->exitButton, SIGNAL(clicked()), this, SLOT(close()));
    connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(dbConnect()));
    connect(ui->openButton, SIGNAL(clicked()), this, SLOT(dbOpen()));
    connect(ui->findButton, SIGNAL(clicked()), this, SLOT(dbFind()));
    connect(ui->resetButton, SIGNAL(clicked()), this, SLOT(dbReset()));
    connect(ui->createButton, SIGNAL(clicked()), this, SLOT(dbCreate()));
    connect(ui->editButton, SIGNAL(clicked()), this, SLOT(dbEdit()));
    connect(ui->removeButton, SIGNAL(clicked()), this, SLOT(dbRemove()));
}
//функция-слот соединения с БД
void MainWindow::dbConnect()
{
    //устанавливаем параметры соединения
    db = QSqlDatabase::addDatabase("QODBC3");
    db.setDatabaseName(ui->dsnEdit->text());
    db.setPassword(ui->passEdit->text());

    //открытие БД
    if(!db.open())
        QMessageBox::warning(this, tr("Ошибка соединения с базой данных"),
                             db.lastError().text());
    else
    {
        QMessageBox::information(this, tr("Статус соединения"),
                                 tr("Соединение установлено"));

    }

    //делаем активными кнопки действий с таблицей
    ui->openButton->setEnabled(true);
    ui->createButton->setEnabled(true);
    ui->removeButton->setEnabled(true);
}
//функция-слот открытия таблицы
void MainWindow::dbOpen()
{
    //связываем модель с дескриптором соединения
    model = new QSqlTableModel(this, db);
    model->setTable("books");
    model->setSort(0, Qt::AscendingOrder);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //попытка выборки
    if(!model->select())
    {
        QMessageBox::warning(this, tr("Ошибка. Невозможно открыть таблицу"),
                             model->lastError().text());
        return;
    }
    //связываем представление с моделью
    ui->dbTable->setModel(model);

    //устанавливаем параметры представления
    ui->dbTable->setEditTriggers(QTableView::NoEditTriggers);
    ui->dbTable->hideColumn(table_photo);
    ui->dbTable->resizeColumnsToContents();
    ui->dbTable->setCurrentIndex(model->index(0, 0));

    //делаем активными кнопки действий с таблицей
    ui->editButton->setEnabled(true);
    ui->findButton->setEnabled(true);
    ui->resetButton->setEnabled(true);
}
//функция-слот создания таблицы
void MainWindow::dbCreate()
{
    //проверка на наличие таблицы в БД
    if(db.tables().contains("books") ||
            db.tables().contains("BOOKS"))
    {
        QMessageBox::warning(this, tr("Ошибка создания"),
                             tr("Таблица уже создана. Отменено"));
        return;
    }
    QSqlQuery query;

    //задаем скрипты для создания таблицы, последовательности
    // и триггера
    QString table_statement = "CREATE table \"BOOKS\" ("
            "\"ID\" NUMBER NOT NULL,"
            "\"NAME\" VARCHAR2(60) NOT NULL,"
            "\"AUTH\" VARCHAR2(60) NOT NULL,"
            "\"DILL\" VARCHAR2(60) NOT NULL,"
            "\"DATE\" DATE NOT NULL,"
            "\"HOWM\" VARCHAR2(60) NOT NULL,"
            "\"HOWC\" VARCHAR2(60) NOT NULL,"
            "\"COVER\" BLOB,"
            "constraint \"BOOKS_PK\" primary key(\"ID\"))";
    QString sequence_statement = "CREATE sequence \"BOOKS_SEQ\"";
    QString trigger_statement = "CREATE trigger \"BI_BOOKS\" "
            "before insert on \"BOOKS\" "
            "for each row "
            "begin "
            "if :NEW.\"ID\" is null then "
            "select \"BOOKS_SEQ\".nextval into :NEW.\"ID\" from dual; "
            "end if; "
            "end; ";
    query.exec(table_statement);
    query.exec(sequence_statement);
    query.exec(trigger_statement);

    //выводим статус создания
    QMessageBox::information(this, tr("Статус создания"),
                             tr("Таблица успешно создана"));
    ui->createButton->setEnabled(false);
    ui->removeButton->setEnabled(true);
}
//функция-слот вызова формы редактирования таблицы
void MainWindow::dbEdit()
{
    //проверка на наличие таблицы в БД
    if(db.isOpen() && ui->dbTable->model() != NULL)
    {
        //определяем индекс и передаем его в форму редактирвоания
        QModelIndex id = ui->dbTable->currentIndex();
        EditDialog *EditForm = new EditDialog(model, id.row(), this);
        EditForm->exec();
        ui->dbTable->resizeColumnsToContents();
        delete EditForm;
    }
    else
    {
        QMessageBox::warning(this, tr("Ошибка редактирования"),
                             tr("Таблица не выбрана"));
    }
}
//функция-слот удаления таблицы
void MainWindow::dbRemove()
{
    //проверка на наличие таблицы в БД
    if(!db.tables().contains("books") &&
            !db.tables().contains("BOOKS"))
    {
        QMessageBox::warning(this, tr("Ошибка удаления"),
                             tr("Таблицы не существует. Отменено"));
        return;
    }
    QSqlQuery query;

    //скрипты удаления таблицы, последовательностии триггера
    query.exec("DROP sequence \"BOOKS_SEQ\"");
    query.exec("DROP trigger \"BI_BOOKS\"");
    query.exec("DROP table \"BOOKS\"");
    QMessageBox::information(this, tr("Статус удаления"),
                             tr("Таблица успешно удалена"));

    ui->createButton->setEnabled(true);
    ui->removeButton->setEnabled(false);
}
//функция-слот открытия формы поиска записи в таблице
void MainWindow::dbFind()
{
    if(db.isOpen() && ui->dbTable->model() != NULL)
    {
        FindDialog dialog(model, this);
        dialog.exec();
    }
    else
    {
        QMessageBox::warning(this, tr("Ошибка поиска"),
                             tr("Таблица не выбрана"));
    }
}
//функция-слот сброса параметров поиска
void MainWindow::dbReset()
{
    model->setFilter("");
    model->select();
}

MainWindow::~MainWindow()
{
    delete ui;
}
Sonnenstein
В ходе недолгих мучений было выявлено, что в вместо последнего столбеца COVER вставляется таблица еще раз. Если кого-то это наведет на мысли...
Litkevich Yuriy
Sonnenstein, Справка по кнопкам и тэгам форума

Цитата(Sonnenstein @ 17.12.2012, 10:40) *
//выводим статус создания
    QMessageBox::information(this, tr("Статус создания"),
                             tr("Таблица успешно создана"));
а на основании чего такой статус? Ты ведь даже не убедился выполнился ли запрос.


Для начала: создай таблицу в БД, штатными средствами. Проверь, как она отображается в программе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.