Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT, QSqlDatabase, приложение не завершается / 11 сообщений из 11, страница 1 из 1
08.05.2007, 14:30
    #34512826
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
Всем доброго времени суток.
Собственно, сабж в названии.
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
08.05.2007, 14:33
    #34512838
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
простите, вот так:
tAZAR
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
///-----------CMainFrame.cpp

CMainFrame::CMainFrame(...)
{
   ......
   ASSERT_WITHcreateConnection(,"Ошибка при подключении к серверу БД!");
   ......
}
...
Рейтинг: 0 / 0
08.05.2007, 14:43
    #34512886
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
и еще простите... сумбурно вышло...
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
08.05.2007, 17:53
    #34513635
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
я жуею! КАК ОНО КОМПИЛИТСЯ???
сигнатура:
QSqlDatabase * addDatabase ( const QString & type, const QString & connectionName = defaultConnection )

db.open() – через точку???
...
Рейтинг: 0 / 0
08.05.2007, 18:00
    #34513650
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
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
08.05.2007, 18:06
    #34513667
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
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
08.05.2007, 18:06
    #34513668
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
аа… это третья :)
...
Рейтинг: 0 / 0
08.05.2007, 18:10
    #34513681
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
maXmoя жуею! КАК ОНО КОМПИЛИТСЯ???
сигнатура:
QSqlDatabase * addDatabase ( const QString & type, const QString & connectionName = defaultConnection )
db.open() – через точку???Да, да, да. Как ни странно это все компилится и работает :)
Вот такой этот С++ загадочный - переопределят операторы для класса а потом у простых прикладных программистов мозги кипят "толи это указатель, толи ссылка, толи копирование объекта или что это вообще за фигня?"
...
Рейтинг: 0 / 0
08.05.2007, 18:18
    #34513702
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
в четвёртой сигнатурка другая
...
Рейтинг: 0 / 0
10.05.2007, 08:47
    #34515185
tAZAR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
QT, QSqlDatabase, приложение не завершается
maXmo
Все прекрасно компилиться.. Сделано, кстати, точно как написано в Qt Assistant...

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

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

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

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


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