探究QSqlDatabase::removeDatabase

2023-12-13 19:57:18

?sqlite2.h

#pragma once
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
class sqlite2
{
public:
	sqlite2();
	~sqlite2();
};

sqlite2.cpp

#include "sqlite2.h"

sqlite2::sqlite2()
{
    QSqlDatabase database;
    if (QSqlDatabase::contains("connection"))
    {
        database = QSqlDatabase::database("connection");
    }
    else {
        database = QSqlDatabase::addDatabase("QSQLITE", "connection");
        database.setDatabaseName("identifier.sqlite");
    }
    if (!database.open())
    {
        qDebug() << "Error: Failed to connect database." << database.lastError();
    }
    else {
        QSqlQuery query(database);
        query.exec("select * from kmd_menu");
        if (!query.exec())
        {
            qDebug() << "Error:" << query.lastError();
        }
        else {
            while (query.next())
            {
                qDebug() << query.value("name").toString();
            }
        }
        database.close();
    }
    (1)database.removeDatabase("connection");
    (2)QSqlDatabase::removeDatabase("connection");
}
sqlite2::~sqlite2()
{
    qDebug() << "~Sqlite2()"; 
    (3)QSqlDatabase::removeDatabase("connection");
}

.cpp文件中有removeDatabase("connection");

进行3次对比实验,每次执行其中的一条语句。

选择(1),(2)都会出现下面的信息:

QSqlDatabasePrivate::removeDatabase: connection 'connection' is still in use, all queries will cease to work.

选择(3)不会。

?参考:Qt移除数据库removeDatabase()时发出警告-CSDN博客

在removeDatabase之前,要确保query和database已经被删除了。

在(1),(2)处调用该语句时,database没有被删除,所以出现了该信息。

而在(3)处调用该语句时,query和database的生命周期都结束,被析构了。

文章来源:https://blog.csdn.net/weixin_51883798/article/details/134850985
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。