一、出现问题的代码段
bool DbManager::OpenDatabases()
{
qDebug() << "drivers" << QSqlDatabase::drivers();//显示本机已有的数据库驱动
QString connectName ="QMYSQL";
//确保多次打开不会重复添加
if(QSqlDatabase::contains(connectName))
m_db = QSqlDatabase::database(connectName);
else
m_db = QSqlDatabase::addDatabase("QMYSQL",connectName);
//连接本地数据库
m_db.setDatabaseName("mysql");//必须是已经存在的数据库名字
m_db.setHostName("127.0.0.1");
m_db.setPort(3306);
m_db.setUserName("root");
m_db.setPassword("123456");
if(m_db.open())
{
m_bValid = true;
CreateTables();
}
else
{
QSqlError err = m_db.lastError();
qDebug() << err.text();
LOG(ERROR)<<err.text().toStdString();
m_db.close();
m_bValid = false;
}
return m_bValid;
}
二、提示信息
上面提示信息中,表示本机已有QMYSQL驱动,查看QT文件中也确实有该驱动,但是仍然无法连接成功
(路径:D:QT5.9.3mingw53_32pluginssqldrivers)
三、准备重新编译Mysql驱动插件
编译插件需要用到两个源码包:
(1)需要一个与MySQL连接的扩展包:mysql-connector-c-6.1.3-win32,资源下载链接为:https://dev.mysql.com/downloads/file/?id=450611
(2)Qt的源码,在安装Qt的时候,可以选择安装资源来确保同时将Qt的源码也安装到自己的电脑上。
圈住的是编译之前的源码。
四、编译源码
1、在QT源码目录下打开powershell
2、使用qmake生成Makefile文件
3、在mysql.pro文件中加上如下语句,mysql连接扩展包所在的路径
4、使用mingw32-make编译该工程。
5、编译完成后,可以使用mingw32-make install完成插件的安装,也可以不用,手动复制插件到指定路径即可。编译完成后,将生成如下MySQL的驱动组件:
6、将qsqlmysql.dll(release版本)和qsqlmysqld.dll(debug版本)文件复制到QT相应目录下
7、进行测试,在QtCreator中编译运行自己写好的MySQL连接程序,出现如下错误
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
8、此时分析报错,QMYSQL驱动已经存在,然而依然不能连接到MySQL数据库。于是将MySQL连接的扩展包:mysql-connector-c-6.1.3-win32中的lib文件夹下的libmysql.dll和libmysql.lib(libmysql.lib文件可以不要)文件复制到Qt构建套件路径D:QT5.9.3mingw53_32in下,如下图:
9、重新测试,出现如下报错'caching_sha2_password' cannot be loaded
1.打开MySQL的命令行,输入数据库密码
2.修改加密规则:ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
3.更新用户密码:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
4.刷新权限: FLUSH PRIVILEGES;
5.重置密码:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'
重新测试,连接成功!