一、出現問題的代碼段
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:\QT\5.9.3\mingw53_32\plugins\sqldrivers)
三、准備重新編譯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:\QT\5.9.3\mingw53_32\bin下,如下圖:
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 '新密碼'
重新測試,連接成功!