天天看點

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

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子產品

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

使用當資料庫相關内容時,加入頭檔案,主要有以下幾個頭檔案:

#include <QSqlDatabase> //sql驅動基礎
#include <QSqlQuery>//sql查詢相關
#include <QSqlError>//sql輸出錯誤
           

使用#include 可以輸出錯誤進行檢查,看看哪裡出了問題,使用

lastError()

方法即可輸出錯誤資訊,例如:

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

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.操作示例

先上效果圖:

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

實作思路:

首先,在伺服器MySQL資料庫中建立測試用到的資料庫與資料表,如:

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

在目前頁面連接配接MySQL資料庫,在注冊按鈕的槽函數中,查詢目前需要注冊的賬号是否存在,不存在就注冊,存在則進行提示。

在登入按鈕槽函數中,查詢使用者密碼,查詢正确即可登入。

主要代碼:

注冊按鈕槽函數:

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器MySQL資料庫

登入按鈕槽函數:

QT5連接配接并操作遠端伺服器MySQL資料庫QT5連接配接并操作遠端伺服器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();//清除密碼輸入框
    }

}