项目场景:
如题,在做公司项目管理系统时候,qt连接mysql时自己慢慢摸索出关键技术要点
问题描述
这是简单的数据库连接代码
#include "sqlinit.h"
#include <QMessageBox>
#include <QStringList>
SQLinit::SQLinit()
{
//添加一个数据库
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL"); //括号内要写出数据库的类型
db.setHostName("192.168.xxx.xxx"); //设置数据库的主机ip
db.setPort(3306);
db.setUserName("root");
db.setPassword("123456"); //这个就是安装MySQL时设置的密码
db.setDatabaseName("database");
db.open();
// QMessageBox::warning(this,"waring",db.lastError().text());
//qDebug() << "请求失败,响应数据为:" << this->db.lastError().text();
//}
}
(一) Qt驱动出现问题
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
“Driver not loaded Driver not loaded”
原因分析:
没有qt连接mysql的驱动,需要利用qt的环境和mysql的头文件库文件编译两个dll(不管你要连接哪个环境下的mysql,只要qt在win环境下,都要编译dll,qt在Linux下应该是要编译so)。现在你需要window下安装qt和mysql(其实有库文件就行) ,linux安装mysql。
1.打开qt安装环境下的mysql.pro (需要源文件source,没有就得重装,很快的)路径
2.注释 和 添加
mysql.pro 代码
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
SQL_P = sql
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
INCLUDEPATH +="D:/mysql/include"
LIBS +="D:/mysql/lib/libmysql.lib"
DESTDIR ="D:/mysql"
2.打开qsqldriverbase.pir,添加 注释
qsqldriverbase.pir源码
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
3.编译
4.去到生成驱动的目录,将qsqlmysql.dll和qsqlmysql.dll.debug复制进qt安装路径的sqldrivers里面
5.把mysql的libmysql.lib复制到qt的bin里面
到此qt层面的问题应该解决了,如果不行就把电脑重启一下,就可以检测到qt连接到mysql的驱动
(二) 服务器MySQL出现问题:
一般是这样的 telnet: Unable to connect to remote host: Connection refused
或者
MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)
1.确定用户连接权限可以被任何一个ip连接 确保 root—>%
use mysql;
select host, user from user;
ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘123456’; -------> //改密码可选
update user set host=‘%’ where user=‘root’;
select host,user from user;
flush privileges;
quit;
2.修改mysql的mysql/my.cnf文件,将bind-address = 0.0.0.0
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
重启mysql
sudo systemctl restart mysql
3.检查3306端口是否开放输入命令 iptables -vnL|grep 3306 回车,查看防火墙是否设置了3306端口,如果提示没有工具就sudo apt install iptables
如果回车后没数据,说明没有3306端口;如果回车后显示3306端口是drop状态,都需要修正,方法如下:
sudo /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
再次输入 iptables -vnL|grep 3306 回车即可看到3306端口状态信息:
sudo iptables -vnL|grep 3306
总结
到此我也成功连接上数据库了,第一次写博客,很大程度是为了写笔记,写的不好,多多包涵,如果能帮到各位就更好了