C语言操作SQL数据库

本文详细介绍了如何在C语言中使用SQLite的API接口,包括如何通过`sqlite3_open`打开或创建数据库,`sqlite3_close`关闭连接,以及`sqlite3_exec`执行SQL语句和使用回调函数处理查询结果。
摘要由CSDN通过智能技术生成

1.打开/创建数据库的C语言接口

  • int sqlite3_open(const char *filename, sqlite3 **ppDb)
  • 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
  • int sqlite3_close(sqlite3*)
  • 该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完 成。
  • 如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
  • const char *sqlite3_errmsg(sqlite3*);通常用来返回最近调用的API接口的错误信息
  • int sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
下面的 C 代码段显示了如何使用 sqlite3_open 连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
#include <stdio.h>
#include <sqlite3.h>

int main(int argc,char **argv)
{
	sqlite3* pd;
	int ret;
	if(argc < 2){
		printf("ought to %s xxx.db\n",argv[0]);
		return -1;
	}
	if((ret=sqlite3_open(argv[1],&pd))==SQLITE_OK){//第二个参数是一个二级指针
		printf("open succeed %s\n",argv[1]);
	}else{
		printf("error:%s  ret = %d\n",sqlite3_errmsg(pd),ret);

	}
	sqlite3_close(pd);
	printf("close");
}

执行结果,这里显示打开了数据库

2.创建表的C接口

1、函数介绍

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
  • sqlite3 是打开的数据库对象
  • sqlite_callback 是一个回调
  • data 作为回调函数的第一个参数
  • errmsg 将被返回用来获取程序生成的任何错误
  • sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止

数据库中有n条数据回调函数就会调用n次,注意return 0;得返回0,经过验证返回其他的只会调用一次

sqlite3_exec的最后一个参数errmsg返回的是错误信息,这里我们直接传递一个char型的指针,经过验证这里不会发生段错误,sqlite3_exec函数会自动给空指针或野指针分配内存空间。

 2、回调函数介绍

typedef int (*sqlite3_callback)(void*,int,char**, char**);
函数原型
int callback ( void * arg , int column_size , char * column_value [], char * column_name [])
参数分析:
  • void *arg:是sqlite3_exec函数的第四个参数
  • column_size:数据库的字段 数
  • column_value[]:列的值
  • column_name:字段名字

函数原型也可以是

typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName);

  • para : 由sqlite3_exec传入的参数指针,或者说是指针参数
  • columnCount: 查询到的这一条记录由多少个字段(多少列)
  • columnValue : 该参数是双指针,查询出来的数据都保存在这里,它是一个1维数组,每一个元素都是一个char*,是一个字段内容,所以这个参数就可以不是单字节,而是可以为字符串等不定长度的数值,用字符串表示,以’\0’结尾
  • columnName : 该参数是双指针,语columnValue是对应的,表示这个字段的字段名称

这里使用二级指针上面使用指针数据,其实都一样,网上说使用这个回调函数必须static的,但是在C语言中我尝试不是也可以。

代码示例:查询数据库表中的内容

#include <stdio.h>
#include <sqlite3.h>
//typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName);
int callback(void *para,int columenCount,char** columnValue,char** columnName)
{	
	printf("para = %s\n",(char*)para);
	for(int i =0;i<columenCount;i++){
		printf("%-8s",columnName[i]);
	}
	printf("\n");
	for(int i =0;i<columenCount;i++){
		printf("%-8s",columnValue[i]);
	}
	printf("\n");
	
	return 0;
}
int main(int argc,char **argv)
{
	sqlite3* pd;
	char *p = "happy";
	int ret;
	if(argc < 2){
		printf("ought to %s xxx.db\n",argv[0]);
		return -1;
	}
	if((ret=sqlite3_open(argv[1],&pd))==SQLITE_OK){//第二个参数是一个二级指针
		printf("open succeed %s\n",argv[1]);
	}else{
		printf("error:%s  ret = %d\n",sqlite3_errmsg(pd),ret);

	}
	//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
	sqlite3_exec(pd,"select * from stu;",callback,p,NULL);//最后一个参数可以设置为NULL

	sqlite3_close(pd);
	printf("close");
}

 运行结果

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值