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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование QSqlTableModel  (Прочитано 7001 раз)
Garfild
Гость
« : Март 16, 2010, 15:06 »

Доброго времени суток!!!
Есть такая проблеммка...почему-то при использовании QSqlTableModel и закрытии после этого программы выскакивет предупреждение
Код
C
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
 
Делаю так
Код
C++ (Qt)
QSQlTableModel *model = new QSqlTableModel;
model->setTable("table");
model->select();
ui.tableView->setModel(model);
 
Записан
MoPDoBoPoT
Гость
« Ответ #1 : Март 16, 2010, 15:39 »

Цитата: QtAssistant
void QSqlDatabase::removeDatabase ( const QString & connectionName )   [static]
Убирает соединение connectionName из списка соединений с базой данных.
Внимание: Во время вызова этой функции не должно быть открытых запросов к данной базе данных, в противном случае произойдёт утечка ресурса (resource leak).

Пример:
Код:
 // НЕПРАВИЛЬНО
 QSqlDatabase db = QSqlDatabase::database("sales");
 QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 QSqlDatabase::removeDatabase("sales"); // породит предупреждение

 // "db" в данный момент висит на неправильном соединении с БД,
 // "query" содержит неправильный результат

Вот правильный вариант реализации:
Код:
 {
     QSqlDatabase db = QSqlDatabase::database("sales");
     QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
 }
 // Оба, "db" и "query", уничтожаются при выходе из их блока
 QSqlDatabase::removeDatabase("sales"); // правильно

Для удаления соединения по умолчанию, которое может быть создано вызовом addDatabase() без указания имени соединения, вы можете отыскать имя соединения по умолчанию вызвав connectionName() на базе данных, возвращаемой database(). Обратите внимание на то, что если база данных по умолчанию не была создана, то будет возвращена неверная база данных.
К моменту удаления соединения, у тебя оказался не разрушенным объект, связанный с БД.
Записан
Garfild
Гость
« Ответ #2 : Март 16, 2010, 16:13 »

ЭТ я знаю...т.е. получается,что при работе с QSQlTableModel создается новое соединение с БД??? Если вместо QSQlTableModel использовать QSqlQueryModel то таких предупреждение не возникает
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Март 16, 2010, 17:17 »

Новое соединение не создается, просто соединение удерживается моделью. Просто перед удалением соединения, удали модель.
Записан

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

Написал вот такую функцию:
Код:
void MainForm::closeEvent(QCloseEvent *event) {
    if(event){
        QSqlDatabase db = QSqlDatabase::database();
        if (db.isOpen())
            db.close();
    }
    QSqlDatabase::removeDatabase("dbName");
}

но сообщение все равно вылазит...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #5 : Ноябрь 09, 2010, 00:42 »

Мдя. Некропостеры активировались. Осень что ли сказывается. Улыбающийся
Модели используешь? В closeEvent они еще не удалены.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
chu
Гость
« Ответ #6 : Ноябрь 09, 2010, 01:44 »

дописал:
Код:
void MainForm::closeEvent(QCloseEvent *event) {
    if(event){
        mysqlModel->clear();
        mysqlTableView->close();
        QSqlDatabase db = QSqlDatabase::database();
        if (db.isOpen())
            db.close();
    }
    QSqlDatabase::removeDatabase("proton");
}
но сообщение все равно вылазит!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #7 : Ноябрь 09, 2010, 10:12 »

Код
C++ (Qt)
void MainForm::~MainForm() {
 delete mysqlModel;
 QSqlDatabase::database().close();
 QSqlDatabase::removeDatabase("proton");
}
Записан

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

Цитировать
Делаю так
Код

C++ (Qt)
QSQlTableModel *model = new QSqlTableModel;
model->setTable("table");
model->select();
ui.tableView->setModel(model);
 

а может не заниматься ерундой и просто назначить модели парента??
Код:
QSqlTableModel *model = new QSqlTableModel(this);
Записан
chu
Гость
« Ответ #9 : Ноябрь 09, 2010, 13:33 »

Спасибо, Пантер!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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