【问题标题】:QSqlDatabase can't be removed - Queries still active无法删除 QSqlDatabase - 查询仍处于活动状态
【发布时间】:2016-02-09 16:38:31
【问题描述】:

我最近开始使用 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;

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

【问题讨论】:

    标签: c++ postgresql qt


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-12
      • 2014-09-18
      • 2019-08-01
      • 2019-11-15
      • 2011-01-05
      • 2019-02-15
      相关资源
      最近更新 更多