Здравствуйте, гость ( Вход | Регистрация )
fortero | Дата 29.4.2011, 16:28 |
Что делать? Скорее всего, у тебя остаются висеть незакрытые запросы. Причём не обязательно именно QSqlQuery, но и в виде QSqlQueryModel, QSqlTableModel и так далее по иерархии. Убедись, что к моменту закрытия соединения, все твои модели и запросы либо выходять из области видимости (если создавались на стеке):
либо удаляются оператором delete или родителем (если создал их как QSqlQuery *query = new QSqlQuery). В моём случае проблема была именно в этом. А Вы можите написать пример как правельно это сделать с передачей в конструктор? Буду очень признателен! |
|
silver | Дата 8.8.2008, 22:33 |
Так чтоли? Ну, как один из вариантов:
Хотя я бы всё-таки создал именованное соединение в конструкторе, и не открывал его. Эта операция практически не займёт ни времени, ни ресурсов. Зато когда БД понадобится, можно сразу открывать её и работать, без всяких дополнительных проверок. |
|
acen83 | Дата 7.8.2008, 18:45 |
Есть функции QSqlDatabase::isOpen() и QSqlDatabase::isValid(), которые именно это и делают. Так чтоли? QSqlDatabase db=QSqlDatabase::database(); if (!db.isValid()) { db.addConnection("QMYSQL"); // добавление логинов, пассов и т.п. } return db; |
|
Litkevich Yuriy | Дата 7.8.2008, 16:23 |
Что ещё за сообщение о закрытии старой БД? да он дважды одно и тоже соединение создает: QSqlDataBase* bd=QSqlDataBase::addConnection("QMYSQL"); // настройка базы, логина и т.п. bd->open(); // запросы bd->close(); затем в другом месте программы повторяя этот код появляется предупреждение QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work. |
|
silver | Дата 7.8.2008, 16:01 |
Remove database у меня есть, но он закрывает только ругательства о незакрытых запросах, а сообщения о закрытии старой БД все равно остаются Может я чего-то пропустил? Что ещё за сообщение о закрытии старой БД? В первом посте ты указал только одно сообщение: о том, что на момент закрытия соединения остались запросы, которые это соединение используют. Плохо что нет какой-нибудь функции наподобие clear() и соответственно isNull(), для того чтобы определять была инициализирована база или нет. Так получить базу через QSqlDatabase::database() конечно можно, но как проверить была она уже настроена или нет Есть функции QSqlDatabase::isOpen() и QSqlDatabase::isValid(), которые именно это и делают. |
|
Litkevich Yuriy | Дата 7.8.2008, 8:33 |
у меня в классе главного окна создается экземпляр "одиночки" Да, надо было полнее прокоментировать. Это у меня для авторизации пользователей программы, но там же и соединение с БД хранящих настройки пользователей. А соединение с основной БД так: далее после конструктора, т.е. после того как окно программы отобразится создается соединение основной БД. |
|
Tonal | Дата 7.8.2008, 7:47 |
2 Litkevich Yuriy Нет нужды делать соединение с БД одиночкой, т.к. оно само только удобный интерфейс к реальному соединению, которое уже одиночка. Вроде с тобой же обсуждали в "переводах" значение value type в данном контексте. |
|
Litkevich Yuriy | Дата 7.8.2008, 0:09 |
у меня в классе главного окна создается экземпляр "одиночки", а внем соединение с БД настроек приложения (это я так решил вместо всяких ини-конфигов сделать). далее после конструктора, т.е. после того как окно программы отобразится создается соединение основной БД. исходник
|
|
acen83 | Дата 6.8.2008, 19:51 |
2 Litkevich Yuriy: clear() - возвращало бы все в начальное состояние, как при запуске программы. Дело в том что после QSqlDatabase::removeDatabase("qt_default_connection_что_то_типа_этого") в списке соединений ничего нет. Т.е. базу мы закрыли, удалили соединение, а при запуске новой базы ругательство все равно остается - непорядок. У меня при нажатии на кнопку происходит инициализация БД, настройка БД, выполнение запросов, закрытие всего этого хозяйства. Получается в разных частях программы надо создавать именованные соединения, причем вынесенные в конструктор? че то некрасиво как то, тем более вероятность нажатия кнопки - 1 к 100. |
|
Litkevich Yuriy | Дата 6.8.2008, 19:19 |
во-первых, в программе работай по порядку, и давай имена соединениям. И по этим именам обращайся к соединению. во-вторых, в Qt'ях работа идет с именоваными соединениями, Цитата Используйте contains(), чтобы видеть если заданное имя соединения в списке соединений если нет то надо создать, а вообще удалять соединение, все-таки нужды нет. функции наподобие clear() и соответственно isNull() что должны были бы делать эти функции, еслиб они были? |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 18:31 |