sqlite3_exec函数的使用

sqlite3数据库是一个小型的关系型的数据库,以文件的方式存在,打开文件即是打开数据库,它小巧且功能强大,在嵌入式领域内使用很广.现在就介绍一下其中一个重要函数的使用:

int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *,char **errmsg);

功能:执行sql语句

参数:

db:数据库句柄

sql:sql语句

callback:回调函数,每成功执行一次sql语句就执行一次callback函数

void *:给回调函数传的参数

errmsg:错误信息

回调函数的定义:

typedef int(*sqlite3_callback)(void *, int, char **, char **);

很明显这是一个函数指针,具体说明参见程序注释,现在贴出程序,程序注释比较详细,很容易看懂,我就不多说了.程序执行的前提是我在本目录下有一个提前创建好的有两个数据条目的名字叫environment的数据表在数据库文件db.db中

/**************************************************

* 文件名称:main.c

* 文件描述:测试sqlite3的sqlite3_exec函数的回调函数

* 文件作者:by Wang.J,in 2013.11.06

* 文件版本:1.0

* 修改记录:

**************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <sqlite3.h>

#define DB_PATH "./db.db"

/*=======================================

* 函数名称:open_db

* 函数功能:打开数据库文件

* 函数参数:const char *path 数据库文件路径

* 返 回 值:成功 sqlite3*

失败 NULL

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

========================================*/

sqlite3 * open_db(const char *path)

{

sqlite3 *db = NULL;

int ret = 0;

ret = sqlite3_open(DB_PATH, &db);

if (SQLITE_OK != ret) {

printf("%s:数据库打开出错.\n错误原因:%s\n",

__FUNCTION__, sqlite3_errmsg(db));

sqlite3_close(db);

return NULL;

}

printf("%s:数据库打开成功\n", __FUNCTION__);

return db;

}

/*===================================================

* 函数名称:close_db

* 函数功能:关闭数据库文件

* 函数参数:sqlite3 *

* 返 回 值:void

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

====================================================*/

void close_db(sqlite3 *db)

{

if (NULL != db)

sqlite3_close(db);

printf("%s:数据库关闭成功\n", __FUNCTION__);

return;

}

/*======================================================

* 函数名称:callback

* 函数功能:sqlite3_exec的回调函数

* 函数参数:void *param 传递给callback回调函数的参数

对应于sqlite3_exec函数的第四个参数

int f_num 查找到的记录中包含的字段数目

char **f_value 包含查找到每个记录的字段值

char **f_name 包含查找到每个记录的字段名称

* 返 回 值:成功返回0

失败返回-1

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

=======================================================*/

int callback(void *param, int f_num, char **f_value, char **f_name)

{

printf("%s:这是回调函数!\n", __FUNCTION__);

return 0;

}

int main(void)

{

char sql[512];

sqlite3 *db = NULL;

char *err_msg;

int ret = 0;

printf("函数开始\n");

sprintf(sql, "SELECT * FROM environment;");

db = open_db(DB_PATH);

ret = sqlite3_exec(db, sql, callback, NULL, &err_msg);

printf("函数返回值:%d\n", ret);

if (0 != ret) {

//printf("函数执行失败\n");

perror("函数执行失败\n");

return -1;

}

close_db(db);

printf("函数结束\n");

return 0;

}

程序执行结果

结果为预期结果.

现在看看给回调函数传参:

/**************************************************

* 文件名称:main.c

* 文件描述:测试sqlite3的sqlite3_exec函数的回调函数

* 文件作者:by Wang.J,in 2013.11.06

* 文件版本:1.0

* 修改记录:

**************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <sqlite3.h>

#define DB_PATH "./db.db"

/*=======================================

* 函数名称:open_db

* 函数功能:打开数据库文件

* 函数参数:const char *path 数据库文件路径

* 返 回 值:成功 sqlite3*

失败 NULL

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

========================================*/

sqlite3 * open_db(const char *path)

{

sqlite3 *db = NULL;

int ret = 0;

ret = sqlite3_open(DB_PATH, &db);

if (SQLITE_OK != ret) {

printf("%s:数据库打开出错.\n错误原因:%s\n",

__FUNCTION__, sqlite3_errmsg(db));

sqlite3_close(db);

return NULL;

}

printf("%s:数据库打开成功\n", __FUNCTION__);

return db;

}

