2013-04-04 93 views
2

我在C++项目中使用了Qt库,但我有一个设计问题:应该在哪里声明数据库?我不想声明全局变量。我应该在哪里声明数据库对象

目前我正在用这种方式处理这个问题。我有一个主窗口,我已经在那里声明了数据库,所以我在主窗口中执行查询,并将结果传递给使用不同信号和插槽的对话框。

我在主窗口启动时启动数据库,并在窗口关闭时关闭它。我不知道这是否正确 现在我需要在另一个类的数据库连接以及我可以通过一个参考数据库或使全局数据库

我不喜欢这些解决方案..是否有处理这种情况的标准模式?

编辑:

我班现在看起来像:

class Database 
{ 
    public: 
    bool open(void); 
    bool close(void); 
    static Database* getDatabase(void); 
    // various methods like loadThisTable(), saveThisTable() etc 

    private: 
    Database();        // disable constructor 
    ~Database();        // disable destructor 
    Database(const Database&);     // disable copy constructor 
    Database& operator=(const Database&);  // disable assignment 

    static Database* instance_;    // database instance 
    QSqlDatabase qtDB;       // qt db database 
} 

如果我想我可以添加的添加和删除方法,但我有一个单一的数据库实例。

+0

请说明数据库对象是什么意思?你不使用QtSql的模型类吗? – smitrp 2013-04-04 10:21:04

+0

ps我已经创建了一个类的数据库,类似于:loadThis(),loadThat(),并且在这个类中有qt数据库,所以我没有直接使用qt数据库。如果我使用它,我知道我可以刚刚添加数据库与QSqlDatabase :: addDatabase,并从任何地方使用QSqlDatabase :: database – user2244311 2013-04-04 10:22:12

+0

@SmitPatel我已经为每个物理表创建一个新类 – user2244311 2013-04-04 10:23:37

回答

0

您需要一个singleton模式。这是一个只有一个实例的全球课程。有人称它为反模式(有时候是这样),但它是处理资源(如数据库连接)的最佳方式。

不要忘记,你可以使用QSqlDatabase QSqlDatabase::database (const QString & connectionName = QLatin1String(defaultConnection), bool open = true) [static]方法得到QSqlDatabase实例的名称(名称可以通过QSqlDatabase QSqlDatabase::addDatabase (QSqlDriver * driver, const QString & connectionName = QLatin1String(defaultConnection)) [static]方法设置),以避免创建单例只用于存储QSqlDatabase实例。

+1

“你需要一个单身模式”。不,绝对不是。没有人需要*单身人士,只有当你懒得找到另一种解决方案时才会这样。 “这是处理数据库连接等资源的最佳方式”。谁说的?如果你想在你的应用程序内部建立多个连接呢 – Shoe 2013-04-04 12:49:43

+0

让我们圣战开始吧!好吧,让我们想象我有2个数据库连接,我需要在我的应用程序中使用。我是否应该将它们转移到我打电话的每个表单或工作人员类别,或者将它们存储在可从任何地方访问的单例中?每个人都知道全局对象是坏的,但有时候你只是拥有像数据库连接/工作线程池等全局资源,它们本质上是全局的。 – SpongeBobFan 2013-04-04 13:00:20

+0

“我应该将它们转移到我打电话的每一个表格或工作班级,还是将它们存储在可从任何地方访问的单例中?”你能看到图案吗?如果你懒惰,你使用单例(但你会后悔的),否则你明确地定义每个类的依赖关系,因此是的:你应该将它们转移到你调用的每个表单或工作类。这不是关于任何圣战,而是关于可重用性。如果下一次你需要这些类中的任何一个来使用另一个数据库对象呢? – Shoe 2013-04-04 13:13:29

2

如果您使用的是QSqlDatabase,您并不需要将其设置为全局变量。只需在首次启动应用程序时设置连接,然后在不同模块中使用static QSqlDatabase方法访问连接。

QSqlDatabase db; // set up the default connection 
// alternative: set up a named connection 
// QSqlDatabase db("conn-name"); 

// set the connection params and open the connection 

// ... later on 
QSqlDatabase db = QSqlDatabase::database(); // retrieve the default connection 
// alternative: retrieve the named connection 
// QSqlDatabase db = QSqlDatabase::database("conn-name"); 

the docs

QSqlDatabase是一个值的类。通过QSqlDatabase的一个实例对数据库连接所做的更改将影响代表相同连接的其他QSqlDatabase实例。使用cloneDatabase()创建一个基于现有数据库连接的独立数据库连接。

注意:如果您的应用程序是多线程的,您必须小心只在创建它的线程中使用连接。

相关问题