sqlite_exec回调函数的使用
来源:互联网 发布:主提女装淘宝店有吗 编辑:程序博客网 时间:2024/06/14 04:25
在学习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 0sql = "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;namprintf("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;namprintf("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在查询表的时候,每查到一条记录,就会调用一次回调函数,所以才是会显示出所有数据
- sqlite_exec回调函数的使用
- 关于sqlite_exec回调函数中参数传递的问题
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 回调函数的使用
- 使用回调函数
- 回调函数使用
- 轻松使用自己的回调函数
- 轻松使用自己的回调函数
- linux grep命令
- 怎么用数学绘图软件制作正方体展开动画?
- [HDU](2544)最短路 ---单源最短路径(图)
- 漫谈程序员系列:怎么告别“混日子”
- 对反向传播算法的理解
- sqlite_exec回调函数的使用
- 一 ServletContext 和 spring ClassPathXmlApplicationContext
- Python for...else
- 最长不下降子序列
- Qt之QWidget/QDialog/QMainWindow
- 概念 Qt
- 工具类—Java下载远程文件到本地
- LeetCode-110-Balanced Binary Tree(平衡二叉树)
- CBC模式的DES加密算法(加密字符串、加密文件)