2011-12-11 47 views
0

我第二次嘗試連接到一個數據庫中,我得到這個消息:SQL連接仍然打開,即使刪除後

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; 
} 
+0

對不起,我錯了,我的壞 –

回答

0

該文檔明確指出:http://doc.qt.io/qt-4.8/qsqldatabase.html#removeDatabase。在刪除連接之前,必須銷燬所有已經實例化的查詢對象和QSqlDatabase連接對象。當你刪除指針時,你實際上是這樣做的。用你以前的代碼,你沒有。

+0

雖然你不能保留一個對象作爲成員變量,然後調用某種「斷開」功能來模擬刪除它,這似乎很奇怪嗎? –

+0

這是一個問題或陳述?我不知道一種方式是否存在,對不起,但我認爲這不是必要的。通過使用靜態QSqlDatabase :: database(...),你可以做任何你想做的事情。通過也使用重寫的運算符=你可以分配給對象,而不用複製我猜,所以沒有開銷。 –

+0

考慮一下這個錯誤的一點搜索。它已經被問到到處,也在這裏堆棧溢出。您可能會發現更多信息。 –

相關問題