powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT, QSqlDatabase, приложение не завершается
11 сообщений из 11, страница 1 из 1
QT, QSqlDatabase, приложение не завершается
    #34512826
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток.
Собственно, сабж в названии.
Qt 4.2.3, WinXP SP2, mysql odbc 3.51 drv, mysql 5.1.11, Dev-C++,mingw32 3.4.2
есть окно, унаследованное от QMainFrame. в нем в конструкторе устанавливается соединение с БД.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
///-----------CMainFrame.cpp

CMainFrame::CMainFrame(...)
{
   ......
   createConnection
   ......
}

....

bool CMainFrame::createConnection()
    {
        db = QSqlDatabase::addDatabase("QODBC");

        db.setHostName("localhost");
        db.setDatabaseName("DRIVER={MySQL ODBC 3.51 Driver};DATABASE=tlgotdb;NAMES=cp1251;");
        db.setUserName("root");
        db.setPassword("root");

        if (!db.open()) {
            QMessageBox::critical( 0 , QObject::tr("Database Error"),
                                  db.lastError().text());
            return false;
        }
        return true;
    }

///------------main.cpp

#include "MainWindow.h"

#include <QtGui/QApplication>
#include <QtCore/QTextCodec>

using namespace MainCode;
using namespace Ui;

int qMain(int argc, char *argv[])
 {
     QCoreApplication::setApplicationName("SkySpeed platform");
     QCoreApplication::setOrganizationName("Floppy soft");

     QTextCodec::setCodecForCStrings( QTextCodec::codecForName("CP1251") );


     QApplication app(argc, argv);
     MainFrame * mainFrame = new MainFrame( 0 );
     mainFrame->show();

 	 return app.exec();
}
.......


так вот. при закрытии окна (оно пока единственное, поэтому приложение автоматом "типа" завершается)
приложение остается висеть в списке процессов (ну, в диспетчере задач)...
если заремить строчку подключения к базе в конструкторе - все ок, приложение завершается. Я пробовал делать в деструкторе окна db.close(), QSqlDatabase::removeDatabase(db.connectionNames()[0]); Короче, извращался по-разному. Доку порыл. Нигде даже просвета нет... гугл молчит.. третий час сижу, не могу вкурить, почему... кстати, если в деструкторе написать db.close() - внутри него зацикливается.... если не писать - я так понял, что QSqlDatabase сам отключает все соединения и удаляет добавленные databases... и тоже виснет, соответственно..

если смутил ASSERT_WITHMSG -
Код: plaintext
1.
#define ASSERT_WITHX,Y if(!X) QMessageBox:: critical( 0 , "Utils::ASSERT_WITHMSG: Ошибка!", Y);

это просто костыль, т.к. в dev-cpp плохо работает отладка...
Если кто может помочь - очень прошу.
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34512838
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простите, вот так:
tAZAR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
///-----------CMainFrame.cpp

CMainFrame::CMainFrame(...)
{
   ......
   ASSERT_WITHcreateConnection(,"Ошибка при подключении к серверу БД!");
   ......
}
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34512886
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще простите... сумбурно вышло...
tAZAR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
///-----------CMainFrame.cpp

MainFrame::MainFrame(QWidget * parent, Qt::WindowFlags flags):QMainWindow(parent,flags)
{
   ......
   ASSERT_WITHcreateConnection(,"Ошибка при подключении к серверу БД!");
   ......
}
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513635
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я жуею! КАК ОНО КОМПИЛИТСЯ???
сигнатура:
QSqlDatabase * addDatabase ( const QString & type, const QString & connectionName = defaultConnection )

db.open() – через точку???
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513650
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://qt.kde.ru/doc/3.0/sql.html#5
говорят, само должно закрываться всё, иначе
QSqlDatabase maintains ownership of the pointers returned by the addDatabase() static function. To remove a database from the list of maintained connections, first close the database with QSqlDatabase::close(), and then remove it using the static function QSqlDatabase::removeDatabase().
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513667
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tAZAR
Код: plaintext
1.
2.
3.
bool CMainFrame::createConnection()
    {
        db = QSqlDatabase::addDatabase("QODBC");
А db объявлена как член класса? Убери ее обратно на стек. То есть пиши так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
bool CMainFrame::createConnection()
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
        db.setHostName("localhost");
        db.setDatabaseName("DRIVER={MySQL ODBC 3.51 Driver};DATABASE=tlgotdb;NAMES=cp1251;");
        ....
}

bool CMainFrame::closeConnection() 
    {
        QSqlDatabase::database().close();
}
Вот этот момент мне в QT очень не нравится, но увы. При объявлении объекта типа QSqlDatabase в любом месте кроме стека появлется большое количество очень странных глюков.

И учти что использовать QSqlDatabase::database() можно только после того как соединение с базой было хотя бы раз настроенно и установленно. Попытки использовать QSqlDatabase::database() сразу после создания, но до определения параметров приводит к странным глюкам. Например такой код будет работать, но давать варнинги "база данных не открыта":
Код: plaintext
1.
2.
        QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
        QSqlDatabase::database().setHostName("localhost");
        QSqlDatabase::database().setDatabaseName("DRIVER={MySQL ODBC 3.51 Driver};DATABASE=tlgotdb;NAMES=cp1251;");
В общем, на мой взгляд QSql модуль недостаточно продуман...
Там все надо делать так и только так как показано в примерах, шаг влево - шаг вправо считается за попытку ГПФа...
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513668
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа… это третья :)
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513681
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoя жуею! КАК ОНО КОМПИЛИТСЯ???
сигнатура:
QSqlDatabase * addDatabase ( const QString & type, const QString & connectionName = defaultConnection )
db.open() – через точку???Да, да, да. Как ни странно это все компилится и работает :)
Вот такой этот С++ загадочный - переопределят операторы для класса а потом у простых прикладных программистов мозги кипят "толи это указатель, толи ссылка, толи копирование объекта или что это вообще за фигня?"
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34513702
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в четвёртой сигнатурка другая
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34515185
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo
Все прекрасно компилиться.. Сделано, кстати, точно как написано в Qt Assistant...

Насчет сигнатуры QSqlDatabase* QSqlDatabase::addDatabase...
там не указатель возвращается.

Еще факт - дома все нормально... процесс завершается...
Короче, я как понял, луна просто не в той фазе у меня дома.

сейчас попробую вынести из класса, как советовали..
...
Рейтинг: 0 / 0
QT, QSqlDatabase, приложение не завершается
    #34515218
Фотография tAZAR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot White OwlА db объявлена как член класса? Убери ее обратно на стек. То есть пиши так:..
[/quot]

Большое спасибо :-) Заработало.
Ну, блин, они там намудрили че-то... Надо будет проверить еще на паре-тройке наших компов... Мож - теперь на них и у меня дома завершаться перестанет :-)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT, QSqlDatabase, приложение не завершается
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]