当前位置: 首页 > news >正文

数据库sqlite3

用数据库函数完成数据的增删改查

增:

将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。

int do_insert(sqlite3 *ppDb)
{Worker Work;printf("输入插入的工号:");scanf("%d",&Work.gh);printf("输入插入的姓名:");scanf("%s",Work.name);printf("输入插入的薪资:");scanf("%lf",&Work.salary);char *errmsg = NULL;char sqlite[100];snprintf(sqlite,sizeof(sqlite),"insert into Work values(%d,\"%s\",%lf);",Work.gh,Work.name,Work.salary);if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}return 0;
}

删:

根据输入的姓名来删除这个人的信息;原理和增操作一样,只需将snprintf函数中的字符串改成相应的sqlite3命令语句即可

int do_delete(sqlite3 *ppDb)
{char key[20];printf("输入要删除的姓名:");scanf("%s",key);getchar();char *errmsg = NULL;char sqlite[100];snprintf(sqlite,sizeof(sqlite),"delete from Work where name == \"%s\";",key);if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现输出工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}printf("删除成功,输入5查看删除结果\n");return 0;
}

 改:

根据姓名更改相关信息,一次只能更改一项,所以使用了两次snprintf函数

int do_mod(sqlite3 *ppDb)
{char key[20];printf("输入要修改的姓名:");scanf("%s",key);getchar();Worker Work;printf("输入修改后的工号:");scanf("%d",&Work.gh);printf("输入修改后的薪资:");scanf("%lf",&Work.salary);char *errmsg = NULL;char sqlite[100];snprintf(sqlite,sizeof(sqlite),"update Work set gh = %d where name == \"%s\";",Work.gh,key);if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}snprintf(sqlite,sizeof(sqlite),"update Work set salary = %lf where name == \"%s\";",Work.salary,key);if(sqlite3_exec(ppDb,sqlite,NULL,NULL,&errmsg)!= 0)//实现插入一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}printf("修改成功,输入5查看修改结果\n");return 0;
}

查:

前面过程都类似,在sqlite3_exec函数中加入callback回调函数,实现输出查找的信息

int callback(void *arg,int n,char **msgtext,char **msgtable)
{int i,j;char **a = msgtable;for(i = 0;i<2;i++){for(j = 0;j<n;j++){printf("%s\t",*(a++));}puts("");}return 0;
}
//查找一个工人的信息
int do_reseach(sqlite3 *ppDb)
{char key[20];printf("输入要查找的姓名:");scanf("%s",key);getchar();char *errmsg = NULL;char sqlite[100];snprintf(sqlite,sizeof(sqlite),"select * from Work where name == \"%s\";",key);if(sqlite3_exec(ppDb,sqlite,callback,NULL,&errmsg)!= 0)//实现查找一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}return 0;
}

遍历:

和查找的操作类似,会出现一个问题:当我想把标题输出出来的时候,当输出完一个人的信息后这个标题又会重新输出一次。

这时想到可以在show_all中使用flag,这样就只能输出一次,但还是不行,还是会变;

又想到用static关键字,这样就不会改变flag了,但这样就只有第一次遍历可以有这个效果,后面就不会有列名;

既然static是将局部变量具有全局变量的效果,那就定义一个全局的flag变量

int show_all(void *arg,int n,char **msgtext,char **msgtable)
{int num = 0;for(int i = 0;i<n;i++){printf("%s\t",*(msgtable+i));}puts("");char **a = msgtext;while(*a != NULL){num++;printf("%s\t",*(a++));if(num%3 == 0){printf("\n");}}return 0;
}
//输出所以工人信息
int do_showall(sqlite3 *ppDb)
{char *errmsg = NULL;char sqlite[100] = "select * from Work;";if(sqlite3_exec(ppDb,sqlite,show_all,NULL,&errmsg)!= 0)//实现查找一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n",sqlite3_errcode(ppDb),errmsg,__LINE__);return -1;}
}

