QT 之数据库 QSqlQuery CURD 实战

零、参考文档

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

创建项目,

pro 配置开启 sql 模块,

QT += sql

新建头文件 connection.h,

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

// 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 分别实现四个槽函数,

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

三、参数绑定

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

四、批量处理

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

五、事务

void MainWindow::on_delete_btn_clicked()
{// transaction startQSqlDatabase::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 commitQSqlDatabase::database().commit();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147594.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的社区医院管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

程序员的重复劳动陷阱

https://kb.cnblogs.com/page/627035/ 同样是一样的计算机专业毕业&#xff0c;进入职场的职位和工作都差不多&#xff0c;为何有些程序员短短几年就成长为全能选手或领域专家&#xff0c;有些程序员还在做CRUD&#xff1f; 程序员的重复劳动陷阱 不知道大家有没有这样的感觉…

leetCode 121. 买卖股票的最佳时机 贪心算法

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

SpringBoot注册web组件

目录 前言 一、注册Servlet组件 1.1 使用SpringBoot注解加继承HttpServet类注册 1.2 通过继承HttpServet类加配置类来进行注册 二、注册Listener组件 2.1 使用SpringBoot注解和实现ServletContextListener接口注册 2.2 ServletContextListener接口和配置类来进行注册 …

Linux shell编程学习笔记6:查看和设置变量的常用命令

上节我们介绍了变量的变量命名规则、变量类型、使用变量时要注意的事项&#xff0c;今天我们学习一下查看和设置变量的一些常用命令&#xff0c;包括变量的提升&#xff0c;有些命令在之前的实例中已经使用过了。 一、 echo &#xff1a;查看变量的值 语法格式&#xff1a;ech…

PCL 计算点云中值

目录 一、算法原理2、主要函数二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 计算点云坐标的中值点,首先对点云坐标进行排序,然后计算中值。如果点云点的个数为奇数…

【iptables 实战】07 iptables NAT实验

在上一节中&#xff0c;我们将两个网段的机器&#xff0c;通过中间机器的网络转发&#xff0c;能达到互通。再来回顾一下这个网络连接的图 上一节我们在防火墙实验中&#xff0c;设置了主机B的的转发规则&#xff0c;我们先清空主机B的转发规则 [rootlocalhost ~]# iptables…

springboot整合es

springboot整合es 1.引入依赖&#xff08;springboot2.3.x版本可以兼容elasticsearch7.x版本。&#xff09; <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.3.6.R…

记录:Unity脚本的编写2.0

目录 前言控制方法键盘控制鼠标控制虚拟控制器控制 平移和旋转 前言 前面记录了一些简单的unity脚本用来控制unity中对象模型的移动&#xff08;或者不能叫控制&#xff0c;毕竟它是开启之后自己在跑的&#xff09;&#xff0c;那么让模型可以根据用户的操作来进行变化的方法自…

vue 使用 创建二维数组响应数据 渲染 echarts图标

目前我遇到的情况就是用动态的二维数组数据渲染echarts图标&#xff0c;我们从后端收到的接口一般是个一维数组&#xff0c;需要手动构建并且保证响应式。接下来我做了个案例 一、案例总逻辑 1. 先创建一个vue项目 2. 添加 echarts依赖 3. 模拟数据请求&#xff0c;构建二维数组…

串口数据包收发

数据包 把属于同一批的数据进行打包和分割&#xff0c;方便接收方进行识别 HEX数据包 思路&#xff1a;一个数据规定四个字节&#xff0c;以0xFF为包头&#xff0c;0xFE为包尾&#xff0c;当检测到0xFF时&#xff0c;接下来四个数据就是数据&#xff0c;接收到0xFE时&#x…

Win10系统中GPU深度学习环境配置记录

运行环境 系统&#xff1a;Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡&#xff1a;NVIDIA GeF…

pycharm一直没显示运行步骤,只是出现waiting for process detach

pycharm一直没显示运行步骤&#xff0c;只是出现waiting for process detach&#xff1b;各类音乐免费软件&#xff1b;最棒的下载torch-geometric-CSDN博客&#xff08;不太推荐&#xff09;我强烈推荐这个&#xff1a;_waiting for process detachhttps://blog.csdn.net/weix…

2023年汉字小达人市级比赛在线模拟题来了,四种练习助力好成绩

2023年第十届汉字小达人比赛区级自由报名活动已于9月30日结束&#xff0c;尽管最终晋级市级比赛的名单还需要在11月初发布&#xff08;有一些学校的校级选拔还没结束&#xff09;&#xff0c;但是许多小朋友已经开始准备市级比赛了。 根据往年的经验&#xff0c;实际比赛也是在…

Android 活动Activity

目录 一、启停活动页面1.1 Activity的启动和结束1.2 Activity的生命周期1.3 Activity的启动模式 二、在活动之间传递消息2.1 显式Intent和隐式Intent2.2 向下一个Activity发送数据2.3 向上一个Activity返回数据 三、补充附加信息3.1 利用资源文件配置字符串3.2 利用元数据传递配…

国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!

大家好&#xff0c;CoCode开发云旗下Co-Project V3.6智能项目管理平台正式发布&#xff0c;平台新增功能点锁定功能、敏捷开发模式新增估算板块和两种估算方式。 功能点锁定功能进一步提高了项目估算的灵活性和准确性&#xff0c;有利于提高项目估算效率&#xff1b;而敏捷开发…

数据分析:人工智能篇

文章目录 第三章 数据可视化库matplotlib3.1 matplotlib基本绘图操作3.2 plot的线条和颜色3.3 条形图分析3.4 箱型图分析3.5 直方图分析3.6 散点图分析3.7 图表的美化 第四章 数据预测库Sklearn4.1 sklearn预测未来4.2 回归数据的预测4.2.1 回归数据的切分4.2.2 线性回归数据模…

【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题&#xff1f; HTAP 云数据库VS云原生数据库

《C++ primer plus》精炼(OOP部分)——对象和类(8)

学习是一项持续的投资&#xff0c;永远不会白费——本杰明富兰克林 文章目录 第13章&#xff1a;类继承一个基类和派生类公有继承的逻辑关系&#xff1a;is-a多态公有继承 第13章&#xff1a;类继承 一个基类和派生类 从一个类派生出另一个类时&#xff0c;原始类称为基类&am…