Некорректное закрытие QSqlDatabase, при использовании QSqlTableModel |
Здравствуйте, гость ( Вход | Регистрация )
Некорректное закрытие QSqlDatabase, при использовании QSqlTableModel |
acen83 |
6.8.2008, 18:41
Сообщение
#11
|
Студент Группа: Участник Сообщений: 23 Регистрация: 11.2.2008 Пользователь №: 91 Спасибо сказали: 0 раз(а) Репутация: 0 |
Скорее всего, у тебя остаются висеть незакрытые запросы Remove database у меня есть, но он закрывает только ругательства о незакрытых запросах, а сообщения о закрытии старой БД все равно остаются Плохо что нет какой-нибудь функции наподобие clear() и соответственно isNull(), для того чтобы определять была инициализирована база или нет. Так получить базу через QSqlDatabase::database() конечно можно, но как проверить была она уже настроена или нет |
|
|
Litkevich Yuriy |
6.8.2008, 19:19
Сообщение
#12
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
во-первых, в программе работай по порядку, и давай имена соединениям. И по этим именам обращайся к соединению.
во-вторых, в Qt'ях работа идет с именоваными соединениями, Цитата Используйте contains(), чтобы видеть если заданное имя соединения в списке соединений если нет то надо создать, а вообще удалять соединение, все-таки нужды нет. функции наподобие clear() и соответственно isNull() что должны были бы делать эти функции, еслиб они были? |
|
|
acen83 |
6.8.2008, 19:51
Сообщение
#13
|
Студент Группа: Участник Сообщений: 23 Регистрация: 11.2.2008 Пользователь №: 91 Спасибо сказали: 0 раз(а) Репутация: 0 |
2 Litkevich Yuriy:
clear() - возвращало бы все в начальное состояние, как при запуске программы. Дело в том что после QSqlDatabase::removeDatabase("qt_default_connection_что_то_типа_этого") в списке соединений ничего нет. Т.е. базу мы закрыли, удалили соединение, а при запуске новой базы ругательство все равно остается - непорядок. У меня при нажатии на кнопку происходит инициализация БД, настройка БД, выполнение запросов, закрытие всего этого хозяйства. Получается в разных частях программы надо создавать именованные соединения, причем вынесенные в конструктор? че то некрасиво как то, тем более вероятность нажатия кнопки - 1 к 100. |
|
|
Litkevich Yuriy |
7.8.2008, 0:09
Сообщение
#14
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
у меня в классе главного окна создается экземпляр "одиночки", а внем соединение с БД настроек приложения (это я так решил вместо всяких ини-конфигов сделать). далее после конструктора, т.е. после того как окно программы отобразится создается соединение основной БД.
исходник
|
|
|
Tonal |
7.8.2008, 7:47
Сообщение
#15
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
2 Litkevich Yuriy
Нет нужды делать соединение с БД одиночкой, т.к. оно само только удобный интерфейс к реальному соединению, которое уже одиночка. Вроде с тобой же обсуждали в "переводах" значение value type в данном контексте. |
|
|
Litkevich Yuriy |
7.8.2008, 8:33
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
у меня в классе главного окна создается экземпляр "одиночки" Да, надо было полнее прокоментировать. Это у меня для авторизации пользователей программы, но там же и соединение с БД хранящих настройки пользователей. А соединение с основной БД так: далее после конструктора, т.е. после того как окно программы отобразится создается соединение основной БД.
|
|
|
silver |
7.8.2008, 16:01
Сообщение
#17
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 4.8.2008 Из: Харьков Пользователь №: 250 Спасибо сказали: 1 раз(а) Репутация: 0 |
Remove database у меня есть, но он закрывает только ругательства о незакрытых запросах, а сообщения о закрытии старой БД все равно остаются Может я чего-то пропустил? Что ещё за сообщение о закрытии старой БД? В первом посте ты указал только одно сообщение: о том, что на момент закрытия соединения остались запросы, которые это соединение используют. Плохо что нет какой-нибудь функции наподобие clear() и соответственно isNull(), для того чтобы определять была инициализирована база или нет. Так получить базу через QSqlDatabase::database() конечно можно, но как проверить была она уже настроена или нет Есть функции QSqlDatabase::isOpen() и QSqlDatabase::isValid(), которые именно это и делают. |
|
|
Litkevich Yuriy |
7.8.2008, 16:23
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Что ещё за сообщение о закрытии старой БД? да он дважды одно и тоже соединение создает: 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. |
|
|
acen83 |
7.8.2008, 18:45
Сообщение
#19
|
Студент Группа: Участник Сообщений: 23 Регистрация: 11.2.2008 Пользователь №: 91 Спасибо сказали: 0 раз(а) Репутация: 0 |
Есть функции QSqlDatabase::isOpen() и QSqlDatabase::isValid(), которые именно это и делают. Так чтоли? QSqlDatabase db=QSqlDatabase::database(); if (!db.isValid()) { db.addConnection("QMYSQL"); // добавление логинов, пассов и т.п. } return db; Сообщение отредактировал acen83 - 7.8.2008, 18:47 |
|
|
silver |
8.8.2008, 22:33
Сообщение
#20
|
Новичок Группа: Новичок Сообщений: 8 Регистрация: 4.8.2008 Из: Харьков Пользователь №: 250 Спасибо сказали: 1 раз(а) Репутация: 0 |
Так чтоли? Ну, как один из вариантов:
Хотя я бы всё-таки создал именованное соединение в конструкторе, и не открывал его. Эта операция практически не займёт ни времени, ни ресурсов. Зато когда БД понадобится, можно сразу открывать её и работать, без всяких дополнительных проверок. |
|
|
Текстовая версия | Сейчас: 15.1.2025, 1:39 |