sqlite3_exec函数的使用
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函数的使用的更多相关文章
- 数据库(SQLITE3函数总结): sqlite3_open, sqlite3_exec, slite3_close,sqlite3_prepare_v2,sqlite3_column_text,
Sqlite3 的确非常好用.小巧.速度快.近期研究它,有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 导入SQLLite library并引入头文件. libsqlite3.dyl ...
- sqlite入门基础(一):sqlite3_open,sqlite3_exec,slite3_close
打开数据库链接sqlite3_open用法 原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sq ...
- SQLite3 C/C++ 开发接口简介(API函数)
from : http://www.sqlite.com.cn/MySqlite/5/251.Html 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的 ...
- SQLite3开发接口函数详解
SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: ...
- 数据库函数:sqlite3_exec() SQL语句
函数:sqlite3_exec(),称为便捷函数,封装了好多任务. 函数声明: int sqlite3_exec( sqlite * , const char * sql , sqlite_c ...
- SQLITE3 使用总结(直接使用C函数)
转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...
- sqlite3入门之sqlite3_open,sqlite3_exec,slite3_close
sqlite3_open sqlite3_open函数原型: int sqlite3_open( const char *filename, /* Database filename (UTF-8) ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
随机推荐
- Coding 初级教程(二)——上传已有项目
Coding 初级教程(二)——上传已有项目 [摘要:方针读者 :已具有 Coding.net 的账号. 本文首要先容若何把项目上传到 Coding.net 上. 分两种环境,一种是项目已归入到 gi ...
- SIT和UAT的区别
SIT和UAT有什么区别?谢谢! 系统内部集成测试(System Integration Testing) SIT 用户验收测试(User Acceptance Testing) UAT ...
- Android牟利之道(一)--界面嵌入有米广告
经过了一番折腾,忙忙碌碌了一下午,终于搞明白了Android软件界面嵌入广告的方法,以下我以嵌入有米广告为例小结一下: 我的新浪微博(wind瑞):http://weibo.com/tianrui19 ...
- DEDE织梦,文章页里的幻灯调用,能调用全部栏目的吗
arclist 是必须要有 typeid 设置的,如果你没设置,默认是取的当前栏目的 typeid,而首页取到的是 top,所以你强制指定typeid=top就可以了.---------------- ...
- C++学习7 构造函数
当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等.为了解决这个问题,C++提供了构造函数. 构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需 ...
- [Flex] ButtonBar系列——如何给ButtonBar添加一个ViewStack
<?xml version="1.0" encoding="utf-8"?> <!--如何给ButtonBar添加一个ViewStack--& ...
- linux 多网卡 跃点数
centos6.4 配置两块网卡,eth0设置静态IP,8网段,eth1无线配置dhcp,都是开机启动. 但是eth1无线网卡一旦连接至开放网络(需要web登陆),就替换了之前eth0配置的默认网关, ...
- 解决oracle11g安装导致数据库无法自动搜集统计信息-转
近期发现个别11G数据库无法自动收集统计信息,部分视图查询结果如下: SQL> select client_name,status from dba_autotask_client where ...
- 移植ok6410
tftp u-boot.bin http://blog.csdn.net/link_hui/article/details/5593518 LED driver http://blog.csdn.ne ...
- c/c++笔记
string 若要根据字典序比较string类型的大小,只需要用><=就可以啦 例如: string s1="abcz"; string s2="abcd&q ...