QT:Widgets中的数据库应用

SQL数据库驱动

在这里插入图片描述
pro文件中添加如下一行代码

QT += sql widgets

在这里插入图片描述
main.cpp

#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
int main(int argc, char *argv[])
{QApplication a(argc, argv);qDebug() << "Available drivers:";//函数获取当前 Qt 环境下可用的数据库驱动名称列表,并将其存储到 QStringList 类型的变量 drivers 中QStringList drivers = QSqlDatabase::drivers();for(const QString&driver:drivers)qDebug() << driver;return a.exec();
}

在这里插入图片描述

主要目的是展示当前 Qt 开发环境下可用的数据库驱动有哪些,它本身没有实际连接和操作具体的数据库,但为后续基于 Qt 进行数据库相关开发(比如选择合适的数据库驱动去连接数据库、执行 SQL 查询等操作)提供了基础信息,帮助开发者了解系统的数据库驱动支持情况。

创建数据库连接

添加新的C++头文件,名称为connection.h

在这里插入图片描述

#ifndef CONNECTION_H
#define CONNECTION_H#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>static bool createConnection()
{QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 如果数据库文件不存在,SQLite会自动创建它db.setDatabaseName("test.db");if (!db.open()) {QMessageBox::critical(0, "Cannot open database","Unable to establish a database connection.", QMessageBox::Cancel);return false;}QSqlQuery query;/** 通过 query 对象执行一条 CREATE TABLE 的 SQL 语句,* 在数据库中创建一个名为 student 的表,该表包含两个列,* id 列的数据类型为整数(int )并且被设置为主键(primary key ),* name 列的数据类型为可变长度字符串(varchar ),最大长度为 20 个字符。*/query.exec("create table student (id int primary key, ""name varchar(20))");query.exec("insert into student values(0, 'LiMing')");query.exec("insert into student values(1, 'LiuTao')");query.exec("insert into student values(2, 'WangHong')");return true;
}#endif // CONNECTION_H

main.cpp文件中

#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}return a.exec();
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录query.exec("insert into student (id, name) values (100, 'ChenYun')");query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();return a.exec();
}
#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录/*这里直接调用 QSqlQuery 类的 exec 函数,并传入一条完整的 INSERT INTO 类型的 SQL 语句。* 这条语句的作用是向名为 student 的数据库表中插入一条记录,* 指定了要插入的列 id 和 name ,以及对应的值分别为 100 和 'ChenYun'。* 通过这种方式,可以简单直接地向表中插入固定数据,* 适合在数据明确且不需要动态变化的情况下使用。*/query.exec("insert into student (id, name) values (100, 'ChenYun')");/** 首先调用 query.prepare 函数,传入一条带有命名占位符(这里使用 :id 和 :name 作为占位符)* 的 INSERT INTO 类型的 SQL 语句模板。这种方式允许我们先准备好 SQL 语句的结构,* 后续再动态地绑定具体的参数值,使得 SQL 语句可以在不同的数据情况下重复使用,增强了灵活性。接着定义了两个变量 idValue(整数类型,赋值为 190 )和nameValue(QString 类型,赋值为 "Chenzhen" ),这两个变量分别对应要插入到表中的 id 和 name 字段的值。然后通过 query.bindValue(":id", idValue); 和query.bindValue(":name", nameValue); 这两行代码,将具体的变量值绑定到对应的占位符上。bindValue 函数的第一个参数是占位符名称(要和 prepare 语句中的占位符严格对应),第二个参数是要绑定的值,这样就把实际的数据和 SQL 语句中的占位符关联起来了。最后调用 query.exec() 执行这条已经绑定好参数的 SQL 语句,将包含具体数据(id 为 190 ,name 为 "Chenzhen" )的记录插入到 student 表中。*/query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();/** 同样先调用 query.prepare 函数,不过这次使用的是 ? 作为占位符来构建 INSERT INTO 类型* 的 SQL 语句模板,这种占位符方式也是常见的参数化 SQL 语句的形式。然后定义了 idValue1(整数类型,赋值为 1009 )和 nameValue1(QString 类型,赋值为 "xiaoYun" )两个变量,用于存储要插入的数据。接着通过 query.addBindValue(idValue1); 和 query.addBindValue(nameValue1);依次将变量值添加到绑定参数列表中,按照顺序与 SQL 语句模板中的 ? 占位符一一对应,即第一个 addBindValue 绑定的值对应第一个 ? 占位符,第二个 addBindValue 绑定的值对应第二个 ? 占位符。最后执行 query.exec() ,将带有具体绑定参数(id 为 1009 ,name 为 "xiaoYun" )的SQL 语句提交给数据库执行,实现向 student 表中插入相应记录的操作。*/query.prepare("insert into student (id, name) values (?, ?)");int idValue1 = 1009;QString nameValue1 = "xiaoYun";query.addBindValue(idValue1);query.addBindValue(nameValue1);query.exec();return a.exec();
}

