Window下的Qt连接Linux的MySQL问题总结

项目场景:

如题,在做公司项目管理系统时候,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

总结

到此我也成功连接上数据库了,第一次写博客,很大程度是为了写笔记,写的不好,多多包涵,如果能帮到各位就更好了

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值