sqlite_exec回调函数的使用

    在学习sqlite3小型数据库的时候,发现了sqlite3_exec的函数,可以调用回调函数

具体的原型如下:

原型:int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);
功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
输入参数:
pDB,数据库句柄
sql,待执行的SQL 语句字符串,以’\0’结尾
callback,回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL

输出参数:errMsg,返回错误信息,注意是指针的指针。
返回值:执行成功返回SQLITE_OK,否则返回其他值


回调函数的原型如下:

回调函数:
原型:typedef int (*sqlite_callback)(void* para,int columnCount,char** columnValue,char** columnName);
功能:由用户处理查询的结果
参数:
para,从sqlite3_exec()传入的参数指针;
columnCount, 查询到的这一条记录有多少个字段(即这条记录有多少列);
columnValue,查询出来的数据都保存在这里,它实际上是个1 维数组(不要以为是2 维数组),每一个元素都是一个char * 值,是一个字段内容(用字符串来表示,以‘\0’结尾);
columnName,与columnValue 是对应的,表示这个字段的字段名称。
返回值:执行成功返回SQLITE_OK,否则返回其他值


然后编写了一段测试程序来测试回调函数:

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

void create_table(sqlite3 *db)
{
    char *sql;
    char *errmsg;
    int ret;

	sql = "create table if not exists mytable (id integer primary key,name text);";

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

	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);
	}
#if 0	
	sql = "insert into mytable (id,name)values(NULL,'zhang');";

	ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);

	if(ret != SQLITE_OK)
	{
		printf("insert record  error : %s\n",errmsg);
		exit(-1);
	}
	
	sql = "insert into mytable (id,name)values(NULL,'lin');";

	ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);

	if(ret != SQLITE_OK)
	{
		printf("insert record  error : %s\n",errmsg);
		exit(-1);
	}
#endif
}

int displaycb(void *para,int ncolumn,char ** columnvalue,char *columnname[])
{
	int i;nam
	printf("total column is %d\n",ncolumn);

	for(i = 0;i < ncolumn; i++)
	{
		printf("col_name:%s----> clo_value:%s\n",columnname[i],columnvalue[i]);
	}
	printf("===========================\n");

	return 0;
}

void inquire_usecb(sqlite3 * db)
{
    char *sql;
    char *errmsg;
    int ret;

	sql = "select * from mytable;";

	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)
{
    int nrow,ncolumn;
	char **azresult;
	char *sql;
	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);
;

	sqlite3_free_table(azresult);
}

int main()
{
	sqlite3 *db;
	int ret;

	ret = sqlite3_open("mydatabase.db",&db);

	if(ret != SQLITE_OK)
	{
		printf("open database error : %s\n",sqlite3_errmsg(db));
		exit(-1);
	}
  else
	{
		printf("you have opened a database succefully!\n");
	}

	create_table(db);
	insert_record(db);
	inquire_usecb(db);
     // inquire_nocb(db);

	sqlite3_close(db);
    return 0;
}

发现结果如图:



按照

int displaycb(void *para,int ncolumn,char ** columnvalue,char *columnname[])
{
	int i;nam
	printf("total column is %d\n",ncolumn);

	for(i = 0;i < ncolumn; i++)
	{
		printf("col_name:%s----> clo_value:%s\n",columnname[i],columnvalue[i]);
	}
	printf("===========================\n");

	return 0;
}
这部分程序所说:for循环调用了两次,分别打印出了id列和name列,怎么就一下子全部把数据打印出来了呢


经过讨论和查阅资料发现,其实是sqlite3_exec在查询表的时候,每查到一条记录,就会调用一次回调函数,所以才是会显示出所有数据





  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
sqlite3_exec()函数SQLite库中最常用的函数之一,它用于执行SQL语句并调用回调函数处理结果。下面是sqlite3_exec()函数的详细解释: 1. 头文件和函数原型 ```c #include "sqlite3.h" int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*para,int argc,char**argv,char**argv_name), void *para,char **errmsg) ``` 2. 参数说明 - sqlite3*:SQLite数据库连接对象。 - sql:要执行的SQL语句。 - callback:回调函数,用于处理SQL语句执行结果。 - para:传递给回调函数的参数。 - errmsg:如果执行SQL语句出错,将错误信息存储在此处。 3. 回调函数 回调函数sqlite3_exec()函数的一个重要参数,用于处理SQL语句执行结果。回调函数的原型如下: ```c int callback(void *para, int argc, char **argv, char **argv_name); ``` - para:sqlite3_exec()函数中传递给回调函数的参数。 - argc:结果集中的列数。 - argv:结果集中的一行数据。 - argv_name:结果集中每一列的列名。 回调函数返回一个整数值,用于告诉sqlite3_exec()函数是否继续执行SQL语句。如果回调函数返回0,则继续执行SQL语句;如果返回非0值,则停止执行SQL语句。 4. 示例 下面是一个使用sqlite3_exec()函数执行SQL语句的示例: ```c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> int callback(void *para, int argc, char **argv, char **argv_name) { int i; for (i = 0; i < argc; i++) { printf("%s = %s\n", argv_name[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char **argv) { sqlite3 *db; char *errmsg = 0; int ret; ret = sqlite3_open("test.db", &db); if (ret != SQLITE_OK) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } ret = sqlite3_exec(db, "SELECT * FROM test", callback, 0, &errmsg); if (ret != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", errmsg); sqlite3_free(errmsg); } sqlite3_close(db); return 0; } ``` 以上代码打开了一个名为test.db的SQLite数据库,并执行了一条SELECT语句,将结果集传递给回调函数callback()处理。在回调函数中,我们遍历了结果集中的每一行数据,并输出了每一列的列名和值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值