crossplatform.ru

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

> ODBC+MySQL, Не создается таблица в самодельном клиентском приложении
Sonnenstein
  опции профиля:
сообщение 4.12.2012, 7:25
Сообщение #1


Новичок


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

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




Репутация:   0  


Помогите , пожалуйста, новичку. Может, такое уже обсуждали, я как-то не нашла.

Суть такова: пишу на QT клиент для работы с MySQL , для подключения использую драйвер MySQL ODBC 3,51. Соединяться клиент соединяется, но создавать таблицу не хочет, пишет следующее:

"QODBCDriver::record: Unable to execute column list" Error: ""
"QODBCDriver::primaryIndex: Unable to execute primary key list" Error: ""

Смутно подозреваю, что ошибка именно в SQL коде, но мало ли.

код mainwindow.cpp

Раскрывающийся текст
#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->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("DEFAULT"));


    //установка слотов на сигналы нажатия кнопок
    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());

//открытие БД
    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_cover);
    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") )
    {
        QMessageBox::warning(this, tr("Ошибка создания"),
                             tr("Таблица уже создана. Отменено"));
        return;
    }
    QSqlQuery query;

    //задаем скрипты для создания таблицы, последовательности
        // и триггера
    QString table_statement = "CREATE table books ("
            "id NUMBER NOT NULL,"
            "name VARCHAR(30) NOT NULL PRIMARY KEY AUTOINCREMENT,"
            "auth VARCHAR(30) NOT NULL,"
            "dill VARCHAR(30) NOT NULL,"
            "date DATE NOT NULL,"
            "howm VARCHAR(5) NOT NULL,"
            "howc VARCHAR(5) NOT NULL,"
            "cover BLOB ";
  //  QString sequence_statement = "CREATE sequence BOOKS_SEQ";
  //  QString trigger_statement = "CREATE trigger BI_BOOKS "
         //   "before insert on BOOKS "
          //  "for each row "
          //  "begin "
         //   "if :NEW.NOM is null then "
         //   "select BOOKS_SEQ.nextval into :NEW.NOM 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)
    {
        //определяем индекс и передаем его в форму редактирoвания
        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"))
    {
        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;
}
Причина редактирования: используй тэг/кнопку code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 5.12.2012, 16:58
Сообщение #2


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

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

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




Репутация:   94  


я подозреваю, что БД изначально была не MySQL, т.к. в ней нет последовательностей/генераторов.
И первичный ключ, похоже не там объявлен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




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