QSqlQuery增删改查

本文记录使用QSqlQuery实现增删改查的过程。

目录

1. 构建表格数据

声明变量

 表格、数据模型、选择模型三板斧设置

列表执行查询

列表的水平表头设置

2. 新增一行

构建一个空行

通过dialog返回的修改行数据,update更新

3. 更新一行

获取到需要更新的行

 通过dialog更新返回的数据,使用update语句进行更新

4.删除一行

获取该行,及主键

以主键为参数,删除行

5. 批量更改

更新操作受影响行数

总结



1. 构建表格数据

声明变量

    QSqlQueryModel *qryModel;//数据查询模型QItemSelectionModel *selModel;//选择模型SQLiteHelper dbHelper;//自定义数据库帮助类

 表格、数据模型、选择模型三板斧设置

    qryModel = new QSqlQueryModel(this);selModel = new QItemSelectionModel(qryModel,this);ui->tableView->setModel(qryModel);ui->tableView->setSelectionModel(selModel);ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);

列表执行查询

    qryModel->setQuery("SELECT empNo,Name,Gender,Birthday,Province, Department,"" Salary FROM employee order by empNo");if(qryModel->lastError().isValid()){QMessageBox::information(this,"错误","数据表查询失败:\n"+qryModel->lastError().text());return;}

列表的水平表头设置

    //设置表头QSqlRecord rec = qryModel->record();//获取空记录qryModel->setHeaderData(rec.indexOf("empNo"),Qt::Horizontal,"工号");qryModel->setHeaderData(rec.indexOf("Name"),     Qt::Horizontal, "姓名");qryModel->setHeaderData(rec.indexOf("Gender"),   Qt::Horizontal, "性别");qryModel->setHeaderData(rec.indexOf("Birthday"), Qt::Horizontal, "出生日期");qryModel->setHeaderData(rec.indexOf("Province"), Qt::Horizontal, "省份");qryModel->setHeaderData(rec.indexOf("Department"),   Qt::Horizontal, "部门");qryModel->setHeaderData(rec.indexOf("Salary"),       Qt::Horizontal, "工资");

2. 新增一行

构建一个空行

    QSqlQuery query;query.exec("select * from employee where empNo=-1");QSqlRecord curRec = query.record();curRec.setValue("empNo",qryModel->rowCount()+3000);

通过dialog返回的修改行数据,update更新

TDialogData *dlg = new TDialogData(this);Qt::WindowFlags flags = dlg->windowFlags();dlg->setWindowFlags(flags|Qt::MSWindowsFixedSizeDialogHint);//对话框固定大小dlg->setInsertRecord(curRec); //打开窗口,传递插入记录 模式if(dlg->exec()!=QDialog::Rejected){QSqlRecord recData= dlg->getRecordData();//回传回来 记录值query.prepare("INSERT INTO employee(empNo,Name,Gender,Birthday,Province,Department,Salary,Memo,Photo)"" Values(:empNo,:Name,:Gender,:Birthday,:Province,:Department,:Salary,:Memo,:Photo)");query.bindValue(":empNo",recData.value("empNo"));query.bindValue(":Name",recData.value("Name"));query.bindValue(":Gender",recData.value("Gender"));query.bindValue(":Birthday",recData.value("Birthday"));query.bindValue(":Province",recData.value("Province"));query.bindValue(":Department",recData.value("Department"));query.bindValue(":Salary",recData.value("Salary"));query.bindValue(":Memo",recData.value("Memo"));query.bindValue(":Photo",recData.value("Photo"));if(!query.exec())QMessageBox::critical(this,"错误","插入记录失败:\n"+query.lastError().text());else{QMessageBox::information(this,"提示","插入完成");QString sqlStr = qryModel->query().executedQuery();//执行过的查询qryModel->setQuery(sqlStr);}}delete dlg;

3. 更新一行

获取到需要更新的行

    QSqlRecord curRec = qryModel->record(recNo);int empNo = curRec.value("empNo").toInt();QSqlQuery query;query.prepare("select * from employee where empNo=:ID");query.bindValue(":ID",empNo);query.exec();query.first();if(!query.isValid())//无有效记录return;curRec =query.record();//获取当前的记录

 通过dialog更新返回的数据,使用update语句进行更新

