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

news/2024/11/14 13:53:01/

一、练习目标

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[])
{//opensqlite3* db;if(sqlite3_open("test.db", &db)!=SQLITE_OK){fprintf(stderr, "数据库文件打开失败\n");return -1;}	printf("数据库打开成功\n");//execchar* 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;}//closeif(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[])
{//opensqlite3* db;if(sqlite3_open("test.db", &db)!=SQLITE_OK){fprintf(stderr,"文件打开失败\n");return -1;}printf("文件打开成功");//get_tablechar* 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);//closeif(sqlite3_close(db)!=SQLITE_OK){fprintf(stderr,"文件关闭失败\n");return -1;}printf("文件关闭成功\n");return 0;
}

运行结果:


http://www.ppmy.cn/news/1546387.html

相关文章

嵌入式采集网关(golang版本)

为了一次编写到处运行&#xff0c;使用纯GO编写&#xff0c;排除CGO&#xff0c;解决在嵌入式中交叉编译难问题 硬件设备&#xff1a;移远EC200A-CN LTE Cat 4 无线通信模块&#xff0c;搭载openwrt操作系统&#xff0c;90M内存

青少年编程与数学 02-003 Go语言网络编程 17课题、Go语言Cookie编程

青少年编程与数学 02-003 Go语言网络编程 17课题、Go语言Cookie编程 课题摘要:一、Cookie编程1. 发送Cookies2. 接收Cookies3. 删除Cookies4. Cookie的安全性5. 使用第三方库总结 二、应用场景1. 会话管理&#xff08;Session Management&#xff09;2. 个性化设置3. 追踪用户行…

ajax关于axios库的运用小案例

AJAX案例 图书管理 四大功能&#xff1a; 展示图书删除图书编辑图书信息新增图书 步骤 1.bootstrap弹窗来实现新增和编辑图书时出现的弹窗 有两种方案&#xff1a; a.可以用自带的属性来进行弹窗的显示和隐藏 b.可以通过JS进行控制&#xff0c;此操作可以进行自定义&am…

Ceph MDS高可用架构探索:从零到一构建多主一备MDS服务

文章目录 Ceph实现MDS服务多主一备高可用架构当前 mds 服务器状态添加 MDS 服务器验证ceph集群当前状态当前的文件系统状态设置处于激活状态 mds 的数量MDS 高可用优化分发配置文件并重启 mds 服务 Ceph实现MDS服务多主一备高可用架构 Ceph 的元数据服务&#xff08;MDS&#…

Python学习从0到1 day27 Python 高阶技巧 ④ 设计模式 — 工厂模式

目录 一、什么是工厂模式 二、工厂模式的优点 三、代码示例 总结 1.什么是工厂模式 2.好处 或许总要彻彻底底地绝望一次&#xff0c;才能重新再活一次 —— 24.11.11 一、什么是工厂模式 当需要大量创建一个类的实例的时候&#xff0c;可以使用工厂模式 即&#xff0c;从原生…

13. Node.js会话控制

九、会话控制 9.1会话控制概念 ​ 所谓会话控制就是 对会话进行控! ​ HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端, 无法区分用户,而产品中又大量存在的这样的需求,所以我们需要通过 会话控制 来解决该问题常见的会话控制技术有三种: cook…

金融市场中的量化分析:正大科技如何赋能投资者决策

在当前金融市场中&#xff0c;量化分析技术已成为许多投资者提升决策效率的重要工具。正大科技致力于通过量化分析&#xff0c;帮助投资者基于数据和算法做出更为科学的市场判断。本文将探讨量化分析在金融市场中的应用&#xff0c;并展示正大科技如何利用量化手段优化投资策略…

底层视角看C语言

文章目录 main函数很普通main函数之前调用了什么main函数和自定义函数的对比变量名只为人而存在goto是循环的本质指针变量指针是一个特殊的数字汇编层面看指针数组和指针数组越界问题低端地址越界高端地址越界引用就是指针main函数很普通 main函数是第一个被调用的函数吗?在用…