作者第一次发布文章,可能会有些错误,欢迎大家提醒指正。
目录
相关软件:
Qt 5.12.3
MySQL 8.0.30
辅助软件:Everything
、
MySQL Workbench
问题来源:
笔者在实现Qt 5.12.3 与 MySQL 8.0 进行连接时发现,在Qt中直接导入头文件还不行:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QSqlDatabase"
#include "QSqlQuery"
#include "QSqlError"
#include "QDebug"
#include "QMessageBox"
还需要在Qt 所创建项目中的pro文件中加上
QT += sql
然后,笔者开始使用数据库,整体内容如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QSqlDatabase"
#include "QSqlQuery"
#include "QDebug"
#include "QMessageBox"
#include "QSqlError"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
qDebug()<<QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//Qt中设置数据库类型为MySQL数据库
db.setHostName("127.0.0.1");//设置为本地主机
db.setPort(3306);//设置Mysql数据库默认端口为3306
db.setDatabaseName("sales");//设置数据库名(我们原先在数据库中创建好的)
db.setUserName("root");//设置登录用户名
db.setPassword("123456789hr??");//写入该用户密码
bool ok = db.open();
if (ok){
QMessageBox::information(this, "information", "success");
}
else {
QMessageBox::warning(this, "warning", "open failed");
qDebug()<<"error open database :"<<db.lastError().text();//将错误对象转化为文本字符串
}
QStringList drivers = QSqlDatabase::drivers(); //获取现在可用的数据库驱动
foreach(QString driver, drivers)
qDebug() << driver;
}
MainWindow::~MainWindow()
{
delete ui;
}
Ctrl+R运行后发现如下错误:
21:53:36: Starting C:\Users\Lenovo\Documents\build-MySql_Test-Desktop_Qt_5_12_3_MinGW_32_bit-Debug\debug\MySql_Test.exe …
(“QSQLITE”, “QMYSQL”, “QMYSQL3”, “QODBC”, “QODBC3”, “QPSQL”, “QPSQL7”)
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
error open database because “Driver not loaded Driver not loaded”
“QSQLITE”
“QMYSQL”
“QMYSQL3”
“QODBC”
“QODBC3”
“QPSQL”
“QPSQL7”
意思是现在Qt可用的数据库有QSQLITE、
QMYSQL
、QMYSQL3、QODBC、QODBC3、QPSQL、QPSQL7,显然QMYSQL在里面,应该是可用的,但是却报错“驱动未加载”。
于是笔者查阅大量的资料后发现,部分资料是说未安装QMYSQL驱动,于是笔者按照相关资料重新安装了Qt(还是此版本,只不过多下了一个附件Src文件夹,即源码),然后经过一系列操作(修改pro文件等)对其中的 mysql.pro(在 Src\qtbase\src\plugins\sqldrivers\mysql 中)进行构建、编译,将 qsqlmysql.dll 文件拷贝到Qt D:\Qt\Qt5.12.3\5.12.3\mingw73_32\plugins\sqldrivers目录下然后再次运行,发现仍是报这个错误(这种方法读者很容易网上查阅,感兴趣的可以试试)。
这是因为在Qt 5.12.3版本中自带这些dll文件(而5.12.4不自带),所以当再次编译将生成的qsqlmysql.dll文件放入sqldrivers文件夹时无疑是做无用功。
Qt 5.12.3 的sqldrivers文件夹:
拷贝libmysql文件
笔者又查阅了相关资料,其意思是将MySQL中lib库里面的libmysql.dll文件和libmysql.lib文件复制粘贴至 Qt mingw73_32下的bin文件夹中(D:\Qt\Qt5.12.3\5.12.3\mingw73_32\bin)中,见下图:
MySQL中的lib文件夹
Qt 中的bin文件夹
经一番操作之后,笔者再次运行发现还是出现驱动未加载的错误,于是笔者以为是 Qt 是只有32位版本、而MySQL是64位,以为是两者不兼容问题, 将MySQL中的 connector C++ 删除重新下载与版本相关的x86位 connector C++,并将其dll文件和其他依赖dll文件复制粘贴到 Qt 的 sqldrivers 文件夹中,再次运行后发现还是依旧报这种错误。
一些依赖dll文件
可以不去下载、复制这些dll文件,因为毫无用处,在后面会讲到。
为了解决此类错误,读者耗费近一天时间翻阅相关资料,终于发现是 我们从 MySQL 中复制到 Qt 中的bin文件夹里面的 qsqlmysql.dll 文件出现了错误,可能是MySQL 8.0 及之后的版本安全性大大增加,于是笔者在网上下载了一个 libmysql.dll 文件,将其复制到 Qt 的 bin 文件夹后(D:\Qt\Qt5.12.3\5.12.3\mingw73_32\bin)Qt终于不再报“驱动器未加载”的错误,而是另一种错误。
(“QSQLITE”, “QMYSQL”, “QMYSQL3”, “QODBC”, “QODBC3”, “QPSQL”, “QPSQL7”)
error open database because “SSL connection error: unknown error number QMYSQL: Unable to connect
”“QSQLITE”
“QMYSQL”
“QMYSQL3”
“QODBC”
“QODBC3”
“QPSQL”
“QPSQL7”
但是这种错误较为容易解决,因为MySQL 8.0及之后的版本安全性大大增加,所以MySQL加密性比较高,其增加了加密方式 caching_sha2_password,连接方式和以前不太一样,这种方式无法链接数据库。
更改mysql数据库连接方式
所以我们只需更改mysql数据库的连接方式为native。
在mysql命令窗口运行:
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘YourPassword’;
# YourPassword 为数据库中用户 root 的密码
然后找到mysql的配置文件 my.ini
打开my.ini文件,找到 [mysqld],并在其下面加上
skip_ssl
其中①为新增内容,②中内容是上述更改mysql数据库连接方式的另一种写法,将其前方的#去掉即可,但是笔者试了似乎并没有什么用,所以将其注释掉。
将其保存后,在
任务管理器
中的
服务
一栏重启
MySQL80
即可。
我们重新构建项目,编译运行 Qt 项目文件,结果如图所示。
连接终于成功了!
总结:
总之,关于Qt 5.12.3 版本 对 MySQL 8.0.30版本的连接,只需要做以下几点:
①将MySQL中lib文件夹里的libmysql.dll文件和libmysql.lib文件复制到Qt中的mingw73_32\bin文件夹里。(若无用,替换笔者给出的libmysql.dll文件,见下方链接)
②将MySQL中的连接模式改变为native。
③修改MySQL配置文件my.ini,在[mysqld]一栏下方加入skip_ssl。
④在项目pro文件中加入Qt的sql模块,即 “QT += sql”。
另外需要注意的是,打包Qt项目时,其无法复制libmysql.dll,仍需要将其复制到项目包里。
libmysql.dll文件链接:
https://pan.baidu.com/s/1QF0J88eoyeoiwLPyh5DEhw
提取码: m3f6