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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 4.12.2012, 8:39
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


не закрыта скобка в CREATE TABLE
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 4.12.2012, 18:26
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 21.10.2010
Пользователь №: 2134

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




Репутация:   1  


Посоветую на будующее использовать MySQL Workbench-бесплатная программа для работы с MySQL.
Там удобная штука есть: когда таблицу создаешь в визуальном редакторе, она потом в виде sql кода показывается, просто берешь его и копируешь потом аргументом в QSqlQuery.exec
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sonnenstein
  опции профиля:
сообщение 5.12.2012, 7:29
Сообщение #4


Новичок


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

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




Репутация:   0  


Цитата(mezmay @ 4.12.2012, 16:39) *
не закрыта скобка в CREATE TABLE

Не в скобке дело. Точнее, не только в ней. Еще будут варианты?))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.12.2012, 8:27
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


скорее всего, это база readonly. смотри права юзера и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 5.12.2012, 8:31
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


правильно пишется AUTO_INCREMENT, а не AUTOINCREMENT. И для VARCHAR он, скорее всего, не работает

Сообщение отредактировал mezmay - 5.12.2012, 11:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.12.2012, 16:58
Сообщение #7


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

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

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




Репутация:   94  


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


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 6.12.2012, 0:58) *
я подозреваю, что БД изначально была не MySQL, т.к. в ней нет последовательностей/генераторов.
И первичный ключ, похоже не там объявлен.

Совершенно верно, это была таблица под Oracle, до меня это дошло несколько позже, но последовательности и триггеры были закомментированны, так что толку от них не было. ПК был объявлен, но в синтаксисе опять же Oracle. В этом-то и была проблема

Цитата(Iron Bug @ 5.12.2012, 16:27) *
скорее всего, это база readonly. смотри права юзера и т.п.

Бинго=) В принципе, это был главные затык, так что большое спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 0:39