QT5连接并操作远程服务器MySQL数据库
QT5连接并操作远程服务器MySQL数据库
文章目录
一、连接MYSQL数据库
QT连接远程服务器MySQL数据库,步骤如下:
0.加入MySQL动态链接库
首先在QT的安装目录下的bin文件夹下,加入libmysql.dll动态链接库,否则编译运行会输出MySQL驱动加载失败的错误!!
具体参考网上的教程,不一定需要安装MySQL,加入动态链接库即可,亲测!
加载链接库的可以随便参考一篇:Qt5.12连接MySQl5.7(亲自测试成功)
1.加入sql模块,包含头文件
双击pro文件,加入sql模块
使用当数据库相关内容时,加入头文件,主要有以下几个头文件:
#include <QSqlDatabase> //sql驱动基础
#include <QSqlQuery>//sql查询相关
#include <QSqlError>//sql输出错误
使用#include 可以输出错误进行检查,看看哪里出了问题,使用lastError()
方法即可输出错误信息,例如:
2.远程连接方法
主要代码如下:
#include "widget.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//主要方法
QSqlDatabase data_base = QSqlDatabase::addDatabase("QMYSQL");//添加驱动
data_base.setHostName("120.25.248.91"); //设置主机地址
data_base.setPort(3306); //mysql设置端口
data_base.setDatabaseName("xxx"); //设置数据库名称
data_base.setUserName("root"); //设置用户名
data_base.setPassword("xxx"); //设置密码
if(!data_base.open())//打开数据库
{
qDebug()<<"connect failed";
qDebug() << data_base.lastError();//.databaseText() 输出错误信息
}
else
qDebug()<<"success";
database.close();//关闭数据库
return a.exec();
}
3.连接错误Error2003解决办法
QSqlError(“2003”, “QMYSQL: Unable to connect”, “Can’t connect to MySQL server on ‘120.25.248.91’ ,(10061)”)
QSqlError("2003", "QMYSQL: Unable to connect", "Can't connect to MySQL server on '120.25.248.91' ,(10061)")
报出上面的错误时,非常无语。。。
检查了数据库用户名、密码、数据库名、端口等等都没错,默认使用的3306也是开放的。。
然后重启了一下服务器上的mysql,
systemctl restart mysql.service
竟然搞定了!!
二、QT操作MySQL
1.包含头文件
需要包含下面这些头文件,里面有数据库操作的方法。
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlTableMode>
头文件说明如下:
转自:https://blog.csdn.net/kangshuaibing/article/details/84972681
-
QSqlQuery
可以用来执行SQL语句和获得执行结果的。
-
QSqlQueryModel
提供了一个sql查询结果的只读数据模型。它从查询QSqlQueryModel获取数据。
可以方便的用于在QListView, QTableView, QTreeView等各种view上展示数据。
但它是只读的,不能编辑。
-
QSqlTableMode
继承于QSqlQueryModel,与QSqlQueryModel功能相似。
比QSqlQueryModel的限制在于不能是任意sql语句,只是对单个数据表操作。
拓展在于在各种view上展示表格数据的同时,还允许用户进行编辑操作。
2.操作示例
先上效果图:

实现思路:
首先,在服务器MySQL数据库中创建测试用到的数据库与数据表,如:
在当前页面连接MySQL数据库,在注册按钮的槽函数中,查询当前需要注册的账号是否存在,不存在就注册,存在则进行提示。
在登录按钮槽函数中,查询用户密码,查询正确即可登录。
主要代码:
注册按钮槽函数:
登录按钮槽函数:
#include "widget.h"
#include "ui_widget.h"
#include "ctrl.h"
#include <Qstring>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QMessageBox>
#include <QSqlTableModel>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //加入MYSQL的数据库驱动
db.setHostName("120.25.248.91"); //主机名
db.setPort(3306); //端口
db.setUserName("root"); //用户名
db.setPassword("mysql"); //密码
db.setDatabaseName("Door"); //数据库名
//测试连接
if(!db.open())//打开数据库
{
qDebug()<<"can not connec";
qDebug() << db.lastError();//打印错误信息
}
else
{
qDebug()<<"connect success";
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_loginBt_clicked()//登录按钮槽函数
{
QString userName = ui->userEdit->text();
QString password = ui->passwdEdit->text();
QSqlTableModel *model = new QSqlTableModel;
model->setTable("softuserTable");
model->setFilter(QString("userName='%1'").arg(userName));//查询用户名
model->select();
int row = model->rowCount();
if(row>0){//查询成功
row=0;
model->setFilter(QString("userName='%1' and password='%2'").arg(userName).arg(password));//查询用户与密码
model->select();
row = model->rowCount();
if(row>0){//查询成功
qDebug()<< "登录成功";
QMessageBox::information(this,"提示","登录成功!");
}else{
QMessageBox::information(this,"提示","密码错误,登录失败!");
ui->passwdEdit->clear();
}
}else{//查询失败
QMessageBox::information(this,"提示","用户未注册!");
}
delete model;
}
void Widget::on_registerBt_clicked()//注册按钮槽函数
{
QString user = ui->userEdit->text();
QString pswd = ui->passwdEdit->text();
QSqlTableModel *model = new QSqlTableModel;
model->setTable("softuserTable");//选择数据表
model->setFilter(QString("userName='%1'").arg(user));//设置查询过滤选项,此处查询用户名
model->select();//获取查询数据
int row = model->rowCount();
if(row>0){//查询到用户名已在数据库中
QMessageBox::information(this,"提示","用户已注册!");
}else{
QString cmd = QString("insert into softuserTable(userName,password) values ('%1','%2')")
.arg(user).arg(pswd);
qDebug() << "cmd = " << cmd ;
QSqlQuery *query = new QSqlQuery;
if(query->exec(cmd)){
QMessageBox::information(this,"提示","注册成功!");
}else{
QMessageBox::information(this,"提示","注册失败!请联系管理员");
}
delete query;
ui->passwdEdit->clear();//清除密码输入框
}
}
if(query->exec(cmd)){
QMessageBox::information(this,"提示","注册成功!");
}else{
QMessageBox::information(this,"提示","注册失败!请联系管理员");
}
delete query;
ui->passwdEdit->clear();//清除密码输入框
}
}