QT×SQLite数据库的坑(1):明明第一个SQLite数据库可以跑通,为什么第二个就驱动没有加载?Driver not loaded

本文探讨了在Qt中如何处理QSqlDatabase使用SQLite时,遇到的驱动加载错误,尤其是在创建多个数据库实例时。作者提出通过自增ID为每个数据库实例指定唯一名称,以解决连接冲突问题。
摘要由CSDN通过智能技术生成

结论:

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确保每一个链接的命名都是唯一的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值