网络编程作业day6

数据库操作的增、删、改完成
 

#include <myhead.h>

//查询的回调函数
int callback(void* data,int count,char** argv, char** columnName)
{
	//count是字段数
	//argv是字段内容
	//columnName是字段名称
    for(int i=0;i<count;i++) 
    {
        printf("%s=%s\n", columnName[i], argv[i] ? argv[i] : "NULL");
    }
    puts("");
    return 0;
}
int main(int argc, const char *argv[])
{
	//定义数据库句柄指针
	sqlite3 *ppfd=NULL;
	//打开一个数据库,如果不存在则创建并打开
	if(sqlite3_open("./my.db",&ppfd)!=SQLITE_OK)
	{
		printf("sqlite3_open error,errcode\n");
		return -1;
	}
	puts("数据库打开成功");
	//创建数据表
	//1、准备sql1语句
	char sql1[128]="create table if not exists worker(id int,name char,salary double)";
	char *errmsg=NULL;    //存放执行SQL语句中的错误信息
	if(sqlite3_exec(ppfd,sql1,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("exec error:%s\n",errmsg);
		sqlite3_free(errmsg);
		errmsg=NULL;
		return -1;
	}
	puts("员工信息表创建成功");
	int number;           //操作码
	while(1)
	{
		system("clear");    //清空之前的终端信息
		printf("\t\t=======XXX公司员工管理系统=======\n");
		printf("\t\t======1、添加员工信息=========\n");
		printf("\t\t======2、删除员工信息=========\n");
		printf("\t\t======3、修改员工信息=========\n");
		printf("\t\t======4、查询员工信息=========\n");
		printf("\t\t======0、退出=========\n");

		printf("请输入操作码:");          
		scanf("%d", &number);
		getchar();                          
		switch(number)
		{
		case 1:    //添加员工信息
			{
				//定义修改数据表中的数据容器
				char id[128]; //id	
				char name[128];      //name
				char salary[128];   //salary
				printf("请输入数据:");
				scanf("%s %s %s",id,name,salary);
				//准备sql2语句
				char sql2[128];
				sprintf(sql2,"insert into worker values (%s,'%s',%s)",id,name,salary);
				char *errmsg=NULL;    //存放执行SQL语句中的错误信息
				if(sqlite3_exec(ppfd,sql2,NULL,NULL,&errmsg)!=SQLITE_OK)
				{
					printf("exec error:%s\n",errmsg);
					sqlite3_free(errmsg);
					errmsg=NULL;
					return -1;
				}
			}
			break;
		case 2:      //删除员工信息
			{
				char rbuf[128];   //字段名
				char sbuf[128];   //数据
				printf("请输入字段名和数据:");
				scanf("%s %s",rbuf,sbuf);
				//准备sql3语句
				char sql3[128];
				sprintf(sql3,"delete from worker where %s='%s'",rbuf,sbuf);
				 printf("%s\n",sql3);
				char *errmsg=NULL;    //存放执行SQL语句中的错误信息
				if(sqlite3_exec(ppfd,sql3,NULL,NULL,&errmsg)!=SQLITE_OK)
				{
					printf("exec error:%s\n",errmsg);
					sqlite3_free(errmsg);
					errmsg=NULL;
					return -1;
				}
			}
			break;
		case 3:    //修改员工信息
			{
				char rbuf[128];   //字段名
				char sbuf[128];   //数据
				char buf1[128];   //限制条件字段名
				char buf2[128];   //限制条件数据
				printf("请输入限制条件字段名和数据:");
				scanf(" %s %s",buf1,buf2);
				printf("修改的字段名和数据:");
				scanf(" %s %s",rbuf,sbuf);
				//准备sql4语句
				char sql4[128];
				sprintf(sql4,"update worker set %s='%s' where %s='%s'",rbuf,sbuf,buf1,buf2);
				char *errmsg=NULL;    //存放执行SQL语句中的错误信息
				if(sqlite3_exec(ppfd,sql4,NULL,NULL,&errmsg)!=SQLITE_OK)
				{
					printf("exec error:%s\n",errmsg);
					sqlite3_free(errmsg);
					errmsg=NULL;
					return -1;
				}
			}
			break;
		case 4:     //查询员工信息
			{ 
				char rbuf[128];   //字段名
				char sbuf[128];   //数据
				printf("查询的字段名和数据:");
				scanf(" %s %s",rbuf,sbuf);
				//准备sql5语句
				char sql5[128];
				sprintf(sql5,"select * from worker where %s='%s'",rbuf,sbuf);
				char *errmsg=NULL;    //存放执行SQL语句中的错误信息
				if(sqlite3_exec(ppfd,sql5,callback,NULL,&errmsg)!=SQLITE_OK)
				{
					printf("exec error:%s\n",errmsg);
					sqlite3_free(errmsg);
					errmsg=NULL;
					return -1;
				}
			}
			break;
		case 0:
			goto END;
		default:printf("您输入的功能有误,请重新输入!!!\n");
		}
		printf("请输入任意键,按回车清屏\n");
		while(getchar()!= '\n');
	}
END:
	//关闭数据库
	sqlite3_close(ppfd);
	return 0;
}

 

sqlite_exec函数作业演示视频

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能驾驶规划控制理论学习06-基于优化的规划方法

目录 一、优化概念 1、一般优化问题 2、全局最优和局部最优 二、无约束优化 1、无约束优化概述 2、梯度方法 通用框架 线性搜索 回溯搜索 3、梯度下降 基本思想 实现流程 ​4、牛顿法 基本思想 实现流程 5、高斯牛顿法 6、LM法&#xff08;Le…

通过hyperbeam创建梁单元截面属性

1、为模型中标准的圆柱形创建梁单元和赋予属性&#xff1b; 2、为模型中不标准的对称性实体创建梁单元和赋予属性&#xff1b; 3、为模型中壳体部分创建梁单元和赋予属性&#xff1b;

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

分布式事务(SeataClient)

问题场景 元数据 库存 100订单记录为空下单操作 @AutowiredRestTemplate restTemplate;/*** 下单** @return*/@Transactional // 开启事务 异常后触发数据库回滚操作@Overridepublic Order create(Order order) {// 插入订单orderMapper.insert(order);// 扣减库存 MultiValu…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

折线图 温度变化曲线图

代码详情介绍 导入必要的库&#xff1a; matplotlib.pyplot&#xff1a;用于绘图。 matplotlib.font_manager&#xff1a;用于设置中文字体。 datetime&#xff1a;用于处理日期和时间。 random&#xff1a;用于生成随机数。 numpy&#xff1a;用于生成arange函数的刻度。 设置…

【kubernetes】关于k8s集群如何将pod调度到指定node节点?

目录 一、k8s的watch机制 二、scheduler的调度策略 Predicate&#xff08;预选策略&#xff09; 常见算法&#xff1a; priorities&#xff08;优选策略&#xff09;常见的算法有&#xff1a; 三、k8s的标签管理之增删改查 四、k8s的将pod调度到指定node的方法 方案一&am…

RK356X RK3588 单独编译kernel 与烧录

RK356X RK3588 单独编译kernel 与烧录 可以快速提高我们开发与调试速度 网上可查到的方法如下&#xff1a; RK3568 Android12&#xff1a; 1.添加kernel-4.19/makekernel.sh #!/bin/sh make -j24 ARCHarm64 CC../prebuilts/clang/host/linux-x86/clang-r416183b/bin/clang …

EasyRecovery易恢复2024免激活安装包下载

EasyRecovery易恢复是一款功能强大的数据恢复软件。这款软件由全球著名数据厂商Kroll Ontrack出品&#xff0c;可以恢复被删除的文件、文件夹&#xff0c;以及被格式化的磁盘等数据。无论是硬盘、U盘、SD卡还是其他移动设备&#xff0c;EasyRecovery易恢复都能通过其专业的数据…

全连接神经网络算法原理(激活函数、前向传播、梯度下降法、损失函数、反向传播)

文章目录 前言1、全连接神经网络的整体结构&#xff1a;全连接神经网络模型是由输入层、隐藏层、输出层所组成&#xff0c;全连接神经网络结构如下图所示&#xff1a;全连接神经网络的每一层都是由一个一个的神经元所组成的&#xff0c;因此只要搞清楚神经元的本质就可以搞清楚…

MetaQTL:元分析基础教程

MetaQTL 基础知识 在遥远的海洋中&#xff0c;每个岛屿都藏着无尽的宝藏&#xff0c;而探险家们争相寻找地图&#xff0c;以期揭开宝藏的秘密。 现实世界中&#xff0c;我们的基因组就像那片广阔的海洋&#xff0c;而隐藏在其中的宝藏就是控制我们身高、健康、甚至是我们性格的…

MM配置2-给公司代码分配工厂

配置步骤&#xff0c;如下图&#xff1a;在弹出的对话框中将工厂分配给相应的公司代码 保存完成

UDP通信发送和接收 || UDP实现全双工通信

recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 功能: 从套接字中接收数据 参数: sockfd:套接字文件描述符 buf:存放数据空间首地址 …

java的运算符

整形和浮点型相比&#xff0c;浮点型的范围更大&#xff0c;所以在Java中正常条件下都是整形隐式转换为浮点型(任意整形都可以隐式转换为double或者float)&#xff0c;浮点型不能隐式转换为整形。 1.算术运算符 1. 基本四则运算符&#xff1a;加减乘除模( - * / %) 加减乘都…

mfc110u.dll丢失的解决方法,5招搞定mfc110u.dll丢失问题

mfc110u.dll是一个动态链接库文件&#xff0c;它是Microsoft Foundation Class&#xff08;MFC&#xff09;库的一部分。MFC是微软公司为Visual C开发人员提供的一个类库&#xff0c;用于简化Windows应用程序的开发过程。mfc110u.dll文件包含了MFC库中的一些功能和类&#xff0…

口碑营销:品牌如何维护良好口碑?

企业的品牌传播最有效的方式莫过用户的口碑&#xff0c;互联网的发展为企业的品牌传播引入了驱动力&#xff0c;愈来愈多的企业花费更多的资源开展网络口碑的建设和维护&#xff0c;那么企业如何维护好网络口碑&#xff1f; 1、持续传递优质的品牌内容 内容是营销推广的支撑点&…

MySQL进阶之(四)InnoDB数据存储结构之行格式

四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…

贪心 Leetcode 968 监控二叉树

监控二叉树 Leetcode 968 学习记录自代码随想录 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 要点&#xff1a;1.想到优先覆盖叶子节点&#xff0c…

数字孪生10个技术栈:数据采集的八种方式

大家好&#xff0c;我是贝格前端工场&#xff0c;上期讲了数字孪生10个技术栈&#xff08;总括&#xff09;:概念扫盲和总体介绍&#xff0c;获得了大家的热捧&#xff0c;本期继续分享技术栈&#xff0c;大家如有数字孪生或者数据可视化的需求&#xff0c;可以联络我们。 一、…

企业内部培训考试系统在线考试都用到了哪些防作弊技术?

企业内部培训考试系统在线考试功能采用了多种技术手段来防止作弊行为&#xff0c;确保考试的公平性和有效性&#xff0c;具体如下&#xff1a; 1. 人脸识别验证&#xff1a;在考试开始前&#xff0c;考生需要进行人脸识别核验。系统会根据考生的姓名和身份证号实时采集人脸与公…