数据库:SQlite3的C接口相关函数

一、内容介绍

我们在之前的文章中介绍到了SQlite数据库的相关内容及在命令下对数据库的相关操作,但我们通常是在项目中对数据库进行使用,这也就限制了我们不能运用命令行进行操作,但SQlite3给我们提供了相关的C接口,这是我们同样可以运用函数的形式运用嵌入式数据库。

二、相关的SQlite3函数

1、sqliite3_open

函数的原型:int sqlite3_open(const char * dbname,sqlite3 **db);

函数的作用:打开一个数据库,若该数据库不存在,则自动创建该数据库

头文件:#include <sqlite3.h>

参数:dbname:待打开的数据库的文件名称

            db:数据库的句柄(相当于数据库的描述符)

返回值:执行成功,返回SQLITE_OK(0);

                执行出错,返回其他错误信息(非0值)


2、sqlite3_close

函数的原型:int sqlite3_close(sqlite3 *pDB);

函数的作用:关闭一个打开的数据库

头文件:#include <sqlite3.h>

参数:pDB:数据库的句柄

返回值:执行成功,返回SQLITE_OK(0);

                执行出错,返回其他错误信息(非0值)


3、sqlite3_errmsg

函数的原型:const char * sqlite3_errmsg(sqlite3 *pDB);

函数的作用:获取最近调用的API接口返回的错误说明,并在下次调用任何sqlite API函数时自动清除

头文件:#include <sqlite3.h>

参数:pDB:数据库的句柄

返回值:错误说明的字符串指针


4、sqlite3_exec

函数的原型:int sqlite3_exec(sqlite3 *db,const char * sql,int(*callback)(void *,int,char *,char **),void *para,char **errmsg);

函数的作用:编译或者执行0个或多个sql语句,查询结果返回给回调函数

头文件:#include <sqlite3.h>

参数:

db:数据库的句柄

sql:sql语句

para:用户传入的参数,可以为NULL,该参数指针最终会传入到回调函数callback中,供给用户在回调函数中使用

callback:回调函数

errmsg:返回的错误信息

返回值:执行成功,返回SQLITE_OK(0);

                执行出错,返回错误信息


回调函数:sqlite_callback()

函数的原型:typedef int (*sqlite_callback)(void * para,int columncount,char ** columnvalue,char ** columnname);

函数的作用:由用户处理sqlite3_exec的查询结果

参数:

para:从sqlite3_exec函数传染的参数指针

columncount:查询的记录的字段数(即查询到的记录的列数)

columnvalue:保存查询到的记录的数据,它为一个一维数组,每个元素都为char**型,是一个字段内容(用字符串表示,‘\0’结尾)

columnname:与columnvalue对应,表示这个字段的名称

返回值:执行成功,返回SQLITE_OK;执行错误,返回其他值


5、sqlite3_get_table

函数的原型:int sqlite3_get_table(sqlite3*pDB,const char *sql,char ***pResult,int *rowcount,int * columncount,char **errmsg);

函数的作用:执行sql语句,通过一维数组返回结果,一般该函数用于数据记录查询

头文件:#include <sqlite3.h>

参数:

pDB:数据库的句柄

sql:SQLite3语句

pResult:用于保存查询到的结果

rowcount:结果集的行数

columncount:结果集的列数

errmsg:错误的信息

返回值:执行成功,返回SQLITE_OK;执行出错,返回其他值


相应的函数:sqlite3_free_table(char **result);

函数的作用:释放查询到的结果集占用的内存

参数:result:通过函数sqlite3_get_table()查询到的记录结果


三、SQlite3 C函数使用实例

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



 void create_table(sqlite3 *db) //创建关系
 {
 			char *sql = "create table if not exists mytable (id integer primary key, name text)";
 			char *errmsg;
 			int ret;
 			
 			ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
 			if (ret != SQLITE_OK)
 			{
 					printf("create table error:%s\n", errmsg);
 					exit (-1);	
 			}
 			
 }

