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,否则返回其他值


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

  1. #include <stdio.h>  
  2. #include <sqlite3.h>  
  3. #include <stdlib.h>  
  4.   
  5. void create_table(sqlite3 *db)  
  6. {  
  7.     char *sql;  
  8.     char *errmsg;  
  9.     int ret;  
  10.   
  11.     sql = "create table if not exists mytable (id integer primary key,name text);";  
  12.   
  13.     ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);  
  14.   
  15.     if(ret != SQLITE_OK)  
  16.     {  
  17.         printf("create table error : %s\n",errmsg);  
  18.         exit(-1);  
  19.     }  
  20. }  
  21.   
  22. void insert_record(sqlite3 *db)  
  23. {  
  24.     char sql[100];  
  25.     char *errmsg;  
  26.     int ret;  
  27.     int id;  
  28.     char name[20];  
  29.   
  30.     printf("please input id and name:\n");  
  31.   
  32.     scanf("%d%s",&id,name);  
  33.   
  34.     sprintf(sql,"insert into mytable (id,name)values(%d,'%s');",id,name);  
  35.   
  36.     ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);  
  37.   
  38.     if(ret != SQLITE_OK)  
  39.     {  
  40.         printf("insert record  error : %s\n",errmsg);  
  41.         exit(-1);  
  42.     }  
  43. #if 0     
  44.     sql = "insert into mytable (id,name)values(NULL,'zhang');";  
  45.   
  46.     ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);  
  47.   
  48.     if(ret != SQLITE_OK)  
  49.     {  
  50.         printf("insert record  error : %s\n",errmsg);  
  51.         exit(-1);  
  52.     }  
  53.       
  54.     sql = "insert into mytable (id,name)values(NULL,'lin');";  
  55.   
  56.     ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);  
  57.   
  58.     if(ret != SQLITE_OK)  
  59.     {  
  60.         printf("insert record  error : %s\n",errmsg);  
  61.         exit(-1);  
  62.     }  
  63. #endif  
  64. }  
  65.   
  66. int displaycb(void *para,int ncolumn,char ** columnvalue,char *columnname[])  
  67. {  
  68.     int i;nam  
  69.     printf("total column is %d\n",ncolumn);  
  70.   
  71.     for(i = 0;i < ncolumn; i++)  
  72.     {  
  73.         printf("col_name:%s----> clo_value:%s\n",columnname[i],columnvalue[i]);  
  74.     }  
  75.     printf("===========================\n");  
  76.   
  77.     return 0;  
  78. }  
  79.   
  80. void inquire_usecb(sqlite3 * db)  
  81. {  
  82.     char *sql;  
  83.     char *errmsg;  
  84.     int ret;  
  85.   
  86.     sql = "select * from mytable;";  
  87.   
  88.     ret = sqlite3_exec(db,sql,displaycb,NULL,&errmsg);  
  89.   
  90.     if(ret != SQLITE_OK)  
  91.     {  
  92.         printf("select error : %s\n",errmsg);  
  93.         exit(-1);  
  94.     }  
  95.   
  96. }  
  97.   
  98. void inquire_nocb(sqlite3 *db)  
  99. {  
  100.     int nrow,ncolumn;  
  101.     char **azresult;  
  102.     char *sql;  
  103.     char *errmsg;  
  104.     int ret;  
  105.     int i;  
  106.   
  107.     sql = "select * from mytable;";  
  108.   
  109.     ret = sqlite3_get_table(db,sql,&azresult,&nrow,&ncolumn,&errmsg);  
  110.   
  111.     if(ret != SQLITE_OK)  
  112.     {  
  113.         printf("get table error:%s",errmsg);  
  114.         exit(-1);  
  115.     }  
  116.   
  117.     printf("nrow = %d,column = %d\n",nrow,ncolumn);  
  118. ;  
  119.   
  120.     sqlite3_free_table(azresult);  
  121. }  
  122.   
  123. int main()  
  124. {  
  125.     sqlite3 *db;  
  126.     int ret;  
  127.   
  128.     ret = sqlite3_open("mydatabase.db",&db);  
  129.   
  130.     if(ret != SQLITE_OK)  
  131.     {  
  132.         printf("open database error : %s\n",sqlite3_errmsg(db));  
  133.         exit(-1);  
  134.     }  
  135.   else  
  136.     {  
  137.         printf("you have opened a database succefully!\n");  
  138.     }  
  139.   
  140.     create_table(db);  
  141.     insert_record(db);  
  142.     inquire_usecb(db);  
  143.      // inquire_nocb(db);  
  144.   
  145.     sqlite3_close(db);  
  146.     return 0;  
  147. }  

发现结果如图:



按照

  1. int displaycb(void *para,int ncolumn,char ** columnvalue,char *columnname[])  
  2. {  
  3.     int i;nam  
  4.     printf("total column is %d\n",ncolumn);  
  5.   
  6.     for(i = 0;i < ncolumn; i++)  
  7.     {  
  8.         printf("col_name:%s----> clo_value:%s\n",columnname[i],columnvalue[i]);  
  9.     }  
  10.     printf("===========================\n");  
  11.   
  12.     return 0;  
  13. }  
这部分程序所说:for循环调用了两次,分别打印出了id列和name列,怎么就一下子全部把数据打印出来了呢


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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值