Russian Qt Forum

Qt => Базы данных => Тема начата: juggernaut от Июль 07, 2011, 08:24



Название: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 08:24
Доброго времени суток.

Есть проблема с QSqlDatabase, и с QSQLITE если конкретнее. Платформа Windows XP, Visual Studio 2008, Qt 4.7.x.

Я пишу класс обёртку для БД. Если в кратце, то выглядит всё примерно так


Код:
public class MySqlDB
{
public:
    MySqlDB(QString fileName);

    bool createConnection();
    void close();

    void f1();
    void f2();

private:
    QString CONNECTION_NAME;
    QString dbFile;

    bool createAndExecuteQuery(QString str);
}

MySqlDB::MySqlDB(QString file)
{
....
    dbFile = file;
    CONNECTION_NAME = QString("conn");
}

bool MySqlDB::createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", CONNECTION_NAME)
    db.setDatabaseName(dbFile);
    db.setUserName("user");
    db.setHostName("host");
    db.setPassword("pass");

    if(!db.open())
    {
          return false;
    }
    return true;
}

bool MySqlDB::createAndExecuteQuery(QString str)
{
    QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME);
    QSqlQuery query(db);

    if(!query.exec(str))
    {
          return false;
    }
    return true;
}

void MySqlDB::close()
{
    {
        QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME);
        db.close();
    }
    QSqlDatabase::removeDatabase(CONNECTION_NAME)
}

В Debug mode программа работает нормально, а в Release mode падает на строчке
    QSqlDatabase::removeDatabase(CONNECTION_NAME)

жалуясь на heap corruption.

то есть все действия с БД локализованы в трёх описанных функциях, в остальных функциях никаких вызовов БД не делается.

Перековырял уже весь гугль, ничего приличного так и не нашёл (((((

Если нужно больше инфы - спрашивайте, предоставлю.

Заранее спасибо.






Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: LisandreL от Июль 07, 2011, 09:16
Точную жалобу покажите, пожалуйста.


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: Пантер от Июль 07, 2011, 09:17
Вроде, все в норме. Вполне может из-за чего-то другого падать.

ПыСы:
Код
C++ (Qt)
   if(!query.exec(str))
   {
         return false;
   }
   return true;
 
Замени на
Код
C++ (Qt)
   return query.exec(str);
 
А то очень некрасиво. :)


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 09:27
кода под рукой нет, чуть позже будет, поэтому сейчас точную жалобу кинуть не могу, помню что в free.c вылатает, раздел там про WINHEAP что то

а может быть потому, что экземпляр моего класса MyClass, в котором я вызываю мои БД:

void MyClass::func()
{
.....
    MySqlDB db(file);
    db.createConnection();

    db.f1();

   db.close();
.....
}

создаётся вот так:

MyClass* myClass = new MyClass();
myclass->func();

??


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: LisandreL от Июль 07, 2011, 09:29
А то очень некрасиво
Ещё очень не нравится, что запрос принимается строкой, в итоге параметры, как всегда, будут в строку вставляться простым сложением без всякой фильтрации. *это такой Ванга mode*


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 09:31
не, всё строки для запросов формируются в других функциях, которые будут вызывать эту, с помощью QString::arg()


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 09:32
собственно это мелочи, в Debug всё работает как надо ....


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: Пантер от Июль 07, 2011, 09:33
Давай, наверное, больше кода и точную ошибку + бэктрейс, а то гадать долго будем.


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 09:35
окей


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: LisandreL от Июль 07, 2011, 09:47
не, всё строки для запросов формируются в других функциях, которые будут вызывать эту, с помощью QString::arg()
QString::arg() ничего не знает про Sql и соответственно не фильтрует параметры ( не экранирует символы и т.п.): http://xkcd.ru/327/

собственно это мелочи, в Debug всё работает как надо...
Когда допишете программу отдавать тоже дебажный исполняемый файл будете?


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 09:51
конечно нет, релизный, в том то и проблема

просто все запросы правильные, я сто раз их перепроверил, просмотрел в ручную полученные таблицы

в начале глюки конечно были, но прога тогда падала в других местах .... точнее она не падала, а выдывала ворнинги при не отработке запросов и прочее

ладно, я выложу полную версию жалобу на heap corruption, тогда посмотрим


Название: Re: Проблема с QSqlDatabase::removeDatabase() в Release mode
Отправлено: juggernaut от Июль 07, 2011, 13:00
Всё оказалось намного проще ... только не бейте больно по голове

когда я через стандартную менюшку добавил в проект модуль QtSql, то он линковщику в и Debug и в Release прописал дебажные либы, сейчас поставил нормальные либы - всё заработало

но зато хоть в QtSql разобрался более чем исчерпывающе ))))