QT 之数据库 QSqlQuery CURD 实战

零、参考文档

复制代码
https://doc.qt.io/archives/qt-6.0/qsqldatabase.html

一、开发环境

bash 复制代码
Ubuntu 20.04
QT6.0
Microsoft SQL Server 2022 Developer Edition (64-bit)

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

bash 复制代码
sudo vim /etc/odbc.ini

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

创建项目,

pro 配置开启 sql 模块,

复制代码
QT += sql

新建头文件 connection.h,

cpp 复制代码
// connection.h
#ifndef CONNECTION_H
#define CONNECTION_H

#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>

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 中引用这个头文件,

cpp 复制代码
// main.cpp 
#include "mainwindow.h"
#include "connection.h"
#include <QApplication>

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

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

二、QSqlQuery

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

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

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>

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();
    }
}

三、参数绑定

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>

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();
    }
}

四、批量处理

cpp 复制代码
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;
    }
}

五、事务

cpp 复制代码
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();
}
相关推荐
李永奉4 小时前
C语言-嵌入式开发C语言常用预处理指令合集
c语言·开发语言
上海安当技术5 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫5 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话5 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
键盘会跳舞5 小时前
C++:容器适配器 queue 的源码级拆解
开发语言·c++·queue
Loge编程生活6 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
在世修行7 小时前
从零打造 C# 工业视觉检测系统(八):Modbus RTU 协议解析与 PLC 剔除控制实战
开发语言·c#
sunburn-8 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
AI直播技术杂谈8 小时前
AI直播推流链路中延迟优化的通用技术方案
开发语言·人工智能·php
Dxy12393102169 小时前
python 中的 APScheduler 使用详解
开发语言·python