【问题标题】:QSqlDatabase Connecting to Multiple DatabasesQSqlDatabase 连接多个数据库
【发布时间】:2014-10-16 16:24:27
【问题描述】:

我在尝试连接到一个 Qt 应用程序中的两个不同数据库时遇到问题。我有存储应用程序收集的所有信息的信息数据库和新的日志数据库,它允许我跟踪应用程序发生的所有更改、按钮按下、屏幕加载等,以便在发布后轻松调试。另外,数据库运行良好,但是当我尝试同时使用它们时,只有一个可以运行。我读到这可能是因为我没有命名连接,显然只有最近连接的数据库才能使用默认连接。但是,当我给数据库命名时,它们根本不起作用,isOpen() 将在两者上都返回 true,但是一旦它们尝试执行查询,我就会得到错误

"QSqlQuery::prepare: database not open"

"QSqlError(-1, "Driver not loaded", "Driver not loaded")"

我的两个数据库声明是:

database_location = filepath.append("/logger.sqlite");
logDB = QSqlDatabase::addDatabase("QSQLITE", "LoggerDatabaseConnection");
logDB.setHostName("localhost");
logDB.setDatabaseName(database_location);

用于 Logger 数据库连接和:

database_location = filepath.append("/db.sqlite");
db = QSqlDatabase::addDatabase("QSQLITE",  "NormalDB");
db.setHostName("localhost");
db.setDatabaseName(database_location);

当我在数据库上运行第一个查询以查看它们的表是否存在时,我正在使用

QSqlQuery query("LoggerDatabaseConnection");

对于普通数据库也是如此,但即使在声明数据库连接以运行查询后,我仍然遇到连接问题。

应用程序使用的数据库在命名空间中声明为静态QSqlDatabase,以创建全局效果,所以每个人都可以访问它,那是以前的程序员,我将Log数据库创建为带有私有数据库连接的Singleton。就像我说的两个版本的代码分开工作,但是当它们在一起时,它们会互相争斗。我知道关于 Singleton 与 Dependecy Injection 的正确设计存在巨大争议,但代码再次单独工作,所以我对它现在的设计方式感到满意。如果有任何遗漏的信息或您有任何想法,请告诉我。谢谢。

【问题讨论】:

    标签: database qt qsqlquery qsqldatabase


    【解决方案1】:
    QSqlQuery query("LoggerDatabaseConnection");
    

    构造函数的第一个参数是查询,而不是连接名称。它将使用默认连接,因为您未指定任何数据库对象。

    试试这样的:

    QSqlQuery query1("YourFirstQuery", db);
    QSqlQuery query2("YourSecondQuery", logDB);
    

    重要提示:也不要忘记在使用数据库之前/之后通过调用QSqlDatabase::open()QSqlDatabase::close() 来打开和关闭数据库。

    【讨论】:

    • 我最终只是将数据库与记录器结合起来,这是我试图避免的事情,以保持一切模块化。但是,我开始了一个带有两个数据库连接并使用您建议的语法的测试项目,它似乎终于可以工作了。非常感谢您的宝贵时间。
    【解决方案2】:

    拥有多个数据库的正确方法是使用从静态addConnection 方法返回的指针。您应该使用 connectionName 参数: https://doc.qt.io/qt-5/qsqldatabase.html#addDatabase-1在初始化和查询使用期间:

    示例:

    void MyClass::initDb(QString dbPath, QString connName)
    {
        // initial db usage, etc
        QSqlDatabase db = QSqlDatabase::addDatabase(YOUR_DRIVER, connName);
        db.setDatabaseName(dbPath);
    
        // open it, etc
    }
    
    void MyClass::updateThing(QString val, QString name, QString connName)
    {
        QString q = QString("UPDATE THINGS SET val=%1 WHERE name=%2").arg(val, name);
        // add the reference to your database via the connection name
        QSqlDatabase db = QSqlDatabase::database(connName);
        QSqlQuery query(db);
    
        query.exec(q);
        // handle the query normally, etc     
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2019-07-10
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多