定义全局变量后,如果在回调函数结束前将flag在重新改为1,那就白费功夫了,所以在do_showall函数结束前重新改为1.

int flag = 1;
int show_all(void *arg, int n, char **msgtext, char **msgtable)
{int num = 0;if (flag){for (int i = 0; i < n; i++){printf("%s\t", *(msgtable + i));}puts("");flag = 0;}char **a = msgtext;while (*a != NULL){num++;printf("%s\t", *(a++));if (num % 3 == 0){printf("\n");}}return 0;
}
// 输出所以工人信息
int do_showall(sqlite3 *ppDb)
{char *errmsg = NULL;char sqlite[100] = "select * from Work;";if (sqlite3_exec(ppDb, sqlite, show_all, NULL, &errmsg) != 0) // 实现查找一个工人信息{perror("sqlite3_exec");printf("错误码:%d错误信息:%s,错误行:%d\n", sqlite3_errcode(ppDb), errmsg, __LINE__);return -1;}flag = 1;return 0;
}

相关文章:

数据库sqlite3

用数据库函数完成数据的增删改查 增&#xff1a; 将要存储的信息录入到结构体中&#xff0c;再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。 int do_insert(sqlite3 *ppDb) {Worker Work;printf("输入插入的工号:");scanf("%d&qu…...

开发基础之Python 函数(Basic Python Functions for Development)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

Django_Vue3_ElementUI_Release_001_项目初始化

1. 数据库 1.1 安装 https://blog.csdn.net/rbx508780/article/details/127176754 1.2 创建数据库 1.3 DBeaver可视化数据库 https://dbeaver.io/download/ 2 安装Python(3.9.12) 2.1 下载地址 https://www.python.org/downloads/release/python-3912/ 2.2 设定国内源 pip …...

MySQL之安装与基础知识

目录 一&#xff1a;在centos7上安装MySQL数据库 1.卸载默认存在的环境 2.配置mysql的yum源 3. 安装MySQL 4.登录mysql 5.设置MySQL的配置文件 二&#xff1a;MySQL基础知识 1.什么是数据库 2.主流数据库 3.服务器&#xff0c;数据库&#xff0c;表关系及使用案例 4…...

前端基础 | HTML基础:HTML结构,HTML常见标签

文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签&#xff1a;h1–h62.3段落标签&#xff1a;p2.4 换行标签&#xff1a;br2.5格式化标签2.6 图片标签&#xff1a;i…...

宏任务和微任务+超全面试真题

概念 微任务和宏任务是在异步编程中经常使用的概念&#xff0c;用于管理任务的执行顺序和优先级。 宏任务&#xff1a;setTimeout, setInterval&#xff0c;I/O 操作和 UI 渲染等。微任务&#xff1a; Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…...

针对SVM算法初步研究

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;心态决定高度&#xff0c;细节决定成败…...

Java中的`String`不可变性详解

在Java中&#xff0c;String类具有不可变性&#xff08;immutable&#xff09;&#xff0c;这意味着一旦String对象被创建&#xff0c;它的值将无法更改。所有对字符串的修改操作&#xff08;如拼接、替换等&#xff09;实际上都会生成一个新的字符串对象&#xff0c;而不会修改…...

c# SMTP发送邮件

string from ""; string fromAlias "MIS-TC"; string[] to { "" }; string subject "问题提交"; string body sb.ToString(); string ipaddr "smtp.email.qq.com"; int port 25; string credit ""; strin…...

GPU基础 -- 并行化与阿姆达尔定律

并行化与阿姆达尔定律 并行化是将计算任务分割成多个部分&#xff0c;使这些部分能够在多个处理器或核心上同时运行&#xff0c;从而加速任务的完成时间。阿姆达尔定律&#xff08;Amdahl’s Law&#xff09;则揭示了并行化所能带来的加速效果的限制。 阿姆达尔定律公式 阿姆…...

Lua热更

