Russian Qt Forum

Qt => Базы данных => Тема начата: Garfild от Март 16, 2010, 15:06



Название: Использование QSqlTableModel
Отправлено: 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);
 


Название: Re: Использование QSqlTableModel
Отправлено: MoPDoBoPoT от Март 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(). Обратите внимание на то, что если база данных по умолчанию не была создана, то будет возвращена неверная база данных.
К моменту удаления соединения, у тебя оказался не разрушенным объект, связанный с БД.


Название: Re: Использование QSqlTableModel
Отправлено: Garfild от Март 16, 2010, 16:13
ЭТ я знаю...т.е. получается,что при работе с QSQlTableModel создается новое соединение с БД??? Если вместо QSQlTableModel использовать QSqlQueryModel то таких предупреждение не возникает


Название: Re: Использование QSqlTableModel
Отправлено: Пантер от Март 16, 2010, 17:17
Новое соединение не создается, просто соединение удерживается моделью. Просто перед удалением соединения, удали модель.


Название: Re: Использование QSqlTableModel
Отправлено: chu от Ноябрь 09, 2010, 00:35
Написал вот такую функцию:
Код:
void MainForm::closeEvent(QCloseEvent *event) {
    if(event){
        QSqlDatabase db = QSqlDatabase::database();
        if (db.isOpen())
            db.close();
    }
    QSqlDatabase::removeDatabase("dbName");
}

но сообщение все равно вылазит...


Название: Re: Использование QSqlTableModel
Отправлено: Пантер от Ноябрь 09, 2010, 00:42
Мдя. Некропостеры активировались. Осень что ли сказывается. :)
Модели используешь? В closeEvent они еще не удалены.


Название: Re: Использование QSqlTableModel
Отправлено: chu от Ноябрь 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");
}
но сообщение все равно вылазит!


Название: Re: Использование QSqlTableModel
Отправлено: Пантер от Ноябрь 09, 2010, 10:12
Код
C++ (Qt)
void MainForm::~MainForm() {
 delete mysqlModel;
 QSqlDatabase::database().close();
 QSqlDatabase::removeDatabase("proton");
}


Название: Re: Использование QSqlTableModel
Отправлено: crossly от Ноябрь 09, 2010, 13:23
Цитировать
Делаю так
Код

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

а может не заниматься ерундой и просто назначить модели парента??
Код:
QSqlTableModel *model = new QSqlTableModel(this);


Название: Re: Использование QSqlTableModel
Отправлено: chu от Ноябрь 09, 2010, 13:33
Спасибо, Пантер!