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版本是这样 过滤所有请求用/* 那么其实还有…

Java练习day3

一、验证回文串 1、题目链接 点击跳转到题目位置 2、代码 class Solution {public boolean judge(char ch){if((ch > a && ch < z) || (ch > 0 && ch < 9)){return true;}return false;}public boolean judge1(char ch1, char ch2){if(ch1 ch…

如何在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…

CSS中:root伪类的使用

在CSS中&#xff0c;:root是一个伪类选择器&#xff0c;它选择的是文档树的根元素。在HTML文档中&#xff0c;这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如&#xff0c;你可以使用:root来定义一个全局的字体大小&a…

java spring IOC的三种方式之XML形式

IOC IOC就是将获取对象的方式将给框架&#xff0c;或者交给容器进行&#xff0c;有三种方式 基于Xml 元数据模式基于注解的配置基于Java config XML形式 相关的注解 需要再相应的对象类class上使用 Component修饰&#xff0c;表示是一个beacon。&#xff0c;然后再XML中配…

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

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

添加路径到头文件默认搜索路径

在linux环境下写代码&#xff0c;出现函数是从其他文件引用的&#xff0c;需要把该文件的搜索路径添加到当前文件。 注意&#xff0c;除非必要&#xff0c;一般不建议这样做。比较好的方式是写入到CMakeLists或者Makefile中。 一次性生效&#xff0c;命令行输入即可&#xff…

FFmpeg 命令:从入门到精通 | ffmpeg 命令裁剪与合并视频

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频裁剪生成测试文件拼接文件拼接不同编码的文件 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令裁剪与合并视频 本节主要介绍了一些使用…

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…

Windows电脑多开器的优缺点对比

Windows电脑多开器是一种能够让用户同时运行多个应用程序、游戏或者网页的软件工具。它的作用在于让用户能够更加高效地工作、学习或者娱乐。但是&#xff0c;这种软件也存在一些优劣势的对比。 优点&#xff1a; 提升工作效率。多开器可以让用户同时打开多个应用程序或者网页…