QT5連接配接并操作遠端伺服器MySQL資料庫
文章目錄
- QT5連接配接并操作遠端伺服器MySQL資料庫
-
- 一、連接配接MYSQL資料庫
-
- 0.加入MySQL動态連結庫
- 1.加入sql子產品,包含頭檔案
- 2.遠端連接配接方法
- 3.連接配接錯誤Error2003解決辦法
- 二、QT操作MySQL
-
- 1.包含頭檔案
- 2.操作示例
一、連接配接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();//清除密碼輸入框
}
}