无法删除QSqlDatabase - 查询仍处于活动状态

时间:2016-02-09 16:38:32

标签: c++ postgresql qt

我最近开始使用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并创建新连接时,我都会收到有关当前连接查询的警告/错误 - 即使我只是连接了#34; (=使用函数Connect())。 我已经看过很少类似的主题和文档,说我必须从范围中删除查询,但此时我不知道如何。

1 个答案:

答案 0 :(得分:0)

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

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