TDialogData *dlg = new TDialogData(this);Qt::WindowFlags  flags = dlg->windowFlags();dlg->setWindowFlags(flags |Qt::MSWindowsFixedSizeDialogHint);//对话框固定大小dlg->setUpdateRecord(curRec);int ret = dlg->exec();if(ret == QDialog::Accepted){QSqlRecord recData = dlg->getRecordData();query.prepare("update employee set Name =:Name,Gender =:Gender,"" Birthday=:Birthday,Province =:Province,"" Department=:Department,Salary=:Salary,"" Memo=:Memo,Photo=:Photo"" where empNo=:ID");query.bindValue(":ID",empNo);query.bindValue(":Name",recData.value("Name"));query.bindValue(":Gender",recData.value("Gender"));query.bindValue(":Birthday",recData.value("Birthday"));query.bindValue(":Province",recData.value("Province"));query.bindValue(":Department",recData.value("Department"));query.bindValue(":Salary",recData.value("Salary"));query.bindValue(":Memo",recData.value("Memo"));query.bindValue(":Photo",recData.value("Photo"));if(!query.exec())QMessageBox::critical(this,"错误","更新错误:\n"+ query.lastError().text());else{QString strSql = qryModel->query().executedQuery();//数据模型刷新数据qryModel->setQuery(strSql);}}delete  dlg;

4.删除一行

获取该行,及主键

    int curRecNo = selModel->currentIndex().row();QSqlRecord recData= qryModel->record(curRecNo);int empNo = recData.value("empNo").toInt();

