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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с QSqlDatabase::removeDatabase() в Release mode  (Прочитано 6964 раз)
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.

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

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

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

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




Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 07, 2011, 09:16 »

Точную жалобу покажите, пожалуйста.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #2 : Июль 07, 2011, 09:17 »

Вроде, все в норме. Вполне может из-за чего-то другого падать.

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
juggernaut
Гость
« Ответ #3 : Июль 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();

??
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Июль 07, 2011, 09:29 »

А то очень некрасиво
Ещё очень не нравится, что запрос принимается строкой, в итоге параметры, как всегда, будут в строку вставляться простым сложением без всякой фильтрации. *это такой Ванга mode*
Записан
juggernaut
Гость
« Ответ #5 : Июль 07, 2011, 09:31 »

не, всё строки для запросов формируются в других функциях, которые будут вызывать эту, с помощью QString::arg()
Записан
juggernaut
Гость
« Ответ #6 : Июль 07, 2011, 09:32 »

собственно это мелочи, в Debug всё работает как надо ....
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #7 : Июль 07, 2011, 09:33 »

Давай, наверное, больше кода и точную ошибку + бэктрейс, а то гадать долго будем.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
juggernaut
Гость
« Ответ #8 : Июль 07, 2011, 09:35 »

окей
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Июль 07, 2011, 09:47 »

не, всё строки для запросов формируются в других функциях, которые будут вызывать эту, с помощью QString::arg()
QString::arg() ничего не знает про Sql и соответственно не фильтрует параметры ( не экранирует символы и т.п.): http://xkcd.ru/327/

собственно это мелочи, в Debug всё работает как надо...
Когда допишете программу отдавать тоже дебажный исполняемый файл будете?
Записан
juggernaut
Гость
« Ответ #10 : Июль 07, 2011, 09:51 »

конечно нет, релизный, в том то и проблема

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

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

ладно, я выложу полную версию жалобу на heap corruption, тогда посмотрим
Записан
juggernaut
Гость
« Ответ #11 : Июль 07, 2011, 13:00 »

Всё оказалось намного проще ... только не бейте больно по голове

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

но зато хоть в QtSql разобрался более чем исчерпывающе ))))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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