我应该在哪里声明一个数据库对象

时间:2013-04-04 10:16:10

标签: c++ database qt

我在C ++项目中使用Qt库但我有一个设计问题:应该在哪里声明数据库?我宁愿不申报全局变量。

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

我在主窗口启动时启动数据库,在窗口关闭时关闭它。我不知道这是否可以 现在我需要另一个类中的数据库连接,所以我可以传递对数据库的引用或使数据库全局

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

编辑:

我的班级现在看起来像:

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
}

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

2 个答案:

答案 0 :(得分: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()根据现有数据库连接创建独立的数据库连接。

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

答案 1 :(得分: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个实例。