QT连接MySQL操作比较繁琐,中间变数很多。本人练习时长两天半,中间大大小小各种坑,截止目前亲测排除一些,还有一些有待研究。我把过程写下来希望帮到别人,欢迎交流讨论。
Windows 10 家庭中文版,64位,已装VS2017,已装WindowsSDK
Qt Creator 4.15.0 Based on Qt 5.12.2(MSVC 2019,64 bit)
MySQL 8.0.31 winx64
QT连接MySQL有两种方式,一种是用QT打开自带的工程,稍加改动编译出dll和lib,再手动放在对应位置;另一种是通过ODBC软件连接。我用的是前者,后者也试过,但存在32位64位的问题,后文细说。
一、打开MySQL,并创建一个库,
二、打开QT,新建一个工程,做如下修改:
(一) .pro文件中,添加如下两句:
QT += sql
QT += widgets
(二). mainwindow.h文件中, 添加头文件:
#include
#include
#include
#include
(三). main.cpp文件中,添加如下代码:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setDatabaseName("数据库名");
db.setUserName("用户名");
db.setPassword("密码");
bool ok = db.open();
if (ok){
QMessageBox::information(this, "infor", "link success");
}
else {
QMessageBox::information(this, "infor", "link failed");
qDebug()<<"error open database because"<
坑1:csdn有些文章里面的代码粘过来会报错,所以一定要引全头文件
插一句,因为我是重装了QT之后又来尝试,所以这里可能会出这个问题:编译后报错error: cannot open C:\Users\AppData\Local\Temp\main.obj.5136.0.jom for write,在csdn查到了这位作者的文章,圆满解决QT编译时出现:error: cannot open C:\Users\AppData\Local\Temp\main.obj.5136.0.jom for write_mikasoi的博客-CSDN博客
如果提示failed,输出
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
那就是还没有驱动。
(一)打开mysql.pro,位置在D:\QT\5.12.11\Src\qtbase\src\plugins\sqldrivers\mysql
坑2:安装QT时要选中source,否则找不到该工程
(二)这里有些混乱,我如实记录亲自测试的结果:
1.QT编译器64位,MySQL64位:可行,将D:\mysql-8.0.31-winx64\lib中的libmysql.dll和libmysql.lib文件复制到D:\QT\5.12.11\msvc2017_64\bin中,然后继续第三步。但请注意,此处有个最大却最不起眼的坑!
坑3:有文章说位数不对应的话需要下Connector,复制其中lib下的libmysql.dll和libmysql.lib文件到D:\QT\5.12.11\msvc2017_64\bin中。但其实MySQL文件夹lib里直接就有,不需要下载。而且亲测使用下载的dll和bin,不会影响编译,却影响QT和MySQL的连接,本人在这步浪费了很长很长时间,最后才发现尽信书确实不如无书。猜测是版本不对,官网最新的只有6.1.11,时间已经是2017-07-18的,MySQL里自带的是2022-09-13的。另外切记如果要下,就下C的,不能用C++的。如果想尝试,下载地址如下:
下载地址:MySQL :: Download MySQL Connector/C (Archived Versions)
2.QT编译器32位,MySQL32位:32位MySQL似乎安装不正确,没能进行进一步尝试。
3.QT编译器32位,MySQL64位:32位编译器编不过mysql.pro,会报错LNK2019,按照他人说法可以靠清缓存来解决,亲测无效,且容易把QT搞坏
坑4:如果是64位系统,尽量装64位软件
一大波小坑来袭……
坑5:QT Creator是32位64位都没有关系,可以装不同的编译器,并不需要大费周章地卸载重装
坑6:有人说MySQL路径存在“.”或空格会对编译有影响,我的路径中有“.”和“-”,亲测一切正常。实际上这个文件夹名字是官网下载自带的,不能改,改了MySQL会出问题,即使是免安装版
坑7:如果实在需要用32位编译器,64位电脑上一定报错,亲测笔记本和台式都报过。如果想通过清空缓存来尝试消告警,建议改名而不是删除,直接删很容易把qt搞坏。缓存路径如下:
C:\Users\86183\AppData\Local\QtProject
C:\Users\86183\AppData\Roaming\QtProject
坑8:有人说编译器要选MSVC,不能用MinGW,这个没有尝试,我直接用MSVC
(三)接下来做如下修改:
1.mysql.pro
1)QMAKE_USE += mysql前面加个#,注释掉;
2)再添加以下三句,原有的话就改为以下三句:
INCLUDEPATH += D:/mysql-8.0.31-winx64/include
LIBS += D:/mysql-8.0.31-winx64/lib/libmysql.lib
DEPENDPATH = ../mysql/mysqlDll
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
INCLUDEPATH += D:/mysql-8.0.31-winx64/include
LIBS += D:/mysql-8.0.31-winx64/lib/libmysql.lib
DEPENDPATH = D:\QT\5.12.10\Src\qtbase\src\plugins\sqldrivers\mysql\mysqlDll
2.qsqldriverbase.pri
1)include()括号内的所有内容换成configure.pri的绝对路径
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
(四)重新编译
有人说需要用release,我试了debug似乎不会有影响。
坑9:先make
坑10:重新!重新!重新构建!
(五)Ctrl+C,Ctrl+V
如果编译没报错,会生成四个文件,qsqlmysql.dll,qsqlmysql.lib,qsqlmysqld.dll,qsqlmysqld.lib,也就是MySQL的驱动,复制粘贴到D:\QT\5.12.11\msvc2017_64\plugins\sqldrivers即可。但是!前方高能!第二大坑来了!
坑11:文件会生成在与QT平级的plugins文件夹,并不会生成在DEPENDPATH写的路径,写成绝对路径也没用!!!
(六)再次打开之前写的测试工程,有人说需要重启下QT,亲测并不需要,直接跑就好。
这个坑暂时还没见底,下载过64位,能添加数据源,连不上,当时报错是is not allowed to connect to this mysql server,参考了mysql数据库连接报错:is not allowed to connect to this mysql server_鱼大虾的博客-CSDN博客也没能改好。看网上介绍,在C盘找到了32位exe,根本连数据源都添不了,感觉变数更多,没去进一步研究,后续有经验了再来补全