crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> ODBC+Oracle, Не работает ODBC клиент c Oracle
Sonnenstein
  опции профиля:
сообщение 17.12.2012, 8:40
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 4.12.2012
Пользователь №: 3623

Спасибо сказали: 0 раз(а)




Репутация:   0  


И снова прошу о помощи=)

Ну как, не работает. Соединение проходит, можно редактировать, только вот проблемка - дублируется структура таблицы (т.е. столбцы вывелись два раза, соответственно, и находящаяся в них информация).
В 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
  опции профиля:
сообщение 17.12.2012, 10:30
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 4.12.2012
Пользователь №: 3623

Спасибо сказали: 0 раз(а)




Репутация:   0  


В ходе недолгих мучений было выявлено, что в вместо последнего столбеца COVER вставляется таблица еще раз. Если кого-то это наведет на мысли...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.12.2012, 19:05
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Sonnenstein, Справка по кнопкам и тэгам форума

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


Для начала: создай таблицу в БД, штатными средствами. Проверь, как она отображается в программе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 6:35