在这里插入图片描述

#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>#include <QSqlError>int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;// 使用QSqlQuery查询整张表QSqlQuery query;query.exec("select * from student");while(query.next()) {qDebug() << query.value(0).toInt() << query.value(1).toString();}//就在student表中重新插入了一条记录/*这里直接调用 QSqlQuery 类的 exec 函数,并传入一条完整的 INSERT INTO 类型的 SQL 语句。* 这条语句的作用是向名为 student 的数据库表中插入一条记录,* 指定了要插入的列 id 和 name ,以及对应的值分别为 100 和 'ChenYun'。* 通过这种方式,可以简单直接地向表中插入固定数据,* 适合在数据明确且不需要动态变化的情况下使用。*/query.exec("insert into student (id, name) values (100, 'ChenYun')");/** 首先调用 query.prepare 函数,传入一条带有命名占位符(这里使用 :id 和 :name 作为占位符)* 的 INSERT INTO 类型的 SQL 语句模板。这种方式允许我们先准备好 SQL 语句的结构,* 后续再动态地绑定具体的参数值,使得 SQL 语句可以在不同的数据情况下重复使用,增强了灵活性。接着定义了两个变量 idValue(整数类型,赋值为 190 )和nameValue(QString 类型,赋值为 "Chenzhen" ),这两个变量分别对应要插入到表中的 id 和 name 字段的值。然后通过 query.bindValue(":id", idValue); 和query.bindValue(":name", nameValue); 这两行代码,将具体的变量值绑定到对应的占位符上。bindValue 函数的第一个参数是占位符名称(要和 prepare 语句中的占位符严格对应),第二个参数是要绑定的值,这样就把实际的数据和 SQL 语句中的占位符关联起来了。最后调用 query.exec() 执行这条已经绑定好参数的 SQL 语句,将包含具体数据(id 为 190 ,name 为 "Chenzhen" )的记录插入到 student 表中。*/query.prepare("insert into student (id, name) values (:id, :name)");int idValue = 190;QString nameValue = "Chenzhen";query.bindValue(":id", idValue);query.bindValue(":name", nameValue);query.exec();/** 同样先调用 query.prepare 函数,不过这次使用的是 ? 作为占位符来构建 INSERT INTO 类型* 的 SQL 语句模板,这种占位符方式也是常见的参数化 SQL 语句的形式。然后定义了 idValue1(整数类型,赋值为 1009 )和 nameValue1(QString 类型,赋值为 "xiaoYun" )两个变量,用于存储要插入的数据。接着通过 query.addBindValue(idValue1); 和 query.addBindValue(nameValue1);依次将变量值添加到绑定参数列表中,按照顺序与 SQL 语句模板中的 ? 占位符一一对应,即第一个 addBindValue 绑定的值对应第一个 ? 占位符,第二个 addBindValue 绑定的值对应第二个 ? 占位符。最后执行 query.exec() ,将带有具体绑定参数(id 为 1009 ,name 为 "xiaoYun" )的SQL 语句提交给数据库执行,实现向 student 表中插入相应记录的操作。*/query.prepare("insert into student (id, name) values (?, ?)");int idValue1 = 1009;QString nameValue1 = "xiaoYun";query.addBindValue(idValue1);query.addBindValue(nameValue1);query.exec();/*首先,调用 QSqlQuery 类的 prepare 函数来准备一条 INSERT INTO 类型的 SQL 语句模板。* 这里使用 ? 作为占位符,表明后续会为这两个位置(对应 id 和 name 字段)动态绑定具体的值。* 通过提前准备语句模板的方式,可以提高执行多条结构相似的 SQL 语句时的效率,* 因为数据库系统通常会对预编译的语句进行优化处理。*/query.prepare("insert into student (id, name) values (?, ?)");/** 创建 QVariantList 用于存储 id 值:创建了一个 QVariantList 类型的列表 ids。QVariantList 是 Qt 中的一种容器,它可以存储多种不同类型的数据(通过 QVariant 类型进行统一封装),在这里用于存储要插入到数据库表中 id 字段的值。填充 id 值到列表:使用 << 操作符向 ids 列表中依次添加了三个整数值 20、21 和 22,表示准备插入三条记录的 id 字段将分别使用这些值。绑定 id 值列表到 SQL 语句占位符:接着调用 query.addBindValue(ids); 将包含 id 值的列表绑定到 SQL 语句模板中第一个 ? 占位符对应的位置。这意味着数据库在执行时会将这个列表中的每个元素依次替换到该占位符处,用于多次插入操作中的 id 值部分。*/QVariantList ids;ids << 20 << 21 << 22;query.addBindValue(ids);QVariantList names;names << "xiaoming" << "xiaoliang" << "xiaogang";query.addBindValue(names);//执行批量插入操作及错误处理/** 执行批量插入:* 调用 query.execBatch() 函数来执行批量插入操作。* 这个函数会将之前绑定的 QVariantList 中的数据元素按照顺序,* 以批量的方式多次执行预编译的 SQL 语句(每次使用一组对应的占位符绑定值),* 向数据库表 student 中插入多条记录。* 如果批量插入操作成功执行,execBatch 函数返回 true;反之,* 如果在执行过程中出现问题,比如数据类型不匹配、违反表约束、数据库连接问题等,* 函数返回 false。* 错误处理:* 通过 if 语句判断 execBatch 函数的返回值,如果为 false,即插入操作失败,* 就调用 query.lastError() 获取最后一次发生的错误信息,并通过 qDebug()* 将错误信息输出到控制台(一般是程序运行时所在的终端环境)。这样在出现插入失败的情况时,* 可以方便地查看具体是什么原因导致的问题,便于进行调试和修复。*/if(!query.execBatch()) qDebug() << query.lastError();/*这行代码执行了一条 UPDATE 类型的 SQL 语句,* 目的是更新数据库中 student 表内的数据。* 具体来说,它要将表中满足 id = 20 这个条件的记录的 name 字段值更新为 'xiaohong'。* 也就是在 student 表中查找 id 为 20 的那行记录,然后把该行记录对应的 name 字段原来的* 值替换成 'xiaohong'。*/query.exec("update student set name = 'xiaohong' where id = 20"); // 更新/** 这行代码执行的是一条 DELETE FROM 类型的 SQL 语句,* 用于从数据库的 student 表中删除满足特定条件的数据记录。* 在这里的作用是删除 student 表中 id 等于 1009 的那条记录。* 只要表中存在 id 为 1009 的记录,执行这条语句后,该记录就会被从表中永久删除。*/query.exec("delete from student where id = 1009");              // 删除return a.exec();
}

