Russian Qt Forum
Ноябрь 24, 2024, 11:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Sqlite Create Table в QSqlQuery  (Прочитано 13808 раз)
EgorRa
Гость
« : Август 30, 2010, 20:21 »

Когда делаю запрос на создание таблицы, query возвращает false. Не могу понять почему( Запрос выполняется, таблица создается, а сообщение выскакивает(
Вот листинг функции:
Код:
void GenerateNewBase::createTableCourse()
{
    QSqlQuery *query = new QSqlQuery(QSqlDatabase::database("localConnect"));
    if(!query->exec("CREATE TABLE course(course_pk INTEGER PRIMARY KEY, name TEXT, number INTEGER NOT NULL,"
                                         " position INTEGER NOT NULL UNIQUE)"));
    {
        QMessageBox::critical(0, QObject::tr("Cannot create table"),
                QObject::tr("Unable to create table course.\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);
    }
    delete query;
}

Объясните в чем моя ошибка плизз
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 30, 2010, 20:35 »

1. Не создавай QSqlQuery в куче, но это так, к ошибке не относится.
2. Дай сюда вывод query->lastError ().text (). Нужно будет подключить #include <QtSql/QSqlError>.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
EgorRa
Гость
« Ответ #2 : Август 30, 2010, 20:55 »

Там пусто(
А почему не стоит создавать запрос в куче?
« Последнее редактирование: Август 30, 2010, 20:57 от EgorRa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 30, 2010, 20:58 »

Как подключаешься к базе? Данной таблицы в ней точно нет?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #4 : Август 30, 2010, 20:59 »

Там пусто(
А почему не стоит создавать запрос в куче?
А зачем? Что бы его потом удалить через delete?  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 30, 2010, 21:09 »

Там пусто(
А почему не стоит создавать запрос в куче?
А зачем? Что бы его потом удалить через delete?  Улыбающийся
И плюс в том, что в стеке создается быстрее и менее затратно.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
EgorRa
Гость
« Ответ #6 : Август 30, 2010, 21:12 »

Как подключаешься к базе? Данной таблицы в ней точно нет?

Я создаю весь файл заново:

Код:
bool checkAvailabilityDatabase(const QString baseName)
{
    if (!(QFile(baseName).exists()))
    {
        QMessageBox msg;
        msg.setWindowTitle(QObject::tr("Error"));
        msg.setText(QObject::tr("База данных не была найдена! \nБудет создана навая база данных"));
        msg.exec();
        return false;
    }
    return true;
}

static bool createLocalConnection()
{
    if(checkAvailabilityDatabase("LocalBase\\database.db"))
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","localConnect");
        db.setDatabaseName("LocalBase\\database.db");
        if (!db.open())
        {
            QMessageBox::critical(0, QObject::tr("Cannot open database"),
                QObject::tr("Unable to establish a database connection.\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);
            return false;
        }
    }
    else
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","localConnect");
        db.setDatabaseName("LocalBase\\database.db");
        GenerateNewBase nb;
        nb.create();
    }
    return true;
}

GenerateNewBase.cpp
Код:

bool GenerateNewBase::create()
{
   ...
    createTableCourse();

    ...
}

void GenerateNewBase::createTableCourse()
{
    QSqlQuery query(QSqlDatabase::database("localConnect"));
    if(!query.exec("CREATE TABLE course(course_pk INTEGER PRIMARY KEY, name TEXT, number INTEGER NOT NULL,"
                                         " position INTEGER NOT NULL UNIQUE)"));
    {
        QTextBrowser *textBrowser = new QTextBrowser;
        textBrowser->setText(query.lastError().text());

        textBrowser->show();

        QMessageBox::critical(0, QObject::tr("Cannot create table"),
                QObject::tr("Unable to create table course.\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);


    }
}


Типа, если файла нет, то создаю его.
Естественно для создания нужной ситуации я его удаляю базу перед запуском.
Записан
BRE
Гость
« Ответ #7 : Август 30, 2010, 21:16 »

Код
C++ (Qt)
static bool createLocalConnection()
{
   if(checkAvailabilityDatabase("LocalBase\\database.db"))
   {
...
   }
   else
   {
       QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","localConnect");
       db.setDatabaseName("LocalBase\\database.db");
// <<<<< Где открытие базы ???
       GenerateNewBase nb;
       nb.create();
   }
   return true;
}
 
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Август 30, 2010, 21:18 »

Блин, опередил. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Август 30, 2010, 21:19 »

Проверку на наличие базы можешь не делать. Если база создана и созданы таблицы, повторное их создание просто проигнорируется.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
EgorRa
Гость
« Ответ #10 : Август 30, 2010, 21:25 »

Код
C++ (Qt)
static bool createLocalConnection()
{
   if(checkAvailabilityDatabase("LocalBase\\database.db"))
   {
...
   }
   else
   {
       QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","localConnect");
       db.setDatabaseName("LocalBase\\database.db");
// <<<<< Где открытие базы ???
       GenerateNewBase nb;
       nb.create();
   }
   return true;
}
 


упс))) завтыкал((

ошибку исправил
Код:
 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","localConnect");
        db.setDatabaseName("LocalBase\\database.db");
        if (!db.open())
        {
            QMessageBox::critical(0, QObject::tr("Cannot open database"),
                QObject::tr("Unable to establish a database connection.\n"
                         "Click Cancel to exit."), QMessageBox::Cancel);
            return false;
        }
        GenerateNewBase nb;
        nb.create();

но результат не изменился(((


Проверку на наличие базы можешь не делать. Если база создана и созданы таблицы, повторное их создание просто проигнорируется.
В данной программе мне важно сообщить пользователю об отсутствии файла)))

База создается, таблица создается. А ошибка все равно выскакивает(
« Последнее редактирование: Август 30, 2010, 21:32 от EgorRa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Август 30, 2010, 21:36 »

Сделай небольшой компилябельный пример с данной ошибкой и сюда выложи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #12 : Август 30, 2010, 21:46 »

А что сообщает lastError() после выполнения exec()?
Записан
EgorRa
Гость
« Ответ #13 : Август 30, 2010, 22:24 »

Сделай небольшой компилябельный пример с данной ошибкой и сюда выложи.
Вот
Записан
EgorRa
Гость
« Ответ #14 : Август 30, 2010, 22:25 »

А что сообщает lastError() после выполнения exec()?

Там пусто(



Нашел ошибку)) все оказалось так просто((((

if(!query->exec("CREATE TABLE course(course_pk INTEGER PRIMARY KEY, name TEXT, number INTEGER NOT NULL,"
                                         " position INTEGER NOT NULL UNIQUE)"));
« Последнее редактирование: Август 31, 2010, 00:26 от EgorRa » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.193 секунд. Запросов: 23.