结论:
QSqlDatabase db;
db=QSqlDatabase::addDatabase("QSQLITE","NO.2");//第二个参数"NO.2"很重要
关于怎么使用SQLite数据库站内有相当的帖子,大家自行搜索,本回答主要解决为什么一切正常,甚至第一个数据库都跑起来了,第二个却报错驱动不加载的问题。
这是使用QSqlDatabase必须的函数
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
一般的教程,仅仅使用
QSqlDatabase db;
db=QSqlDatabase::addDatabase("QSQLITE");//没有第二个参数,即第二个参数使用默认值
关于第二个参数,以下是ChatGPT的解释:
当同一个程序中,创建了2处及以上 QSqlDatabase db;(可能是同一个父对象中,也可能是不同的父对象中)且都使用了同一个数据库驱动,如“SQLITE”。
当其中一个先被打开,且未关闭的状态下
db1.setDatabaseName("database path");
db1.open();
//db1.close()
第二个db将无法打开,会报错Driver not loaded。
个人推测原理是,addDatabase函数创建了一个链接的通道,第一个参数规定了通道的类型,第二个参数规定了通道的ID。当重复出现db.addDatabase()时,如果其参数相同,会被认为通道已存在,然后将db链接至通道的一头。但是由于此时通道正在被使用,那么链接则中断,报错river not loaded。
解决方案plus:
如果我确实需要多个
QSqlDatabase db;
且数量不定,可能会有新的实例被new出来。
那么使用一个自增函数可以完美解决。
int getNextId() {
static int id = 0; // 静态变量,用于记录自增的 id
return ++id; // 自增并返回 id
}
class A
{
public:
A();
QSqlDatabase db;
}
A::A()
{
db= QSqlDatabase::addDatabase("QSQLITE","sqlite3:"+QString::number(getNextId()));
db.setDatabaseName("a1.db");
db.open();
}
//使用自增ID确保每一个链接的命名都是唯一的