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

一、练习目标

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;
}

运行结果:

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

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

相关文章

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

AI绘画到底怎么画,才能出好图!一文详解

前言 在当今数字化的时代&#xff0c;AI 绘画以其强大的创造力和便捷性&#xff0c;成为了众多艺术爱好者和创作者的新宠。无论是专业画家想要拓展创作思路&#xff0c;还是业余爱好者渴望展现自己的创意&#xff0c;AI 绘画都提供了无限的可能。那么&#xff0c;究竟如何才能…

计算机组成原理——计算机的基本组成

1.计算机硬件的基本组成 冯-诺依曼计算机的特点&#xff1a; 1.计算机由运算器&#xff08;ALU&#xff09;、控制器&#xff08;CU&#xff09;、存储器、输入设备、输出设备五个部分组成 2.指令和数据以同等地位存于存储器中&#xff0c;可以通过地址访问 3.指令和数据以二…

【人工智能】ChatGPT多模型感知态识别

目录 ChatGPT辅助细化知识增强&#xff01;一、研究背景二、模型结构和代码任务流程一&#xff1a;启发式生成 三、数据集介绍三、性能展示实现过程运行过程训练过程 ChatGPT辅助细化知识增强&#xff01; 多模态命名实体识别&#xff08;MNER&#xff09;最近引起了广泛关注。…

python 爱心邮件代码

import smtplib import time from email.mime.text import MIMEText import requests from lxml import etree import datetime from requests.exceptions import RequestException# 邮件配置 sender_maile # 发件人地址 sender_pass # 邮件授权码 boy_name # 发件人姓…

ssm+jsp704学术团队管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

[Docker#2] 发展历史 | Namespace环境隔离 | Cgroup资源控制

目录 1.发展历史 Jail 时代 云时代 云原生时代 技术标准的确立 虚拟机 vs Docker 2. 容器化技术 2.1 Namespace 命令详解 1. dd 命令 2. mkfs 命令 3. df 命令 4. mount 命令 5. unshare 命令 实战 进程隔离 文件隔离 2.2 CGroup 相关命令 2.1 pidstat 2.…

【Ubuntu学习】Ubuntu无法使用vim命令编辑

问题 在VMware首次安装Ubuntu&#xff0c;使用vi指令对文件进行编辑&#xff0c;按i键后无法更改文件内容。 原因 由于Ubuntu中预装的是vim-tiny&#xff0c;平时开发中需要使用vim-full。 解决方案 卸载预装vim sudo apt-get remove vim-common安装vim-full sudo apt-get …

同轴全息图和离轴全息图

一、同轴全息图 1.1 记录 设透明的物体(相位物)的振幅透过率为: t0是一个很高的平均透射率,表示围绕平均值的变化。 透射光场可以看成由两项组成: 一项是由t0表示的强而均匀的平面波, 它相当于波前记录时的参考波, 另一 项是Δt 所代表的弱散射波, 它相当于波前记录时的物光波…

Redhat切换其他源

1. 效果图 2. 安装 RPM 包的命令 rpm -ivh --nodeps --force epel-release-latest-8.noarch.rpm rpm -ivh --nodeps --force yum-4.7.0-4.el8.noarch.rpm rpm -ivh --nodeps --force yum-utils-4.0.21-3.el8.noarch.rpm 3. 修改默认源 vi /etc/yum.repos.d/redhat.repo[BaseO…

SpringMVC学习记录(三)之响应数据

SpringMVC学习记录&#xff08;三&#xff09;之响应数据 一、页面跳转控制1、快速返回模板视图2、转发和重定向 二、返回JSON数据1、前置准备2、ResponseBody 三、返回静态资源1、静态资源概念2、访问静态资源 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为h…

MethodChannel的用法

文章目录 1 知识回顾2 示例代码3 经验总结我们在上一章回中介绍了MethodChannel的使用方法,本章回中将介绍EventChannel的使用方法.闲话休提,让我们一起Talk Flutter吧。 1 知识回顾 我们在前面章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一种…

[每周一更]-(第122期):模拟面试|数据库面试思路解析

10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树? 为什么 MySQL 用 B+ 树而不用 B 树? 什么是覆盖索引? 什么是聚簇索引/非聚簇索引? 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引? 什么回表?如何避免回表? 树的高度和查询性能是什么关系? 什么是索引最左…

React的概念以及发展前景如何?

React是一个由Facebook开发的用于构建用户界面的的开源JavaScript库&#xff0c;它主要用于构建大型、动态的Web应用程序。React的主要特点是使用VirtualDOM&#xff08;虚拟DOM&#xff09;来优化性能&#xff0c;并使用声明式的编程方式来编写UI。 React的主要概念包括&#…

【Spring编程常见错误50例】03.依赖注入常见错误-上

1.多个实现类 如何匹配 在实际的开发中&#xff0c;我们会使用Autowired 注解进行依赖注入对应的bean&#xff0c;但是如果我们依赖的是一个接口&#xff0c;有对应多个实现的话&#xff0c;就会出现异常。 RestController public class DbController {Autowiredprivate DbSe…

智能母线插接箱监测装置的工作原理与实际应用分析

徐悦 安科瑞电气股份有限公司 随着电力系统的智能化发展&#xff0c;如何有效地监控电力系统的运行状态并保证系统安全性&#xff0c;成为电力运维中不可忽视的问题。AMB100智能母线直流监控装置应运而生。本文将详细介绍AMB100的工作原理及技术特点&#xff0c;结合实际应用…

USB包的结构

本文章主要来自《圈圈教你玩USB》的学习笔记 USB包的结构 USB是串行总线&#xff0c;所以数据是一位位的在数据总线上传输&#xff0c;采用LSB在前的方式。 USB数据需要经过位填充和NRZI编码。在这里讨论时&#xff0c;所用的数据都是原始数据&#xff0c;即没有经过位填充和…

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.11 一维到三维推广&#xff08;1D and 3…