以主键为参数,删除行

    QSqlQuery query;query.prepare("delete from employee where empNo=:empNo");query.bindValue(":empNo",empNo);if(!query.exec())QMessageBox::critical(this,"错误提示","删除失败:\n"+query.lastError().text());else{QString strSql = qryModel->query().executedQuery();qryModel->setQuery(strSql);//刷新上一次查询的查询结果}

5. 批量更改

通过执行批量更改的sql语句达到批改的目的

更新操作受影响行数

    QSqlQuery query;query.prepare("update employee set Salary=Salary*1.1");if(!query.exec())QMessageBox::critical(this,"错误提示","更新失败:\n"+query.lastError().text());else{qint64 affectedRows = query.numRowsAffected();qDebug() << "更新操作影响的行数:" << affectedRows;QString strSql = qryModel->query().executedQuery();qryModel->setQuery(strSql);//刷新上一次查询的查询结果}

总结

1. QSqlQuery是能执行任何SQL语句的类,如SELECT、INSERT、UPDATE、DELETE等SQL语句。

2. 列表查询展示使用QSqlQueryModel 类,使用QSqlQuery来执行sql语句。

tips:

执行上一次的查询

        QString strSql = qryModel->query().executedQuery();qryModel->setQuery(strSql);//刷新上一次查询的查询结果

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

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

相关文章

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

信息安全技术解析

在信息爆炸的今天&#xff0c;信息技术安全已成为社会发展的重要基石。随着网络攻击的日益复杂和隐蔽&#xff0c;保障数据安全、提升防御能力成为信息技术安全领域的核心任务。本文将从加密解密技术、安全行为分析技术和网络安全态势感知技术三个方面进行深入探讨&#xff0c;…

WPF启动失败报System.Windows.Automation.Peers.AutomationPeer.Initialize()错误解决

问题描述 win10系统上WPF程序启动后就崩溃&#xff0c;通过查看崩溃日志如下&#xff1a; 应用程序: xxx.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常&#xff0c;进程终止。 异常信息: System.TypeLoadException 在 System.Windows.Automation.Peers.Automatio…

leetcode-105. 从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,nu…

重塑生态体系 深挖应用场景 萤石诠释AI时代智慧生活新图景

7月24日&#xff0c;“智动新生&#xff0c;尽在掌控”2024萤石夏季新品发布会在杭州举办。来自全国各地的萤石合作伙伴、行业从业者及相关媒体&#xff0c;共聚杭州&#xff0c;共同见证拥抱AI的萤石&#xff0c;将如何全新升级&#xff0c;AI加持下的智慧生活又有何不同。 发…

【WinDbg读取蓝屏的dmp日志】iaStorAC.sys 蓝屏解决

读取蓝屏日志&#xff1a; Window偶尔一次蓝屏不用管。 经常蓝屏重置或重装系统。 想要知道为什么蓝屏&#xff0c;通过WinDbg查看蓝屏日志。 蓝屏日志查找和配置 1&#xff0c;蓝屏那一刻拍照蓝屏的界面&#xff0c;即可知道基本的蓝屏信息。 2&#xff0c;蓝屏日志的配置…

从0开始搭建vue + flask 旅游景点数据分析系统(一):创建前端项目

根据前面的爬虫课程&#xff0c;我们重新开一个坑&#xff0c;就是基于爬取到的数据&#xff0c;搭建一个vueflask的前后端分离的数据分析系统 1 通过这个系列教程可以学习到什么&#xff1f; 从0开始搭建一个 vue flask 的数据分析系统&#xff1b;了解系统的整体架构&…

通信类IEEE会议——第四届通信技术与信息科技国际学术会议(ICCTIT 2024)

[IEEE 独立出版&#xff0c;中山大学主办&#xff0c;往届均已见刊检索] 第四届通信技术与信息科技国际学术会议&#xff08;ICCTIT 2024&#xff09; 2024 4th International Conference on Communication Technology and Information Technology 重要信息 大会官网&#xf…

Visual Studio调试Web项目

一、编译运行调试&#xff08;VS快捷键&#xff1a;CtrlF5&#xff09; 缺点&#xff1a;编译运行项目太慢&#xff0c;整体程序有些编译报错运行不了 二、附加到进程调试&#xff08;VS快捷键&#xff1a;CtrlAltP&#xff0c;选择w3wp.exe&#xff09; 无需编译&#xff0c;速…

数据结构之栈详解

1. 栈的概念以及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

7.23模拟赛总结 [数据结构优化dp] + [神奇建图]

目录 复盘题解T2T4 复盘 浅复盘下吧… 7:40 开题 看 T1 &#xff0c;起初以为和以前某道题有点像&#xff0c;子序列划分&#xff0c;注意到状态数很少&#xff0c;搜出来所有状态然后 dp&#xff0c;然后发现这个 T1 和那个毛关系没有 浏览了一下&#xff0c;感觉 T2 题面…

并发编程--volatile

1.什么是volatile volatile是 轻 量 级 的 synchronized&#xff0c;它在多 处 理器开 发 中保 证 了共享 变 量的 “ 可 见 性 ” 。可 见 性的意思是当一个 线 程 修改一个共享变 量 时 &#xff0c;另外一个 线 程能 读 到 这 个修改的 值 。如果 volatile 变 量修 饰 符使用…

day08:订单状态定时处理、来单提醒和客户催单

文章目录 Spring Task介绍cron表达式入门案例 订单状态定时处理需求分析代码开发扩展 WebSocket介绍入门案例特点 来单提醒需求分析和设计代码实现 客户催单需求分析和设计代码实现 Spring Task 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时…

谁说只有车载HMI界面?现在工业类的HMI界面UI也崛起了

谁说只有车载HMI界面&#xff1f;现在工业类的HMI界面UI也崛起了 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者&#xff0c;其观点始终认为&#xff1a;工业自动化和智能化水平不断提高&#xff0c;人机界面&#xff08;Human-Machine Interface&#xff0c;简称HMI&a…

计网_物理层的传输媒体和设备

2024.07.05&#xff1a;计算机网络物理层的传输媒体和设备学习笔记 第3节 物理层的传输媒体和设备 3.1 传输媒体&#xff08;了解&#xff09;3.1.1 双绞线3.1.2 同轴电缆3.1.3 光缆&#xff08;1&#xff09;光纤特点 3.1.4 非导引型&#xff08;无线&#xff09;传输媒体&…

vue3编程-import.meta.glob实现动态路由(菜单)

import.meta.glob 是vite提供的批量懒加载组件的方法 本地开发环境&#xff1a; const modules import.meta.glob(../views/**/*.vue)这段代码返回的modules是一个Map&#xff1a; key是vue文件的相对路径&#xff0c;值是一个函数&#xff0c;将函数打印出来&#xff0c;如…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

智能电表怎么算电费的?

智能电表作为现代电力管理系统的核心组成部分&#xff0c;通过先进的计量技术和通信手段实现了电费计算的自动化与精准化。本文将详细介绍智能电表的工作原理以及如何基于这些数据计算电费。 一、智能电表的工作原理 -数据采集&#xff1a;智能电表内置传感器持续监测电流、电…

3DMAX科研绘图那些你不得不知道的插件

在3DMAX科研绘图中&#xff0c;有几个插件是不得不提的高效工具&#xff0c;它们能够显著提升科研绘图的效率和质量。以下是一些值得关注的插件&#xff1a; 1. DNAChain&#xff08;一键生成DNA链&#xff09; 功能描述&#xff1a;该插件允许用户沿着线条路径一键生成DNA链…

[Meachines] Lame smbd3.0-RCE

信息收集 IP AddressOpening Ports10.10.10.3TCP:21,22,139,445,3632 $ nmap -p- 10.10.10.3 --min-rate 1000 -sC -sV 21/tcp open ftp vsftpd 2.3.4 |_ftp-anon: Anonymous FTP login allowed (FTP code 230) | ftp-syst: | STAT: | FTP server status: | …