我在尝试连接到一个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以创建全局效果,因此每个人都可以访问它,这是以前的程序员,并且我使用私有数据库连接创建了具有Singleton的Log数据库。就像我说的那样,两个版本的代码分开工作,但当他们在一起时,他们互相争斗。我知道关于Singleton vs Dependecy Injection的正确设计存在很大争议,但是代码再次单独工作,所以我很高兴它现在的设计方式。如果有任何遗漏信息或您有任何想法,请告诉我。谢谢。
答案 0 :(得分:3)
QSqlQuery query("LoggerDatabaseConnection");
构造函数的第一个参数是查询,而不是连接名称。它将使用默认连接,因为您没有指定数据库对象。
尝试这样的事情:
QSqlQuery query1("YourFirstQuery", db);
QSqlQuery query2("YourSecondQuery", logDB);
重要:也不要忘记在拨打QSqlDatabase::open()
和QSqlDatabase::close()
之前/之后打开和关闭数据库。
答案 1 :(得分:0)
拥有多个数据库的正确方法是不使用从静态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
}