Russian Qt Forum

Qt => Базы данных => Тема начата: lrx2 от Декабрь 16, 2011, 23:16



Название: Как правильно отключить БД?
Отправлено: lrx2 от Декабрь 16, 2011, 23:16
Снова я.
При попытке
Код:
    qDebug() << "BeforeDelete" << db.connectionNames();
    db.close();
    QSqlDatabase::removeDatabase(db.connectionName());
    qDebug() << "AfterDelete" << db.connectionNames();
В дебаг-консоль выводится:
Код:
BeforeDelete ("qt_sql_default_connection") 
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
AfterDelete ()
Никаких вьюшек\моделей\запросов к БД в проге нет.

БД подключается сл. образом:
Код:
db = QSqlDatabase::addDatabase(tr("QPSQL"));
        if(!db.isValid()){
            QString qs;
            qs.append(tr("DLL драйверов для PostgreSQL не найдены:\n\n'%1;'").arg(db.lastError().text()));
            qs.append(tr("\n\nDll должны располагаться по одному из путей : \n\n%1\n\n\n%2").arg(QApplication::libraryPaths() [0],QApplication::libraryPaths()[1]));
            FATAL(qs);
            return;
        }

        db.setHostName("localhost");
        db.setDatabaseName("dlongbase");
        db.setUserName("postgres");
        db.setPassword("pswd");
        db.setPort(5432);

        if (!db.open()){
            FATAL(tr("Невозможно подключиться к указанной БД:\n\n%1::%2").arg(db.hostName(), db.databaseName()));
            return;
        }
Что может быть не так?
Всмсле - очень хочется  устранить надпись:"
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work." -
ровно как и причину её появления..


Название: Re: Как правильно отключить БД?
Отправлено: Странник от Декабрь 16, 2011, 23:31
читайте доки = )

Цитировать
void QSqlDatabase removeDatabase ( const QString &connectionName ) [static]

Removes the database connection connectionName from the list of database connections.
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.

Example:
Код:
    // WRONG
    QSqlDatabase db = QSqlDatabase::database("sales");
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
    QSqlDatabase::removeDatabase("sales"); // will output a warning
    
    // "db" is now a dangling invalid database connection,
    // "query" contains an invalid result set

The correct way to do it:
Код:
    {
        QSqlDatabase db = QSqlDatabase::database("sales");
        QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
    }
    // Both "db" and "query" are destroyed because they are out of scope
    QSqlDatabase::removeDatabase("sales"); // correct


Название: Re: Как правильно отключить БД?
Отправлено: lrx2 от Декабрь 17, 2011, 00:49
Ага, спасибо.
Почему-то именно там, где надо, смотреть не стал...
Т.е., чтоб QSqlDatabase::removeDatabase без ошибок и ругани сработал,
надо и объект бд чтоб уже разрушился?

...Убрал объект QSqlDataBase из глобальной области видимости -
он терь только в функции коннекта к базе есть.

Код:
    QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());
    qDebug() << "AfterDelete" << QSqlDatabase::database().connectionNames();
Ничего не изменилось.


Название: Re: Как правильно отключить БД?
Отправлено: arhohryakov от Декабрь 17, 2011, 01:48
Возможно у тебя база связана с моделями и отображениями.
Посмотри http://www.prog.org.ru/index.php?topic=20166.msg136812#msg136812


Название: Re: Как правильно отключить БД?
Отправлено: lrx2 от Декабрь 17, 2011, 08:11
"Старый баян" уже видел.
Как уже писал выше, все вьюхи и пр. отключены.
Код:
QString qs;
    {
        qs.append(QSqlDatabase::database().connectionName());
    }
    QSqlDatabase::removeDatabase(qs);
    qDebug() << "AfterDelete" << QSqlDatabase::database().connectionNames();
Так сработало.
Всем спасибо)


Название: Re: Как правильно отключить БД?
Отправлено: AlekseyK от Январь 19, 2012, 05:49
Благодарю и мне помогло! :)