数据库sqlite3之 sqlite3_exec()第三个参数回调函数的使用

在写这篇文章之前大家先了解我之前写的关于用c语言操作sqlite3的博客,链接地址如下:
https://blog.csdn.net/makunIT/article/details/105192076
关于sqlite3_exec的回调函数的知识,我也是在做一个项目中学习到的,看了一些博客吧,很多博客,都表达的不是很清楚,所以我想写这篇博客,记录自己的学习过程。大家先了解一下sqlite3_exec()函数吧。

1、sqlite3_exec()

函数原型

#include <sqlite3.h>

int sqlite_exec(sqlite  *db, 
				const char *sql,
 				int (*callback)(void *,int,char **,char **),
				void *,
 				char **errmsg);

函数说明:用来执行sql语句,查询的结果返回给回调函数callback。
参数说明
第一个参数:db是用于保存打开的数据库文件dbname的信息;
第二个参数:sql你要执行命令的语句;
第三个参数:callback,回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL;
第四个参数:void *是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL;
第五个参数:errmsg,返回错误信息,注意是指针的指针。

返回值:执行成功返回SQLITE_OK,否则返回其他值

说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select查询。这可以通过sqlite3_get_table 函数做到。

那么了解了以上sqlite3_exec()函数,那么我下面将讲解一下sqlite_exec()的参数回调函数callback

2、sqlite3_exec()的回调函数callback
在了解callback之前,我们先了解一下什么是回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数;
那么在sqlite3_exec中,我们应该这样理解先执行*sql对应的功能命令,然后将结果传递给回调函数,回调函数根据结果再进一步执行。这代表着,这个 “回调函数”才是最有意义的,我们要讲我们需要的功能,通过回调函数来实现,不管是获取数据库表中有效信息,还是其他动作。

函数原型:

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

函数说明:由用户处理查询的结果;
参数说明
第一个参数:para: 由sqlite3_exec传入的参数指针,或者说是指针参数;
第二个参数:columnCount: 查询到的这一条记录由多少个字段(多少列);
第三个参数:columnValue : 查询出来的数据都保存在这里,它实际上是个1 维数组(不要以为是2 维数组),每一个元素都是一个char * 值,是一个字段内容(用字符串来表示,以‘\0’结尾);
第四个参数:columnName : 该参数是双指针,语columnValue是对应的,表示这个字段的字段名称;
返回值:执行成功返回SQLITE_OK,否则返回其他值

说明回调函数多数时候不是执行1次,而是会循环执行n次,当我们使用select进行sql功能时,往往输出的结果会是 多行,那么 有n行,就会执行n次的 回调函数

下面我将会写两段代码,来实现回调函数,一种是直接用insert直接插入到db表中,一种是用snprintf()函数来实现向表中插入数据的。大家先来看第一种吧

第一种的代码:

/*********************************************************************************
 *      Copyright:  (C) 2020 makun<1394987689@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  sqlite_delete.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2020年03月27日)
 *         Author:  makun <1394987689@qq.com>
 *      ChangeLog:  1, Release initial version on "2020年03月27日 00时47分05秒"
 *                 
 ********************************************************************************/

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

static int callback(void *data, int argc, char **argv, char **azColName);

int main (int argc, char **argv)
{
   
    sqlite3   *db=NULL;
    int       rc ;
    char      *zerrmsg=0;
    char      *sql;
    char      *data= "callback function called";

 //1、创建数据库,如果存在则打开
/***********************************************************************************************************************/
    rc = sqlite3_open("sqlite.db",&db);
    if(rc)
    {
   
        printf("create sqlite failure:%s\n",sqlite3_errmsg(db));
        exit(1);
    }

    printf("create sqlite successfuly\n");

//2、创建数据库表
/*******************************************************************************
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值