在这里插入图片描述

#include <QApplication>
#include <QSqlDatabase>
#include <QStringList>
#include "connection.h"
#include <QVariant>
#include <QDebug>
#include <QSqlError>int main(int argc, char *argv[])
{QApplication a(argc, argv);if (!createConnection()) return 1;QSqlDatabase::database().transaction();QSqlQuery query;query.exec("SELECT id FROM student WHERE name = 'LiuTao'");if (query.next() == true){qDebug() << "-------" ;int employeeId = query.value(0).toInt();qDebug() << "id:" << employeeId ;int newId = employeeId + 999;query.exec("INSERT INTO student (id, name) VALUES (" + QString::number(newId) + ", 'Jack')");}QSqlDatabase::database().commit();return a.exec();
}

在这里插入图片描述

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

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

相关文章

AI的进阶之路:从机器学习到深度学习的演变(三)

&#xff08;承接上集&#xff1a;AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;二&#xff09;&#xff09; 四、深度学习&#xff08;DL&#xff09;&#xff1a;机器学习的革命性突破 深度学习&#xff08;DL&#xff09;作为机器学习的一个重要分支&am…

数据集-目标检测系列 车牌检测识别 数据集 CCPD2019

车牌检测&识别 数据集 CCPD2019 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; 数据样…

(2024.12)Ubuntu20.04安装ZED-SDK

一.官网地址 ZED SDK 4.2 - Download | Stereolabs 选择适配版本进行下载 二.安装程序 下载完成后&#xff0c;进入文件目录&#xff0c;打开终端&#xff0c;输入&#xff1a; chmod x ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zstd.run ./ZED_SDK_Ubuntu20_cuda11.8_v4.2.2.zst…

python coding(二) Pandas 、PIL、cv2

Pandas 一个分析结构化数据的工具集。Pandas 以 NumPy 为基础&#xff08;实现数据存储和运算&#xff09;&#xff0c;提供了专门用于数据分析的类型、方法和函数&#xff0c;对数据分析和数据挖掘提供了很好的支持&#xff1b;同时 pandas 还可以跟数据可视化工具 matplotli…

第十五届蓝桥杯Scratch01月stema选拔赛—排序

排序 具体要求&#xff1a; 1). 点击绿旗&#xff0c;在舞台上出现4张点数不同的扑克牌&#xff0c;牌上的点数是随机的&#xff08;4-9点&#xff09;&#xff0c;如图所示&#xff1b; 完整题目可点击下方链接查看&#xff1a; 排序_scratch_嗨信奥-玩嗨信息奥林匹克竞赛-…

