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.mzph.cn/news/93931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA Rogstry中找不到compiler.automake.allow.when.app.running问题解决

网上大部分人教我们 先 File > Settings 然后 勾选 Build 下的 Compiler中的 Build project automatically 这些步骤都不会有问题 然后就会让我们 ctrl shift alt / 点 Rogstry 打开后 我人就麻了 根本没有什么 compiler.automake.allow.when.app.running 也不用慌 我们…

快速上手Apache POI

哈喽~大家好&#xff0c;这篇我们来看看快速上手Apache POI。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Red…

Explain执行计划字段解释说明---select_type、table、patitions字段说明

1、select_type的类型有哪些 2、select_type的查询类型说明 1、SIMPLE 简单的 select 查询,查询中不包含子查询或者UNION 2、PRIMARY 查询中若包含任何复杂的子部分&#xff0c;最外层查询则被标记为Primary 3、DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生)&…

SpringCloudAlibaba 相关组件的学习一

目录 前言 系统架构演变 1、单体架构 2、垂直架构 3、分布式架构 4、SOA架构 5、微服务架构 一、微服务架构的介绍 1、微服务架构的常见问题 2 微服务架构的常见概念 2.1 服务治理 2.2 服务调用 2.3 服务网关 2.4 服务容错 2.5 链路追踪 3、微服务架构的常用解决…

基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案

一、方案背景 近年来&#xff0c;随着居民体育运动意识的增强&#xff0c;体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时&#xff0c;可能发生受伤意外&#xff0c;甚至牵扯责任赔偿纠纷问题。同时&#xff0c;物品丢失、人力巡逻成本问题突出&#xff0c;体育场…

SpringCloud Alibaba - Seata 部署 TC 服务,并集成微服务

目录 一、Seata 架构 1.1、Seata 架构重要角色 1.2、部署 TC 服务 1.2.1、前言 1.2.2、下载 seata-server 包&#xff0c;解压 1.2.3、修改配置 1.2.4、在 nacos 中添加配置 1.2.5、创建数据库表 1.2.6、启动 TC 服务 1.3、微服务集成 Seata 1.3.1、引入依赖 1.3.2、…

证书显示未受信任,生成的证书过期

此时若是导入证书后&#xff0c;证书显示未受信任&#xff0c;则说明我们缺失最新的AppleWWDRCA证书 解决方案&#xff1a; 重新下载AppleWWDRCA并安装。即下载最新的AppleWWDRCA证书&#xff0c;双击安装到“登录”项的钥匙串下&#xff1b;然后再安装你的开发证书或者发布证书…

SpringBoot中使用Servlet和Filter

为什么要把Servlet和Filter写在一起,因为使用方式很相似 两种方式 第一种,使用Servlet和Filter 使用Servlet 继承HttpServlet 注册Servlet 使用Filter 1.自定义过滤器 2.注册过滤器 这里注意一点 使用/**无效 至少我这2.4.5版本是这样 过滤所有请求用/* 那么其实还有…

如何在idea中隐藏文件或文件夹

例如我想要隐藏如下文件 只需要点击file->settings editor->file types->ignores Files and Folders-> 然后按照图片点击顺序操作即可 添加完毕点击apply->ok 隐藏成功后效果如下&#xff1a;

力扣第 365 场周赛虚拟参赛

有序三元组中的最大值 I class Solution { public:long long maximumTripletValue(vector<int>& nums) {vector<long long> num;for (auto &item:nums) {num.push_back(item*1ll);}long long z 0,f 1000000;long long ans 0;long long maxx num[0],mi…

基于SpringBoot的应急物资申请管理系统设计与实现(源码+lw+部署文档+讲解等)

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

Git使用【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过&#xff0c;若要查看可参考【Linu…

蓝桥杯每日一题2023.9.28

AcWing 4409. 砍竹子 - AcWing 题目描述 题目分析 注&#xff1a;sqrtl的范围为long double&#xff0c;比sqrt更加精确 使用优先队列维护一段区间&#xff0c;如果连续一段相同就合并为一个区间&#xff0c;从大到小去枚举&#xff0c;每次先取出最大的一段&#xff0c;双…

Ubuntu中启动HDFS后没有NameNode解决办法

关闭进程&#xff1a; stop-dfs.sh 格式化&#xff1a; hadoop namenode -format 出现报错信息&#xff1a; 23/10/03 22:27:04 WARN fs.FileUtil: Failed to delete file or dir [/usr/data/hadoop/tmp/dfs/name/current/fsimage_0000000000000000000.md5]: it still exi…

libevent源码学习笔记

libevent源码学习笔记 libevent安装libevent源码解析&#xff08;1&#xff09;事件对象&#xff08;2&#xff09;事件操作&#xff08;3&#xff09;事件循环&#xff08;4&#xff09;事件处理 常用指令问题记录问题一&#xff1a;长连接的管理问题二&#xff1a;连接关闭问…

【云备份项目】:环境搭建(g++、json库、bundle库、httplib库)

文章目录 1. g 升级到 7.3 版本2. 安装 jsoncpp 库3. 下载 bundle 数据压缩库4. 下载 httplib 库从 Win 传输文件到 Linux解压缩 1. g 升级到 7.3 版本 &#x1f517;链接跳转 2. 安装 jsoncpp 库 &#x1f517;链接跳转 3. 下载 bundle 数据压缩库 安装 git 工具 sudo yum…

2023年中国家用智能门锁市场发展概况分析:家用智能门锁线上市场销量290.4万套[图]

智能门锁是指区别于传统机械锁的基础上改进的&#xff0c;在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。 智能门锁级别分类 资料来源&#xff1a;共研…

Linux使用之xshell、xftp保姆教学(含安装包,详细使用方法,连接失败解决方法)

前言 链接: FTP&#xff0c;SSH服务器介绍 这是我之前写的一篇博客&#xff0c;其中介绍了Ubuntu操作系统的一些常用命令以及服务器介绍&#xff0c;这篇文章就向大家详细介绍如何安装及应用这些服务器&#xff0c;我以xshell、xftp为例。 安装包&#xff0c;使用方法&#xf…

竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

unicode/utf8/utf16/utf32笔记

unicode表示的字符范围是0x0000~0x10FFFF&#xff0c;最多只需要有21位&#xff0c;但是为了字节对齐&#xff0c;所以最多需要32位(4字节) utf8/utf16/utf32都是表示unicode的一种编码方式。 utf8和utf16是变长编码&#xff0c;utf32不变长。utf-8编码长度为1&#xff0c;2&a…