linux-c 使用c语言操作sqlite3数据库-1

news2024/11/14 12:05:19

一、练习目标

1、目标

1、使用sqlite3_exec执行查询语句,并将查询结果insert到链表中,最后打印链表的内容;

2、使用sqlite3_get_table执行查询语句,并以key:value的方式,打印查询结果。

2、环境准备

2.1、sql脚本文件

create table if not exists student(
	id integer primary key autoincrement,
	name text not null,
	sex text check(sex=='f' or sex='m') default 'f',
	chinese real check(chinese>=0 and chinese<=150) default 0,
	math real check(math>=0 and math<=150) default 0,
	english real check(english>=0 and english<=1500) default 0
);

insert into student (name,sex,chinese,math,english)values ('aaa','f',10,11,12);
insert into student (name,sex,chinese,math,english)values ('bbb','m',20,21,22);
insert into student (name,sex,chinese,math,english)values ('bbb','f',30,31,32);
insert into student (name,sex,chinese,math,english)values ('ccc','m',40,41,42);
insert into student (name,sex,chinese,math,english)values ('ddd','f',50,51,52);
insert into student (name,sex,chinese,math,english)values ('eee','m',60,61,62);
insert into student (name,sex,chinese,math,english)values ('fff','f',70,71,72);
insert into student (name,sex,chinese,math,english)values ('ggg','m',80,81,82);
insert into student (name,sex,chinese,math,english)values ('hhh','f',90,91,92);
insert into student (name,sex,chinese,math,english)values ('iii','m',100,101,102);
insert into student (name,sex,chinese,math,english)values ('jjj','f',110,111,112);

2.2、通过sqlite3的命令行工具,导入表结构及数据

# 导入建表语句和数据
.read sql脚本名称

# 配置sqlite3工具的select结果,显示表头
.head on

# 配置sqlite3工具的select结果,对其
.mode column

# 查询导入的表数据
select * from student;

# 显示上一行的查询结果
id  name  sex  chinese  math   english
--  ----  ---  -------  -----  -------
1   aaa   f    10.0     11.0   12.0   
2   bbb   m    20.0     21.0   22.0   
3   bbb   f    30.0     31.0   32.0   
4   ccc   m    40.0     41.0   42.0   
5   ddd   f    50.0     51.0   52.0   
6   eee   m    60.0     61.0   62.0   
7   fff   f    70.0     71.0   72.0   
8   ggg   m    80.0     81.0   82.0   
9   hhh   f    90.0     91.0   92.0   
10  iii   m    100.0    101.0  102.0  
11  jjj   f    110.0    111.0  112.0 

