QSqlDatabase连接到多个数据库



我在一个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);

用于记录器数据库连接和:

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与Dependency Injection的正确设计存在着巨大的争论,但代码是单独工作的,所以我对目前的设计方式感到满意。如果有任何遗漏的信息或你有任何想法,请告诉我。非常感谢。

QSqlQuery query("LoggerDatabaseConnection");

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

试试这样的东西:

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

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

拥有多个数据库的正确方法是而不是使用从静态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     
}

相关内容

  • 没有找到相关文章

最新更新