/*===================================================

* 函数名称:close_db

* 函数功能:关闭数据库文件

* 函数参数:sqlite3 *

* 返 回 值:void

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

====================================================*/

void close_db(sqlite3 *db)

{

if (NULL != db)

sqlite3_close(db);

printf("%s:数据库关闭成功\n", __FUNCTION__);

return;

}

/*======================================================

* 函数名称:callback

* 函数功能:sqlite3_exec的回调函数

* 函数参数:void *param 传递给callback回调函数的参数

对应于sqlite3_exec函数的第四个参数

int f_num 查找到的记录中包含的字段数目

char **f_value 包含查找到每个记录的字段值

char **f_name 包含查找到每个记录的字段名称

* 返 回 值:成功返回0

失败返回-1

* 创 建 人:by Wang.J,in 2013.11.06

* 修改记录:

=======================================================*/

int callback(void *param, int f_num, char **f_value, char **f_name)

{

printf("%s:这是回调函数!\n", __FUNCTION__);

printf("%s:回调函数的参数内容:%s\n\n", __FUNCTION__, (char *)param);

return 0;

}

int main(void)

{

char sql[512];

sqlite3 *db = NULL;

char *err_msg;

int ret = 0;

printf("函数开始\n");

sprintf(sql, "SELECT * FROM environment;");

db = open_db(DB_PATH);

ret = sqlite3_exec(db, sql, callback, "回调函数参数,来自主程序", &err_msg);

printf("函数返回值:%d\n", ret);

if (0 != ret) {

//printf("函数执行失败\n");

perror("函数执行失败\n");

return -1;

}

close_db(db);

printf("函数结束\n");

return 0;

}

执行结果:

依旧没问题.

OK!基本就这些了.

sqlite3_exec函数的使用的更多相关文章

  1. 数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,

    Sqlite3 的确非常好用.小巧.速度快.近期研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 导入SQLLite library并引入头文件. libsqlite3.dyl ...

  2. sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close

    打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sq ...

  3. SQLite3 C/C++ 开发接口简介(API函数)

    from : http://www.sqlite.com.cn/MySqlite/5/251.Html 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的 ...

  4. SQLite3开发接口函数详解

    SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...

  5. 数据库函数:sqlite3_exec() SQL语句

    函数:sqlite3_exec(),称为便捷函数,封装了好多任务. 函数声明: int  sqlite3_exec( sqlite   * , const  char * sql , sqlite_c ...

  6. SQLITE3 使用总结(直接使用C函数)

    转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...

  7. sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close

    sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...

  8. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  9. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

随机推荐

  1. JAVA 想让类无法new,可以使用private将类的构造函数改为私有的,这样new的时候就会报错了

    JAVA 想让类无法new,可以使用private将构造函数改为私有的,这样new的时候就会报错了 主要用于,静态工具类,静态类不需要new,直接使用   类名.静态方法  即可调用 class D{ ...

  2. Yii 框架中带有区间的搜索

  3. code md5

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  4. JS工作积累

    /* * YYYY-MM-DD类型的字符串日期比较 * */ String.prototype.compareAsDate=function(dateStr){//prototype原型方法 var ...

  5. C++学习20 虚基类详解

    多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如非常经典的菱形继承层次.如下图所示: 类A派生出类B和类C,类D继承自类B和类 ...

  6. sql执行返回值存储

    List<Map> list = SqlRunner.queryMapList(sql); if(list != null && !list.isEmpty()){ Has ...

  7. Javascript同源策略对context.getImageData的影响

    在本机测试HTML5 Canvas程序的时候,如果用context.drawImage()后再用context.getImageData()获取图片像素数据的时候会抛出错:SECURITY_ERR: ...

  8. Oracle 10046 event详解-转载

    0046事件概述Oracle的10046事件,可以跟踪应用程序所执行的SQL语句,并且得到其解析次数.执行次数,CPU使用时间等信息.这对我们分析.定位数据库性能问题是非常有用的. 10046 eve ...

  9. 共享一个MVC通过NPOI导出excel的通用方法

    public static System.IO.MemoryStream ExportExcel<T>(string title, List<T> objList, param ...

  10. VirtualBox 使用

    安装: # pacman -S virtualbox 配置: 使用时加载vboxdrv模块:#modprobe vboxdrv (或者设置开机加载:1.建立文件“/etc/modules-load.d ...