一、练习目标

1、目标

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

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

运行结果:

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

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

运行结果:

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

11-12 07:00