qt6 使用数据库(QSqlDatabase)工具链接 sqlite 时,打开成功却找不到数据库文件?

问题描述:

        使用 · QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1StringView(defaultConnection))· 静态函数链接 sqlite 时,明明使用 `bool QSqlDatabase::isOpen() const` 返回 true ,却在目录当中找不到 数据库 文件!

解决方案

        使用 · QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1StringView(defaultConnection))· 的第二参数

描述

        首先 QSqlDatabase addDatabase 可以打开一个数据库,而这个打开是存在辨别性质的。而所谓辨别性质是指 “ 存在某一对象管理已经存在的标识 ”。说到这,很明显突出了 “如何管理” 的问题。在了解这个问题之前,我们先了解一下  QSqlDatabase addDatabase 的参数

        1    const QString &type : 数据库类型

        2    const QString &connectionName : 链接名称

        第一个参数很容易懂,因为链接 “sqlite” 时,它必须是 R"(QSQLITE)" 字符串,二第二个参数我们都很少接触,因为 " 网络的教程几乎不对第二个参数进行配置。 "但也因此诞生了一个错误。因为这参数正是 ‘管理标识’。

        在函数描述当中,这个存在默认值,如:R"(qt_sql_default_connection)" 而且重复使用这个调用时,那么就会发生异常。告诉你,这个链接已经被链接。而所谓的 “已经” 直接说明了问题。这中情况下,有人会告诉你:使用 "QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1StringView(defaultConnection), bool open = true)" , 到了这个时候,新的问题将会诞生。 QSqlDatabase::database 是什么作用?这里,我会告诉你,它就是使用 “被管理的辨别标识来获取一个链接”。也就是说,这个过程与我们的课题无关,他并不能解决“找不到数据库文件的问题。”,反而诞生了“这个函数是什么作用的问题”。所以,我们可以忽略这个函数,反而重新回到第一个调用 addDatabase 上,但有趣的是,他为我们提供了思路,比如说他的参数 “connectionName”,噢噢~可以发现 ,这个在 addDatabase 第二个参数也有提及。那么我们可以利用它,比如说“在不改变这个值情况下重复链接不同的库”,幸运的你会发现,第一次调用的数据库文件在第二次调用的时候出现了!

        结果很棒。

结论

        在链接 sqlite 时候,应该使用 addDatabase 的第二个参数

QString dbName = QDateTime::currentDateTime( ).toString( u8"1 - yyyy_MM_dd hh-mm-ss" ).append( ".db" );
QSqlDatabase::addDatabase( "QSQLITE", dbName )
database->setDatabaseName( dbName );

        即便上面的代码看上去略有重复,但并不阻止他们成为一个“唯一的链接”

问题的根源在于第二个链接的数据库并不准确,即便它被 "setDatabaseName" 设置了路径!但他仍然是失败的,因为它是上一个链接,它是 open 的!如果需要重复使用默认的链接名称,那么你需要关闭一次,然后重复打开。但在链接多个数据库的场景当中,这是一个失误!所以第二个参数是不可忽略的,而且它会导致隐形错误。而这样的错误可以归纳为“第二个链接没有被正确链接上,导致目前还在操作上一个数据库。而第二个数据库文件根本就从来没利用过。”

        

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值