Во второй раз, когда я пытаюсь подключиться к базе данных, я получаю следующее сообщение:
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;
}