当前位置: 首页 > 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…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...