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