无法删除 QSql数据库 - 查询仍处于活动状态

QSqlDatabase can't be removed - Queries still active

本文关键字:活动状态 查询 删除 QSql 数据库      更新时间:2023-10-16

我最近开始使用c ++ QT。我创建了类"ControllerOfDB"来保存指向我的QSqlDatabase的指针和一些函数(进行插入/选择(。示例选择功能:

QList<data1> GetData1()
{
  QList<data1> output;
  if(!dataBase->isOpen())
      dataBase->open();
  if(dataBase->isOpen())
  {
    QSqlQuery* query = new QSqlQuery(*dataBase);
    query->prepare("SELECT * FROM table1");
    if(query->exec())
    while (query->next())
    {
        output.append( *(new data1(
                               query->value(0).toInt(), 
                               query->value(1).toString(), 
                               query->value(2).toInt(),
                               query->value(3).toInt(),
                               query->value(4).toInt(),
                               ))  );
    }
    query->clear();
    query->finish();
    delete query;
  }
  return output;
}

一切都很好,直到我不得不添加更改数据库或以其他用户身份登录的可能性。我修改了连接和断开连接功能。经过几次迭代,这就是我得到的:

void Connect()
{
    dataBase = new QSqlDatabase(QSqlDatabase::addDatabase("QPSQL", "Main"));
    dataBase->setHostName(hostName);
    dataBase->setPort(port);
    dataBase->setDatabaseName(dbName);
    dataBase->setUserName(userName);
    dataBase->setPassword(userPass);
    if(!dataBase->isOpen())
        dataBase->open();
}
 void Disconnect()
 {
    if(dataBase != NULL)
      if(dataBase->isOpen()){
        dataBase->close();
        dataBase->removeDatabase("Main");
        dataBase = NULL;
      }
 }

hostName、port、dbName、userName 和 userPass 也是该类的属性。

public:
  QSqlDatabase *dataBase;
  QString hostName;
  int port;
  QString dbName;
  QString userName;
  QString userPass;

每当我尝试 diconnect 并创建新连接时,我都会收到有关当前连接查询的警告/错误 - 即使我只"连接"( = 使用的函数 Connect(( (。我已经看到很少类似的主题和文档,说我必须从范围中删除查询,但此时我不知道如何。

当您查看QSqlDatabase文档时,方法removeDatabase是静态的,因此您的方法Disconnect逻辑应该是这样的:

void Disconnect()
{
    if(dataBase != NULL) {
        if(dataBase->isOpen()){
            dataBase->close();
        }
        delete dataBase;
        dataBase = NULL;
    }
    QSqlDatabase::removeDatabase("Main");
}