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

Суть такова: пишу на 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;
}
mezmay
не закрыта скобка в CREATE TABLE
vankleef
Посоветую на будующее использовать MySQL Workbench-бесплатная программа для работы с MySQL.
Там удобная штука есть: когда таблицу создаешь в визуальном редакторе, она потом в виде sql кода показывается, просто берешь его и копируешь потом аргументом в QSqlQuery.exec
Sonnenstein
Цитата(mezmay @ 4.12.2012, 16:39) *
не закрыта скобка в CREATE TABLE

Не в скобке дело. Точнее, не только в ней. Еще будут варианты?))
Iron Bug
скорее всего, это база readonly. смотри права юзера и т.п.
mezmay
правильно пишется AUTO_INCREMENT, а не AUTOINCREMENT. И для VARCHAR он, скорее всего, не работает
Litkevich Yuriy
я подозреваю, что БД изначально была не MySQL, т.к. в ней нет последовательностей/генераторов.
И первичный ключ, похоже не там объявлен.
Sonnenstein
Цитата(Litkevich Yuriy @ 6.12.2012, 0:58) *
я подозреваю, что БД изначально была не MySQL, т.к. в ней нет последовательностей/генераторов.
И первичный ключ, похоже не там объявлен.

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

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

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