Соединение SQL все еще открыто даже после удаления - PullRequest
0 голосов
/ 11 декабря 2011

Во второй раз, когда я пытаюсь подключиться к базе данных, я получаю следующее сообщение:

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

Я удаляю ранее использованную модель, удаляю все соединения и закрываю базу данных.Ниже я включил виджет, который открывает CompanyWidget как модальное диалоговое окно, потому что я думаю, что это может иметь отношение к тому, как я открываю / закрываю виджет, который использует базу данных.Кто-нибудь может объяснить, почему эта база данных все еще используется?

РЕДАКТИРОВАТЬ: Если я изменю элемент QSqlDatabase на указатель и создам его с помощью:

this->CompanyDatabase = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", "CompanyDatabase"));

и удалим его перед повторным добавлениембаза данных:

  if(this->CompanyDatabase)
    {
    delete this->CompanyDatabase;
    this->CompanyDatabase = NULL;
    }

тогда ошибка исчезнет.Почему это отличается от того, как я делал это с элементом без указателя?

EditCompanyWidget.h

#ifndef EditCompanyWidget_H
#define EditCompanyWidget_H

#include "ui_EditCompanyWidget.h"

#include <QDialog>
#include <QSqlDatabase>

class QSqlTableModel;


class EditCompanyWidget : public QDialog, private Ui::EditCompanyWidget
{
Q_OBJECT
public:

  EditCompanyWidget(QSqlDatabase);
  ~EditCompanyWidget();

public slots:

  void on_btnExit_clicked();

protected:
  QSqlTableModel* Model;
};

#endif

EditCompanyWidget.cpp

#include "EditCompanyWidget.h"

#include <iostream>

#include <QSqlDatabase>
#include <QStringList>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QVariant>
#include <QSqlTableModel>
#include <QSqlRecord>

EditCompanyWidget::EditCompanyWidget(QSqlDatabase database) : QDialog(NULL)
{
  setupUi(this);

  //QSqlTableModel* model = new QSqlTableModel;
  this->Model = new QSqlTableModel(NULL, database);
  this->Model->setTable("CompanyTable");
  this->Model->setEditStrategy(QSqlTableModel::OnManualSubmit);
  //model->setFilter(QString("id=%1").arg(1));
  this->Model->select();

  this->tableView->setModel(this->Model);
}

EditCompanyWidget::~EditCompanyWidget()
{
  if(this->Model)
    {
    std::cout << "destructor Deleting..." << std::endl;
    delete this->Model;
    this->Model = NULL;
    }
}


void EditCompanyWidget::on_btnExit_clicked()
{
  this->Model->revertAll();
  if(this->Model)
    {
    std::cout << "btnExit Deleting..." << std::endl;
    delete this->Model;
    this->Model = NULL;
    }
  //this->setResult(QDialog::Rejected);
  this->reject();
}

MainWidget.h

#ifndef TimeTrackerConfigurationWidget_H
#define TimeTrackerConfigurationWidget_H

#include "ui_TimeTrackerConfigurationWidget.h"

#include <QMainWindow>
#include <QSqlDatabase>

class TimeTrackerConfigurationWidget : public QMainWindow, private Ui::TimeTrackerConfigurationWidget
{
Q_OBJECT
public:
  TimeTrackerConfigurationWidget(QWidget *parent = 0);

public slots:
  void on_btnNewCompany_clicked();
  void on_btnEditCompany_clicked();

protected:
  QSqlDatabase CompanyDatabase;
};

#endif

MainWidget.cpp

#include "TimeTrackerConfigurationWidget.h"

#include "EditCompanyWidget.h"

#include <iostream>

#include <QSqlDatabase>
#include <QFileDialog>
#include <QSqlError>
#include <QSqlQuery>

TimeTrackerConfigurationWidget::TimeTrackerConfigurationWidget(QWidget *parent) : QMainWindow(parent)
{
  setupUi(this);
}


void TimeTrackerConfigurationWidget::on_btnEditCompany_clicked()
{
//   QString fileName = QFileDialog::getOpenFileName(this, "Database File", ".", "Image Files (*.sqlite)");
//
//   if(fileName.toStdString().empty())
//     {
//     std::cout << "Filename was empty." << std::endl;
//     return;
//     }

  QString fileName = "test.sqlite";

  if(!QFile::exists(fileName))
    {
    std::cerr << "File does not exist!" << std::endl;
    return;
    }

  this->CompanyDatabase.close();
  //QSqlDatabase::removeDatabase("CompanyDatabase");
  //QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");

  // Delete all connections
  for(unsigned int i = 0; i < QSqlDatabase::connectionNames().size(); ++i)
    {
    //QSqlDatabase::removeDatabase("TestConnection");
    QSqlDatabase::removeDatabase(QSqlDatabase::connectionNames()[i]);
    }


  this->CompanyDatabase = QSqlDatabase::addDatabase("QSQLITE", "CompanyDatabase");
  //this->CompanyDatabase = QSqlDatabase::addDatabase("QSQLITE");
  this->CompanyDatabase.setDatabaseName(fileName);
  if (!this->CompanyDatabase.open())
    {
    std::cerr << "Could not open database" << std::endl;
    std::cerr << this->CompanyDatabase.lastError().text().toStdString() << std::endl;
    return;
    }

  EditCompanyWidget* editCompanyWidget = new EditCompanyWidget(this->CompanyDatabase);
  editCompanyWidget->exec();
  delete editCompanyWidget;
}

1 Ответ

0 голосов
/ 11 декабря 2011

В документации ясно сказано: http://doc.qt.io/qt-4.8/qsqldatabase.html#removeDatabase. Вы должны уничтожить все объекты запросов и объекты соединений QSqlDatabase, которые вы создали, прежде чем удалять соединение.Когда вы удаляете указатель, вы фактически делаете это.С вашим предыдущим кодом вы не были.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...