sqlite3编程接口(c语言实现对数据库的操作)

各函数用法:

int sqlite3_open(const char *filename,sqlite3 **db);
功能:打开一个sqlite3数据库
filename: 数据库路径名
db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)

int sqlite3_close(sqlite3 *db)
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)

const char *sqlite3_errmsg(sqlite3 *db)
功能:通过db句柄,得到数据库操作的错误信息
返回值:返回错误信息的首地址

sql语句实现插入、删除、更新、查询
int sqlite3_exec(
sqlite3* db,
const char sql,
int (callback)(void,int,char
*,char**),
void *,
char **errmsg
);
功能:执行一条sql语句
参数:db:数据库操作句柄
sql:一条sql语句
callback:回调函数,只有sql为查询语句时,才会执行此语句
arg: 表示的是给回调函数传递参数
errmsg: 错误信息
返回值:成功SQLITE_OK

回调函数:
int (*sqlite3_callback)(void *para, int f_num, char **f_value, char ** f_name);
功能:每找到一条记录自动执行一次回调函数(查询的结果,是一个函数指针类型,传递一个函数名即可)
para:传递给回调函数的参数
f_num: 记录中包含的字段数目
f_value: 包含每个字段值的指针数组
f_name: 包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1;

不使用回调的查询方法:
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg)
功能:执行sql操作
db: 数据库句柄
sql: sql语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码

创建stu.db数据库,并实现插入、删除、查询、更新操作,代码如下:

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

#define DATABASE "stu.db"

int insert(sqlite3 *db)
{
	int id;
	char name[20] = {};
	int score;
	char sql[100] = {};
	char * errmsg;
	
	printf("intput id:");
	scanf("%d",&id);
	getchar();

	printf("input name:");
	scanf("%s",name);
	getchar();

	printf("intput score:");
	scanf("%d",&score);
	getchar();

	sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score); //拼接语句
	
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}
	
	return 0;
}

int delete(sqlite3 *db)
{
	int id;
	char sql[100] = {};
	char * errmsg;
	
	printf("intput id:");
	scanf("%d",&id);
	getchar();

	sprintf(sql,"delete from stu where id=%d;",id);
	
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}
	
	return 0;
}

int update(sqlite3 *db)
{
	int id;
	char name[20] = {};
	int score;
	char sql[100] = {};
	char * errmsg;
	
	printf("intput update id:");
	scanf("%d",&id);
	getchar();
	
	printf("intput update score:");
	scanf("%d",&score);
	getchar();

	sprintf(sql,"update stu set score = %d where id = %d;",score,id);
	
	if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}
	
	return 0;
}

int callback(void *para, int f_num, char **f_value, char ** f_name)
{

	int i = 0;
	for(i = 0; i < f_num; i++)
	{
		printf("%-11s",f_value[i]);
	}
	printf("\n");
	return 0;
}

/*int search(sqlite3 *db)  //采用回调方式查询
{
	char sql[100] = {};
	char *errmsg;
	
	sprintf(sql,"select * from stu;");
	if(sqlite3_exec(db,sql,callback,NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}
}*/

int search(sqlite3 *db)		// 不采用回调查询
{
	char sql[100] = {};
	char *errmsg;
	char ** resultp;
	int nrow, ncolumn, i, j, index;
	
	sprintf(sql,"select * from stu;");
	if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}

	for(j = 0; j < ncolumn; j++)	//输出表头,若不需输出表头,可将此循环注释掉
	{
		printf("%-11s ",resultp[j]);
	}
	putchar(10);
	
	index = ncolumn;  //跨过表头,直接输出记录
	for(i = 0; i < nrow; i++)
	{
		for(j = 0; j < ncolumn; j++)
		{
			printf("%-11s ",resultp[index++]);
		}
		putchar(10); //换行符
	}
	sqlite3_free_table(resultp);//get_table用完后应该释放此临时开辟的空间
	return 0;
}

int main(int argc, const char **argv)
{
	sqlite3 *db;
	char * errmsg;
	int cmd;
	
	if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
	{
		printf("%s\n",sqlite3_errmsg(db));
		return -1;
	}

	//创建数据库表
	if(sqlite3_exec(db,"create table stu(id int primary key not null, name text not null,score int not null);",NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
	}

	printf("input cmd:");
	while(1)
	{
		printf("\n");
		printf("******************************\n");
		printf("1.insert 2.delete 3.search 4.update 5.quit\n");
		printf("******************************\n");
		printf("\n");
		scanf("%d",&cmd);
		getchar();

		switch(cmd)
		{
			case 1:
				insert(db);
				break;
			case 2:
				delete(db);
				break;
			case 3:
				search(db);
				break;
			case 4:
				update(db);
				break;
			case 5:
				sqlite3_close(db);
				exit(0);
			default:
				printf("error command\n");				
		}
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值