c++ - 我应该在哪里声明数据库对象

标签 c++ database qt

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

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

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

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

编辑:

我的类(class)现在看起来像:

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
}

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

最佳答案

如果您使用QSqlDatabase,则实际上不需要将其设为全局变量。只需在首次启动应用程序时设置连接,然后在不同模块中需要时使用静态 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 is a value class. Changes made to a database connection via one instance of QSqlDatabase will affect other instances of QSqlDatabase that represent the same connection. Use cloneDatabase() to create an independent database connection based on an existing one.

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

关于c++ - 我应该在哪里声明数据库对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808430/

相关文章:

c++ - QIdentityProxyModel 显示空行

mysql - 如何在一个查询中从 3 个不同的表中获取 3 个参数 - SQL

sql - SELECT 查询是否总是以相同的顺序返回行?带聚簇索引的表

c++ - QT中如何以幻灯片方式显示图片?

c++ - 如何使 QtLinguist 随 Qt 5.9.1 一起工作?

c++ - 如何在单个客户端上同时在 UDP 套接字上接收和发送数据

c++ - 在 C++ 中使用 "#define"的替代方案?为什么会被人嫌弃?

Mysql 还是其他?

c++ - 从 QLabel 获取 QPixmap

c++ - 可以用什么代替 QRectF?