Russian Qt Forum

Qt => Базы данных => Тема начата: EgorRa от Август 30, 2010, 20:21



Название: Sqlite Create Table в QSqlQuery
Отправлено: 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;
}

Объясните в чем моя ошибка плизз


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 20:35
1. Не создавай QSqlQuery в куче, но это так, к ошибке не относится.
2. Дай сюда вывод query->lastError ().text (). Нужно будет подключить #include <QtSql/QSqlError>.


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: EgorRa от Август 30, 2010, 20:55
Там пусто(
А почему не стоит создавать запрос в куче?


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 20:58
Как подключаешься к базе? Данной таблицы в ней точно нет?


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: BRE от Август 30, 2010, 20:59
Там пусто(
А почему не стоит создавать запрос в куче?
А зачем? Что бы его потом удалить через delete?  :)


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 21:09
Там пусто(
А почему не стоит создавать запрос в куче?
А зачем? Что бы его потом удалить через delete?  :)
И плюс в том, что в стеке создается быстрее и менее затратно.


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: EgorRa от Август 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);


    }
}


Типа, если файла нет, то создаю его.
Естественно для создания нужной ситуации я его удаляю базу перед запуском.


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: BRE от Август 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;
}
 


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 21:18
Блин, опередил. :)


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 21:19
Проверку на наличие базы можешь не делать. Если база создана и созданы таблицы, повторное их создание просто проигнорируется.


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: EgorRa от Август 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();

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


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

База создается, таблица создается. А ошибка все равно выскакивает(


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Пантер от Август 30, 2010, 21:36
Сделай небольшой компилябельный пример с данной ошибкой и сюда выложи.


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: BRE от Август 30, 2010, 21:46
А что сообщает lastError() после выполнения exec()?


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: EgorRa от Август 30, 2010, 22:24
Сделай небольшой компилябельный пример с данной ошибкой и сюда выложи.
Вот


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: EgorRa от Август 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)"));


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Kuper от Сентябрь 21, 2010, 14:26
А что сообщает lastError() после выполнения exec()?

Там пусто(



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

if(!query->exec("CREATE TABLE course(course_pk INTEGER PRIMARY KEY, name TEXT, number INTEGER NOT NULL,"
                                         " position INTEGER NOT NULL UNIQUE)"));

А можно для тех кто на бронепоезде, в чем ошибка была? Только в "." и "->"? Аналогичная ситуация:

        db = QSqlDatabase::addDatabase("QSQLITE", "LocalConnaction");
        db.setDatabaseName(QString("TestDB"));
        if (db.open())
        {
            QSqlQuery query(QSqlDatabase::database("LocalConnaction"));
            if ( query->exec("CREATE TABLE test(id INTEGER)") )
            {
               ui->TBStatus->setText("Fail. Query error: " + query.lastError().text() + "DB error: " + db.lastError().text());
            }
            else
            {
               ui->TBStatus->setText("Query OK");
            }
        }

Получаю следующий текст: Fail. Query error: DB error: (Т.е ошибок нет)
 


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: BRE от Сентябрь 21, 2010, 14:31
А так компилируется?


Название: Re: Sqlite Create Table в QSqlQuery
Отправлено: Kuper от Сентябрь 21, 2010, 14:36
А так компилируется?

Сорри. Стоило запостить сообщение, что бы понять свою ошибку. 2 ошибки.
1. query->exec конечно же не компилится, это я проверял и забыл убрать. Правильно query.exec
2. Получаю следующий текст: Fail. Query error: DB error: (Т.е ошибок нет) потому, что логику не правильно написал. Правильно if ( !query.exec("CREATE TABLE test(id INTEGER)") )