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. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  2. 【转】group by多个字段理解

    来源:http://uule.iteye.com/blog/1569262 首先group by 的简单说明: group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使 ...

  3. 阻止Application_End事件的解决方案

    在做项目时,遇到同步ERP数据的问题,客户要求是:程序中,设置一个开始时间,再设置一个时间间隔,让程序每隔一段时间导出销售记录,这个开始时间和时间间隔可以手动修改设定.     这问题纠缠了我好几天, ...

  4. [SQL]合并字符串

    --带符号合并行列转换 --有表t,其数据如下: /* a b 1 1 1 2 1 3 2 1 2 2 3 1 --如何转换成如下结果: a b 1 1,2,3 2 1,2 3 1 */ drop t ...

  5. C Primer Plus(第五版)11

    第 11 章 字符串和字符串函数 在本章中你将学习下列内容: · 函数: gets(), puts(), strcat(), strncat(), strcmp(), strncmp(), strcp ...

  6. CodeForces 617C【序枚举】

    题意: 有两个点喷水,有很多个点有花,给出坐标. 求使得每个花都可以被喷到,两个喷水的半径的平方的和最小是多少. 思路: 枚举其中一个喷水的最大半径. 坑: 这题我贪心的思路有很大问题.一开始也是想这 ...

  7. Sqlserver中存储过程,触发器,自定义函数

    Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...

  8. nyoj 95 众数问题

    点击打开链接 众数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多 ...

  9. C++容器类概述

    原文转自:http://blog.csdn.net/wangxiaolong_china/article/details/8362540 什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器 ...

  10. Webservice测试从头来

    一.写WebService 建立java project 建立数据类包 com.parameters.zz 新建Person类 package com.parameters.zz; public cl ...