Lua 热更 前提 Lua是轻量级&#xff0c;可以解释执行的编程语言、性能好 基本原则 1.场景空 代码控制物体加载释放 2.场景一个 3.节点不手动挂代码 4.AssetsBundle资源管理 5.Lua开发框架 6.调试模式、发布模式 XLua 热更框架 XLua是C#环境下Lua的解决方案 1.Lua虚拟…...

提升汽车行业软件质量:ASPICE培训的关键实践方法

ASPICE&#xff08;汽车行业软件过程改进和能力确定&#xff09;培训是一种针对汽车行业软件开发和维护过程的标准化培训。 该培训旨在帮助组织提高其软件开发和维护过程的质量和效率。以下是ASPICE培训的一些最佳实践方法&#xff1a; 1. 理解ASPICE框架&#xff1a;首先&…...

2024 全新智能识别 API 接口震撼登场

近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;智能识别技术逐渐成为了各个领域的热门应用。在这个大背景下&#xff0c;2024 年的全新智能识别 API 接口横空出世&#xff0c;为我们的生活带来了更多的便利。本文将为大家详细介绍这个全新智能识别 API 接口&#x…...

《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》要点提炼

论文来源&#xff1a;https://arxiv.org/abs/2402.18115 《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》是2024CVPR中的一篇关于视频分割的论文&#xff0c; 主要内容&#xff1a; 论文提出了一个名为UniVS的新型统一视频分割架构&#xff0c…...

计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

基于SpringBoot+Vue+MySQL的瑜伽馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本系统采用SpringBoot作为后端框架&#xff0c;Vue.js构建前端用户界面&#xff0c;MySQL作为数据库存储系统&#xff0c;实现了瑜伽馆的全面数字化管理。系统涵盖会员管理、课程预约、教练排班、收入统计等功能模块&#xff0c…...

【MySQL】EXPLAIN(执行计划)关键字是什么?

简介&#xff1a; explain是一个强大的 SQL 命令&#xff0c;用于分析和优化查询性能。通过查看数据库执行计划&#xff0c;我们可以理解查询是如何被处理的&#xff0c;包括表的访问顺序、使用的索引、连接类型等。这对于找到潜在的性能瓶颈非常重要。 目录 一、基本含义 二…...

Mybatis两种方式来调用sql语句

使用Mybatis时&#xff0c;有两种方式来调用sql语句&#xff1a; 方式一&#xff08;直接通过Session对象调用sql语句&#xff09;&#xff1a; SqlSession sqlSession sqlSessionFactory.openSession(); User user sqlSession.selectOne("userTest.selectUser"…...

第十八节:学习统一异常处理(自学Spring boot 3.x的第五天)

这节记录下如何通过AOP方式统一处理异常拦截。 第一步&#xff1a; 新建一个exception包&#xff0c;创建一个ExcetionHandler.java&#xff08;名字随意取&#xff09; package cn.wcyf.wcai.exception;import cn.wcyf.wcai.common.Result; import org.springframework.web…...

flink中slotSharingGroup() 的详解

在 Apache Flink 中&#xff0c;slotSharingGroup() 是一个用于控制算子&#xff08;operator&#xff09;之间资源共享的机制。它允许多个算子共享相同的 slot&#xff08;即资源容器&#xff09;。Slot 是 Flink 中的资源单位&#xff0c;slot 共享可以提高资源利用率&#x…...

离谱!上海交大一学生私吞 5000 奖金,还用豆包 P 假收据骗队友。网友:学历虽高但人品太低

①5 月 18 日&#xff0c;上海交大一则学生违纪通报冲上热搜&#xff0c;实锤了前几天网上曝光的一名学生侵占团队竞赛奖金、造假欺骗队友的恶劣行为。②在 2025 下半年&#xff0c;樊同学&#xff08;上交大智慧能源学院女生&#xff09;与 K 同学&#xff08;电院男生&#x…...

《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》060、未来趋势与芯片设计者的思考