2.3、gcc编译指令(使用到了sqlite3第三方库

gcc 源码.c -lsqlite3

二、相关API

参考sqlite3官网: List Of SQLite Functions

1、sqlite3_open

2、sqlite3_close

3、sqlite3_exec

4、sqlite3_get_table

三、源码与结果

1、sqlite3_exec练习

typedef struct{
	int id;
	char name[20];
	char sex[5];
	float chinese;
	float math;
	float english;
}stu_t;

typedef struct nn{
	union{
		stu_t data;
		struct nn* tail;//尾节点
	};
	struct nn* next;
}link_t, node_t;

link_t* link_create();
void link_insertRear(link_t* L, stu_t stu);
void link_destroy(link_t* L);


int callback_func(void* arg, int argc, char** argv, char** colv){
	//printf("查询到了一条数据\n");
	link_t* L=(link_t*)arg;
	//
	stu_t stu;
	stu.id=atoi(argv[0]);
	strcpy(stu.name,argv[1]);
	strcpy(stu.sex,argv[2]);
	stu.chinese=atof(argv[3]);
	stu.math=atof(argv[4]);
	stu.english=atof(argv[5]);
	//
	link_insertRear(L, stu);
	

	return 0;
}


int main(int argc, const char *argv[])
{
	//open
	sqlite3* db;
	if(sqlite3_open("test.db", &db)!=SQLITE_OK){
		fprintf(stderr, "数据库文件打开失败\n");
		return -1;
	}	
	printf("数据库打开成功\n");
	
	//exec
	char* sql="select id,name,sex,chinese,math,english from student;";
	
	printf("SQLITE_OK=%d\n", SQLITE_OK);
	//
	link_t* L=link_create();
	
	char* errmsg=NULL;

	if(sqlite3_exec(db, sql, callback_func,L, &errmsg)!=SQLITE_OK){
		fprintf(stderr, "sqlite_exec 执行error, errmsg=[%s]\n", errmsg);
		return -1;
	}
	
	sqlite3_free(errmsg);
	//打印查询结果
	printf("查询成功\n");
	node_t* p=L->next;
	while(p){
		stu_t s=p->data;
		printf("id=[%d],name=[%s],sex=[%s],chinese=[%.1f],math=[%.1f],english=[%.1f]\n", s.id,
				s.name, s.sex, s.chinese, s.math, s.english);
		p=p->next;
	}
	
	//close
	if(sqlite3_close(db) != SQLITE_OK){
		fprintf(stderr, "数据库文件关闭失败\n");
		return -1;
	}

	printf("数据库文件已经关闭\n");

	return 0;
}

link_t* link_create(){
	link_t* L=(link_t*)malloc(sizeof(link_t));
	L->next=NULL;
	L->tail=L;
	return L;
}

void link_insertRear(link_t* L, stu_t stu){
	node_t* p=(node_t*)malloc(sizeof(node_t));
	p->next=NULL;
	memcpy(&p->data, &stu, sizeof(stu_t));
	//
	L->tail->next=p;
	L->tail=p;
}

void link_destroy(link_t* L){
	node_t* p=L;
	while(p!=NULL){
		node_t* temp=p;
		free(temp);
		p=p->next;
	}
	free(L);
}

运行结果:

2、sqlite3_get_table练习

源码:

int main(int argc, const char *argv[])
{
	//open
	sqlite3* db;
	if(sqlite3_open("test.db", &db)!=SQLITE_OK){
		fprintf(stderr,"文件打开失败\n");
		return -1;
	}
	printf("文件打开成功");
	

	//get_table
	char* sql="select id,name,sex,chinese,math,english from student;";
	char** res=NULL;
	int row,col;
	char* errmsg=NULL;

	if(sqlite3_get_table(db, sql,&res,&row,&col,&errmsg)!=SQLITE_OK){
		fprintf(stderr,"函数sqlite3_get_table执行失败, errmsg=[%s]\n", errmsg);
		return -1;
	}
	
	//处理查询返回结果
//	for(int i=0;i<row+1;i++){
//		for(int j=0;j<col;j++){
//			printf("%s\t", res[i*col+j]);
//		}
//		printf("\n");
//	}
	//
	printf("***********************");
	for(int i=1;i<row+1;i++){
		printf("第[%02d]行: ", i);
		for(int j=0;j<col;j++){
			printf("%s=[%s] ",res[0+j], res[i*col+j]);
		}
		printf("\n");
	}

	//释放
	sqlite3_free_table(res);	
	sqlite3_free(errmsg);

	//close
	if(sqlite3_close(db)!=SQLITE_OK){
		fprintf(stderr,"文件关闭失败\n");
		return -1;
	}
	printf("文件关闭成功\n");
	
	return 0;
}

运行结果:

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

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

相关文章

软件需求规格书评审报告,系统需求设计申评审,代码和测试过程评审报告,软件各类资质评审资料(word原件)

1.需求规格说明评审报告 2.系统设计评审报告 3.编码与测试评审报告 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0…

flink sql同步mysql数据表到mysql

1. 关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld systemctl status firewalld2.安装java8 yum list java-1.8* yum install java-1.8.0-openjdk* -yjava -version3.下载和部署mysql yum -y install wget wget https://dev.mysql.com/get/Down…

【分布式事务】二、NET8分布式事务实践: DotNetCore.CAP 框架 、 消息队列(RabbitMQ)、 多类型数据库(MySql、MongoDB)

介绍 DotNetCore.CAP简称CAP, [CAP]是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案, 同样可以用来作为 EventBus 使用,CAP 拥有自己的特色,它不要求使用者发送消息或者处理消息的时候实现或者继承任何接口,拥有非常高的灵活性。我们一直坚信…

vue3项目中内嵌vuepress工程两种实现方式

目录 一、示例二、创建vuepress工程三、配置vue项目的打包命令四、 通过iframe嵌套实现过程五、 将vue项目打包&#xff0c;启本地服务运行index.html 一、示例 vue项目&#xff0c;点击用户手册按钮&#xff0c;通过a标签跳转到vuepress框架搭建的页面。点击后者通过路由跳转…

智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题

1. 背景 智能座舱多屏项目&#xff0c;中控屏切换语言&#xff0c;后排屏闪黑屏问题 2. 详细分析过程 通过events log查看activity的生命周期&#xff1a;adb shell logcat -b events com.android.rwhvac.view.behind.BehindActivity2 : displayId 2 副屏app com.android.…

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展&#xff0c;多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求&#xff0c;尤其是中英双语用户的需求&#xff0c;设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…

【JavaEE初阶】多线程上部

文章目录 本篇目标&#xff1a;一、认识线程&#xff08;Thread&#xff09;1.概念&#xff1a;2.创建线程 二、Thread 类及常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性2.3 启动⼀个线程 - start()2.4 中断⼀个线程2.5 等待⼀个线程 - join()2.6 获取当前线程…

丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用

文章目录 前言一、DAMODEL平台特性二、创建CPU云实例三、CogVedioX介绍四、DAMODEL一键部署CogVideoX1. 创建丹摩实例(参考上述介绍)2. 配置环境和依赖3. 模拟与配置文件4. 开始运行4.1 调试4.2 webUI4.3 端口映射 前言 DAMODEL&#xff08;丹摩智算&#xff09;是一款专为满足…

MySQL的知识巩固

目录 三大范式 第一范式: 第二范式: 第三范式: 巴斯-科德范式(BCNF): 反范式&#xff1a; MySQL的工作原理 三大范式 第一范式: 一个字段只表明一个事情 优点: 数据一致性&#xff1a; 在1NF中&#xff0c;由于每个属性都是原子的&#xff0c;因此避免了在一个属性中存…

越野车TV 1.0.5337 | TV端越野赛车游戏,解锁无限金币

越野车TV是一款专为电视设计的越野赛车游戏&#xff0c;最初是安卓手机端的游戏&#xff0c;现已移植到TV端并兼容遥控器操作。这款游戏的特点是解锁了VIP&#xff0c;所有资源都可以免费使用。游戏采用3D横版卡通风格&#xff0c;提供真实的越野赛车体验。玩家可以在崎岖的赛道…

MySQL 迁移 dm

参考链接 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;MySQL 5.7.27 迁移 DM 8 语雀 迁移前准备 以下中的命名&#xff0c;密码都是可修改的&#xff0c;这里给出的就只是一个例子 创建表空间 # 创建表空间名为 dbTest&#xff0c;路径为 Z:\fei\data\dm\dbT…

信息安全工程师(82)操作系统安全概述

一、操作系统安全的概念 操作系统安全是指操作系统在基本功能的基础上增加了安全机制与措施&#xff0c;从而满足安全策略要求&#xff0c;具有相应的安全功能&#xff0c;并符合特定的安全标准。在一定约束条件下&#xff0c;操作系统安全能够抵御常见的网络安全威胁&#xff…

从0开始学习Linux——文件管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

vue中调用全屏方法、 elementUI弹框在全屏模式下不出现问题、多级嵌套弹框蒙层遮挡问题等处理与实现方案

全屏模式下弹框不展示的原因是elementUI的弹框我们让他挂在body中了&#xff0c;而我们全屏的div盒子不是整个文档&#xff0c;这时候就找不到弹框了。 当我们把弹框改为插入到父元素上 这时候会出现蒙层盖住整个页面&#xff0c;什么也点不了的问题。 这是elementUI官方的一个…

特征检测与特征匹配方法笔记+代码分享

在一幅图像中&#xff0c;总能发现其独特的像素点&#xff0c;这些点可以被视为该图像的特征&#xff0c;我们称之为特征点。在计算机视觉领域中&#xff0c;基于特征点的图像特征匹配是一项至关重要的任务&#xff0c;因此&#xff0c;如何定义并识别一幅图像中的特征点显得尤…

补: 力扣145 : 二叉树的后序遍历

天才的回归 ---- 二叉树的后序遍历 描述&#xff1a; **给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 ** 示例&#xff1a; 解法&#xff1a;递归就不说了&#xff0c;看下遍历法&#xff0c;与先序和中序略有不同 简单来说注意两个点&#xff1a; 1&…

Centos8 安装 JDK / Python / MySQL / Redis / Nginx

安装 JDK 华为镜像 JDK 下载地址&#xff1a;https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 这里安装 JDK8 为例&#xff1a; # 这里直接通过 wget 下载 wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x…

使用轻易云平台高效集成聚水潭与南网订单数据

高效实现聚水潭与南网供应商对接的数据集成方案 普通发货对接南网供应商配送通知接口 在现代数据集成项目中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接是一个关键挑战。本文将聚焦于一个实际案例&#xff1a;将聚水潭平台的数据集成到南方电网商城平台&#xff…

【经验分享】一招解决VMware虚拟机存储空间越来越大的问题

【经验分享】一招解决VMware虚拟机硬盘空间越来越大的问题 前言一、解决办法二、补充说明 前言 在使用虚拟机过程中&#xff0c;会出现用着用着虚拟机硬盘占用空间越来越大的问题。即使删除了文件&#xff0c;依然会占用宿主机的硬盘空间。如果虚拟机一开始分配的硬盘空间过大…