QSqlDatabase执行open时报错???

Giant NG 2021-01-08 11:32:50
逻辑流程:
1. 判断是否存在数据库文件,不存在则创建;
2. 判断是否存在对应的table,不存在则创建;
代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

#define FILE_NAME "ThreeKindoms.db"

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
#if 1
//判断文件是否存在
QFileInfo fileInfo(QString(QCoreApplication::applicationDirPath() + "/" + FILE_NAME));
if (!fileInfo.exists()) {
//创建文件
this->createDBFile();
}
QString shuTable = "ShuKingdom";
this->createTable(shuTable);
#else
this->createDBFile();
#endif
}

Widget::~Widget()
{
delete ui;
}

void Widget::createDBFile()
{
m_database = QSqlDatabase::addDatabase("QSQLITE", "ThreeKindoms");
m_database.setDatabaseName(QString(QCoreApplication::applicationDirPath() + "/" + FILE_NAME));
if (!m_database.open())
qDebug() << "Open database file failed.";
else
qDebug() << "Open database file success.";
}

void Widget::createTable(QString &tableName)
{
if (!m_database.isOpen()) {
if (!m_database.open())
qDebug() << "ERROR:" << m_database.lastError();
}
……
}


问题:
当第一次编译运行时,控制台的打印为

Open database file success.
Create "ShuKingdom" success.


此时,再一次运行项目,则会出现如下打印提示:
ERROR: QSqlError("", "Driver not loaded", "Driver not loaded")


请问各位大神,为什么编译运行过一次后,再运行就会报错QSqlError的错误;而且这个错误是在createTable函数中执行判断m_database是否打开,未打开则执行open,这里为什么会出错?
...全文
4455 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Giant NG 2021-01-10
  • 打赏
  • 举报
回复
十分感谢以上两位大神指出错误所在。
无情答题机器 2021-01-10
  • 打赏
  • 举报
回复
问题:第33行对成员变量m_database 的初始化操作误放置于createDBFile()函数,而第二次运行时无法调用该函数 对策:33、34行放在构造函数中
mideum 2021-01-09
  • 打赏
  • 举报
回复
你第二次运行时因为数据库文件已经存在,所以按照你的代码会跳过createDBFile()直接走到createTable()
于是你既没有调用addDatabase来导入SQLITE插件,又没有调用setDatabaseName来设置数据库文件路径
你指望一个啥都没有设置过的m_database能打开个啥请问
你根本不需要去加这个文件存在的判断,SQLITE在open的时候本来就是如果存在就打开,不存在就先创建文件

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