图形 3.4 延迟渲染管线介绍

延迟渲染管线介绍 B站视频&#xff1a;图形 3.4 延迟渲染管线介绍 文章目录 延迟渲染管线介绍渲染路径前向渲染渲染流程光照规则 延迟渲染渲染流程几何缓冲区 G-buffer 不同渲染路径的优劣以及特性优劣 Unity中渲染路径设置移动端优化分块延迟渲染 其他渲染路径不同路径下光源…

Qt之串口设计-线程实现(十二)

Qt开发 系列文章 - Serial-port&#xff08;十二&#xff09; 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架&#xff0c;在串口编程方面提供了方便易用…

1.gitlab 服务器搭建流程

前提条件&#xff1a; 一、服务器硬件水平 搭建gitlab服务器最低配置要求2核4G,低于这个配置的服务器运行效果很差。 gitlab官网&#xff1a;https://about.gitlab.com/ 下载地址&#xff1a;gitlab/gitlab-ce - Packages packages.gitlab.com 本机ubuntu 二、安装依赖 su…

powerhsell 初认识

免责声明 本文是学习与泷羽Sec B站课程的课程笔记内容&#xff0c;仅作学习使用&#xff0c;如有破坏网络安全的行为&#xff0c;本人概不负责 B站链接&#xff1a;https://space.bilibili.com/350329294 资源自取&#xff1a;https://pan.quark.cn/s/b2718e905db8 powerhsel…

自我维护和保养

学习运动两不误&#xff01; 本人学习过程中&#xff0c;长期久坐导致各种身体问题&#xff08;特别是腰间盘突出&#xff0c;右侧肩胛骨翘等问题&#xff01;&#xff09;&#xff0c;希望给有类似烦恼的人们带去福音&#xff01;&#xff01;&#xff01; 我的椎间盘损伤历…

详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)

1、什么是I/O 在计算机操作系统中&#xff0c;所谓的I/O就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write)&#xff0c;针对不同的对象&#xff0c;I/O模式可以划分为…

Cursor的重磅功能Agent登场

今天看了一些介绍&#xff0c;cursor有一个新功能agent ,试用了一下非常好用。再也不用头痛地选择相关的上下文&#xff0c;真是懒人利器。 Agant特性&#xff1a; 可以自主选择上下文能够使用终端可以独立完成整个任务 赶紧介绍给大家&#xff0c;使用时&#xff0c;需要在c…

5G -- 空口关键技术

前言&#xff1a; 手机(UE)和5G基站(gNodeB)之间的空中接口 新技术的特点&#xff1a; 1、提升速率&#xff1a;大带宽、新编码、高阶调制、F-OFDM、M-MIMO 2、降低时延&#xff1a;灵活帧结构、自包含时隙、免授权调度、D2D 3、提升覆盖&#xff1a;上下行解耦、EN-DC(双连…

常用Python自动化测试框架有哪些?

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)

做完这些工作之后&#xff0c;不要忘记打开 Windows Server 的防火墙端口&#xff0c;8181、8081、8080、22、443、1521 做完这些工作之后&#xff0c;不要忘记打开 Windows Server 的防火墙端口&#xff0c;8181、8081、8080、22、443、1521 做完这些工作之后&#xff0c;不要…

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1&#xff1a;测试接口接口准备线程组添加线程组配置线程组值线程数&#xff08;Number of Threads&#xff09;Ramp-Up 时间&#xff08;Ramp-Up Period&#xff09;循环次数&#xff08;Loop Count&…

Iris简单实现Go web服务器

package mainimport ("github.com/kataras/iris" )func main() {app : iris.New() // 实例一个iris对象//配置路由app.Get("/", func(ctx iris.Context) {ctx.WriteString("Hello Iris")})app.Get("/aa", func(ctx iris.Context) {ct…

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一&#xff1a;What is HTTP(S)?&#xff08;什么是http&#xff08;s&#xff09;&#xff09; 1.What is HTTP? (HyperText Transfer Protocol)&#xff08;什么是 HTTP&#xff1f;&#xff08;超文本传输协议&#xff09;&#xff09; http是你查看网站的时候遵循的…

【C++11】可变模板参数

目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 ​编辑 模拟实现&#xff1a;emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比 C9…

springmvc的拦截器,全局异常处理和文件上传

拦截器: 拦截不符合规则的&#xff0c;放行符合规则的。 等价于过滤器。 拦截器只拦截controller层API接口。 如何定义拦截器。 定义一个类并实现拦截器接口 public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest reque…