QT 之数据库 QSqlQuery CURD 实战

零、参考文档

QT 之数据库 QSqlQuery CURD 实战_第1张图片

QT 之数据库 QSqlQuery CURD 实战_第2张图片

https://doc.qt.io/archives/qt-6.0/qsqldatabase.html

一、开发环境

Ubuntu 20.04
QT6.0
Microsoft SQL Server 2022 Developer Edition (64-bit)

先修改 /etc/odbc.ini 的数据源配置,指定连接数据库 vdb,

sudo vim /etc/odbc.ini

[mssql]
Driver=MSSQL
#USER=sa
#Password=123456789
PORT=1433
SERVER=localhost
Database=vdb

创建项目,

QT 之数据库 QSqlQuery CURD 实战_第3张图片

QT 之数据库 QSqlQuery CURD 实战_第4张图片

pro 配置开启 sql 模块,

QT += sql

新建头文件 connection.h,

QT 之数据库 QSqlQuery CURD 实战_第5张图片

QT 之数据库 QSqlQuery CURD 实战_第6张图片

// connection.h
#ifndef CONNECTION_H
#define CONNECTION_H

#include 
#include 
#include 

static bool connect_mssql(){
    // 数据库配置
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    QString dsn = QString::fromLocal8Bit("mssql");
    // 数据源名称
    db.setDatabaseName(dsn);
    // 服务器名称
    db.setHostName("localhost");
    db.setPort(1433);
    // 用户名
    db.setUserName("sa");
    // 密码
    db.setPassword("123456789");

    // 数据库连接
    bool ok = db.open();
    if(ok)
    {
        qDebug() << "db open ok!";
    }
    else {
        qDebug() << "db open error: " << db.lastError();
    }
    return ok;
}

#endif // CONNECTION_H

然后再在 main.cpp 中引用这个头文件,

// main.cpp 
#include "mainwindow.h"
#include "connection.h"
#include 

int main(int argc, char *argv[])
{

    if(!connect_mssql()){
        return 1;
    }
    
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

二、QSqlQuery

QT 之数据库 QSqlQuery CURD 实战_第7张图片

主窗口添加四个 Push Button,为四个按钮绑定单击信号槽函数,

QT 之数据库 QSqlQuery CURD 实战_第8张图片

QT 之数据库 QSqlQuery CURD 实战_第9张图片

然后在 mainwindow.cpp 分别实现四个槽函数,

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_query_btn_clicked()
{
    QSqlQuery query;

    // 查找表中 color = LightPink 的数据
    query.exec("select id, color, rgb, del_flag from vdb.dbo.color_define where color = 'LightPink'");

    while(query.next())
    {
        int id = query.value(0).toInt();
        QString color = query.value(1).toString();
        QString rgb = query.value(2).toString();
        int del_flag = query.value(3).toInt();
        // 输出
        qDebug() << id << " " << color << " " << rgb << " " << del_flag;
    }
}


void MainWindow::on_insert_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    if (!query.exec("insert into vdb.dbo.color_define(color,rgb,del_flag) values('LightPink','255,182,193',0)"))
    {
        qDebug() << query.lastError();
    }
}


void MainWindow::on_update_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    if (!query.exec("update vdb.dbo.color_define set del_flag = 1 where color = 'LightPink'"))
    {
        qDebug() << query.lastError();
    }
}


void MainWindow::on_delete_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    if (!query.exec("delete vdb.dbo.color_define where color = 'LightPink'"))
    {
        qDebug() << query.lastError();
    }
}

QT 之数据库 QSqlQuery CURD 实战_第10张图片

三、参数绑定

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_query_btn_clicked()
{
    QSqlQuery query;

    // 查找表中 color = LightPink 的数据
    query.prepare("select id, color, rgb, del_flag from vdb.dbo.color_define where color = :color");

    query.bindValue(":color","LightPink");

    query.exec();

    while(query.next())
    {
        int id = query.value(0).toInt();
        QString color = query.value(1).toString();
        QString rgb = query.value(2).toString();
        int del_flag = query.value(3).toInt();
        // 输出
        qDebug() << id << " " << color << " " << rgb << " " << del_flag;
    }
}


void MainWindow::on_insert_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    query.prepare("insert into vdb.dbo.color_define(color,rgb,del_flag) values(:color,:rgb,:del_flag)");

    query.bindValue(0,"LightPink");
    query.bindValue(1,"255,182,193");
    query.bindValue(2,0);

    if (!query.exec())
    {
        qDebug() << query.lastError();
    }
}


void MainWindow::on_update_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    query.prepare("update vdb.dbo.color_define set del_flag = 1 where color = :color");

    query.addBindValue("LightPink");

    if (!query.exec())
    {
        qDebug() << query.lastError();
    }
}


void MainWindow::on_delete_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    query.prepare("delete vdb.dbo.color_define where color = ?");

    //query.addBindValue("LightPink");
    query.bindValue(0,"LightPink");

    if (!query.exec())
    {
        qDebug() << query.lastError();
    }
}

QT 之数据库 QSqlQuery CURD 实战_第11张图片

四、批量处理

void MainWindow::on_batch_btn_clicked()
{
    // 创建 QSqlQuery 对象
    QSqlQuery query;

    query.prepare("insert into vdb.dbo.color_define(color,rgb,del_flag) values(?, ?, ?)");

    QVariantList colors;
    colors << "LightPink" << "OliveDrab" << "Tomato";
    query.addBindValue(colors);

    QVariantList rgbs;
    rgbs << "255,182,193" << "85,107,47" << "255,99,71";
    query.addBindValue(rgbs);

    QVariantList flags;
    flags << 0 << 0 << 0 ;
    query.addBindValue(flags);

    if (!query.execBatch())
    {
        qDebug() << query.lastError();
    }

    if(!query.exec("select top(100) * from vdb.dbo.color_define(nolock)")){
        qDebug() << query.lastError();
    }

    while(query.next())
    {
        int id = query.value(0).toInt();
        QString color = query.value(1).toString();
        QString rgb = query.value(2).toString();
        int del_flag = query.value(3).toInt();
        // 输出
        qDebug() << id << " " << color << " " << rgb << " " << del_flag;
    }
}

QT 之数据库 QSqlQuery CURD 实战_第12张图片

五、事务

void MainWindow::on_delete_btn_clicked()
{
    // transaction start
    QSqlDatabase::database().transaction();

    // 创建 QSqlQuery 对象
    QSqlQuery query;

    query.prepare("delete vdb.dbo.color_define where color = ?");

    query.addBindValue("LightPink");
    //query.bindValue(0,"LightPink");

    if (!query.exec())
    {
        qDebug() << query.lastError();
    }

    // transaction commit
    QSqlDatabase::database().commit();
}

你可能感兴趣的:(禅与QT,禅与编程,qt,开发语言)