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
Спасибо, Пантер!