OpenClaw系列总结:未来趋势与芯片设计者的思考 昨晚调试一块RISC-V核的cache一致性,波形里看到一条store指令被莫名其妙地重复执行了两次。我盯着GTKWave看了半小时,最后发现是写缓冲的valid信号在复位释放后没有清零——一个典型的“芯片级”bug,在嵌入式裸机里永远不会遇…...

告别GDB依赖:在NEMU里打造专属调试器,我是如何搞定单步执行与内存扫描的

从零构建教学级调试器&#xff1a;NEMU Monitor模块深度解析与实践指南 在计算机系统与体系结构的学习过程中&#xff0c;调试器如同探索程序执行奥秘的显微镜。传统调试工具如GDB虽然功能强大&#xff0c;但其内部工作机制对初学者而言却如同黑箱。本文将带您深入NEMU模拟器的…...

从傅里叶到拉普拉斯:给信号处理新手的直观对比指南(附性质对照表)

从傅里叶到拉普拉斯&#xff1a;给信号处理新手的直观对比指南 信号处理领域的数学工具往往让初学者望而生畏。当你刚掌握傅里叶变换的基本概念&#xff0c;迎面而来的拉普拉斯变换又带来新的困惑。这两种变换究竟有何关联&#xff1f;为何工程师需要掌握两种看似相似的分析工具…...

【408高效刷题神器】数据结构核心考点:受限双端队列秒杀法、括号匹配与表达式精妙转换(附解题口诀)

&#x1f4cc; 导语 在 408 计算机统考的数据结构科目中&#xff0c;栈和队列&#xff08;特别是受限双端队列和表达式转换&#xff09;是选择题的必考重灾区。这类题目如果单纯靠脑补极易出错。本文整理自今日的高效复习笔记&#xff0c;提炼出了一套“降维打击”式的做题方法…...

REX-C410温控仪连接K型热电偶相关参数设置

1、同时按SET<键3秒 并按SET切换 修改后按 SET键3秒 保存 改SL1 参数为000 K型热电偶 改SL4 参数为0011 过程上限报警 2、按 SET键3秒 改AL1 为SV设定温度值这样修改后当实际温度 小于SV 设定温度值时OUT有输出&#xff0c;当温度达到设定值时ALM1有输出...

LeetCode 每日一题笔记 日期:2026.05.16 题目:154. 寻找旋转排序数组中的最小值 II

LeetCode 每日一题笔记 0. 前言 日期&#xff1a;2026.05.16题目&#xff1a;154. 寻找旋转排序数组中的最小值 II难度&#xff1a;困难标签&#xff1a;数组、二分查找 1. 题目理解 问题描述&#xff1a; 给定一个可能存在重复元素的升序数组&#xff0c;经过1~n次旋转后&…...

终极Gmail桌面体验:告别浏览器标签混乱,拥抱高效邮件管理

终极Gmail桌面体验&#xff1a;告别浏览器标签混乱&#xff0c;拥抱高效邮件管理 【免费下载链接】gmail-desktop :postbox: Gmail desktop app for macOS, Windows & Linux (formerly Gmail Desktop) 项目地址: https://gitcode.com/gh_mirrors/gm/gmail-desktop 厌…...

【软考高级架构】论文范文21——论Kappa架构在大数据平台中的设计与应用

论Kappa架构在大数据平台中的设计与应用 摘要 随着大数据技术的快速发展,传统Lambda架构因需要同时维护批处理和流处理两套系统,导致开发复杂度高、数据口径不一致、运维成本大等问题日益突出。Kappa架构作为一种精简的统一处理范式,通过将数据全部视为流、以消息队列为核…...

PNetLab-vs-EVE-NG安全性分析

1 PNetLab vs EVE-NG社区版&#xff1a;从一次CVE看"免费fork"的安全代价 1.1 痛点引入 2025年11月&#xff0c;CVE-2025-63749被公开披露——PNetLab 5.3.11存在命令注入漏洞&#xff0c;攻击者通过qemu_options参数注入$(/bin/bash -c reverse_shell)&#xff0c;…...