void insert_record(sqlite3 *db)//向数据库插入信息
{
			char sql[100];
			char *errmsg;
			int ret;
			int id;
			char name[20];
			
			printf("please input id and name :\n");//输入姓名和id
			scanf("%d %s",&id, name );
			sprintf(sql,"insert into mytable (id, name) values (%d,'%s' );", id, name);
			
			ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
			if(ret != SQLITE_OK)
			{
					printf("insert record error :%s\n", errmsg);
					exit (-1);	
			}
			
	
			
}


int displaycb(void *para, int ncolumn, char **columnvalue, char *columnname[])//回调函数显示方式
{
		int i;
		
		printf("total column is %d\n", ncolumn);
		for(i = 0;i < ncolumn; i++)
		{
				printf("col_name:%s---> col_value:%s\n", columnname[i], columnvalue[i]);	
			
		}
		printf("========================\n");
		
		return 0;
}


void inquire_usecb(sqlite3  *db)
{
    char *sql="select * from mytable";
    char *errmsg;
    int ret;
    
    ret = sqlite3_exec(db, sql, displaycb, NULL, &errmsg); //通过调用回调函数显示数据
    if(ret != SQLITE_OK)
		{
					printf("select error:%s\n", errmsg);
					exit (-1);	
		}	
}


void inquire_nocb(sqlite3 *db) //通过sqlite3_get_table函数显示数据
{
	  int nrow, ncolumn;
	  char **azresult;
	  char *errmsg;
	  int ret;
	  int i;
	  
	  sql = "select * from mytable";
	  ret =  sqlite3_get_table(db,sql, &azresult, &nrow, &ncolumn, &errmsg); 
	  if(ret != SQLITE_OK)
		{
			printf("get table error:%s",errmsg);
			exit(-1);
		}
		
		printf("nrow = %d, column = %d\n", nrow, ncolumn);
		
		for(i = ncolumn; i < (nrow + 1)*ncolumn; i++)
		{
		    printf("%10s",azresult[i] );
		    if((i + 1) % ncolumn == 0)
		    		printf("\n");	
		}
		
		sqlite3_free_table(azresult);
}



int main()
{
		sqlite3 *db;
		int rc;
		rc = sqlite3_open("mydatabase.db", &db);//打开已有数据库
		if(rc != SQLITE_OK)
		{
				pritnf("can not open datatbase!\n");
				exit (-1);
		}		
		else
				pritnf(" open datatbase  sucess!\n");	
		
		create_table(db);
		insert_record(db);
		inquire_nocb(db);
		inquire_usecb(db)
		sqlite3_close(db);
		return 0;
}




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 C 语言操作 SQLite3 数据库时,callback 函数用于处理查询结果集。SQLite3 提供了一个回调函数接口,可以通过该接口来实现自定义的回调函数。 回调函数的原型如下: ```c int callback(void *data, int argc, char **argv, char **azColName); ``` 其中,data 是回调函数中传递的数据指针,argc 是查询结果集中列的数量,argv 是查询结果集中每一行的数据,azColName 是查询结果集中每一列的名称。 下面是一个使用回调函数处理查询结果集的示例代码: ```c #include <stdio.h> #include <sqlite3.h> int callback(void *data, int argc, char **argv, char **azColName) { int i; for (i = 0; i < argc; i++) { printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main() { sqlite3 *db; char *zErrMsg = 0; int rc; char *sql; const char* data = "Callback function called"; rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return(1); } sql = "SELECT * FROM USERS"; rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return 0; } ``` 在上面的示例代码中,我们通过 sqlite3_exec 函数执行了一条查询语句,并使用 callback 函数处理了查询结果集。在 callback 函数中,我们遍历了每一行的数据,并输出了每一列的名称和对应的值。 需要注意的是,除了查询操作之外,其他的数据库操作也可以使用回调函数来处理。例如,我们可以使用回调函数来处理插入、更新、删除等操作的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值