1 遇到的問題
Qt后面的版本都沒有直接帶Mysql插件驅動了,應該是協議的原因,需要我們自己手動編譯下,默認是這樣子的:
打印下QSqlDatabase::drivers()結果如下:
("QSQLITE", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
很顯然,默認是不包含Mysql的插件驅動。
如果使用QSqlDatabase::addDatabase("QMYSQL")去加載插件,就會報下面的錯誤:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
這個錯誤是不是很經典,網上也有很多編譯插件的教程,但是居然沒有一篇文章是完全能夠解決問題的,一定要綜合多篇文章一起才行,所以還得要自己多動動手才行,下面我們來看看解決辦法。
2 解決辦法
2.1 下載源碼
如果安裝Qt時勾選了源碼,這步就可忽略,但是大多數人安裝時是沒有勾選的,可以自己去下載一下:
附加地址https://download.qt.io/archive/qt/5.12/5.12.6/submodules/
這里根據自己的版本下載即可。
2.2 解壓源碼
如果安裝Qt時勾選了源碼,這步也可忽略,這里只提一點,解壓時一定要整個目錄一起解壓,不然會影響后面的配置:
解壓目錄自己可以隨便指定,一定要全部一起解壓,我這里解壓到了D:/QtPro目錄下。
2.3 打開mysql.pro工程
首先打開工程文件:
打開后無非會遇到下面兩種錯誤:
Project ERROR: Library 'mysql' is not defined.
Cannot read D:/qtsqldrivers-config.pri: No such file or directory
為了解決這個問題,接下來我們修改下配置。
2.4 修改工程文件
修改mysql.pro文件如下:
這里額外提示下,如果本地沒有安裝mysql數據庫,可以下載對應的zip包,里面有對應的頭文件和庫文件,例如我這里服務器的版本是mysql-5.7.9,所以我下載的版本是mysql-5.7.9-winx64.zip,並解壓到了D:/Program目錄下:
然后,修改qsqldriverbase.pri文件如下:
好了,上面提到的兩個錯誤到這里就解決了,下面開始編譯。
2.5 編譯一下
編譯完成后,會在指定的build目錄下生成插件驅動:
2.6 部署一下
首先將編譯生成的mysql插件驅動復制到sqldrivers目錄下:
然后再將Mysql驅動復制到Qt安裝目錄bin目錄下:
3 驗證一下
首先使用QSqlDatabase::drivers()打印下:
("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
很顯然,Mysql插件驅動已經安裝成功了。
下面測試下能不能連接到數據庫:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.10.5");
db.setUserName("root");
db.setPassword("123456");
db.setPort(3306);
qDebug() << db.open() << db.lastError().text();
結果打印如下:
好啦,搞定!此方法應該對其他版本也適用,需要自行去測試。
最后提一下,我們編譯的插件qsqlmysql.dll是依賴於Mysql驅動libmysql.dll的,兩者缺一不可,插件就像是中間轉換層一樣,會對Mysql驅動進行適配,直接調用是不行的。