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文件存储, ...
随机推荐
- centos下安装MySQL5.7
1.查找mysqlwhereis mysql 2.删除mysqlyum remove mysql mysql-server mysql-libs mysql-server;rm –rf /usr/li ...
- 使用gson-1.6.jar解析json
package com.example.mars_2900_json01; import java.io.StringReader; import java.lang.reflect.Type; im ...
- spring配置定时器的时间设置
时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 *为任意 ?为无限制. 具体如下: "0/10 * * * * ?" 每10秒触发 "0 0 12 ...
- JMeter非GUI方式运行时动态设置线程组及传参
http://blog.csdn.net/selingchen/article/details/48106517 在使用JMeter进行性能测试自动化时,可能会有如下需求: 1.指定运行多少线程,指定 ...
- C开源hash项目uthash
uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找.插入.删除等.该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用多 ...
- java获取本机IP地址和MAC地址的方法
// 获取ip地址 public static String getIpAddress() { try { Enumeration<NetworkInterface> allNetInte ...
- SQLSERVER:计算数据库中各个表的数据量和每行记录所占用空间
转:http://www.cnblogs.com/lyhabc/p/3828496.html CREATE TABLE #tablespaceinfo ( nameinfo ) , rowsinfo ...
- Servlet(Response,Request)
1.response控制码表的3种方法:输出1; 2,文件下载 3.控制浏览器定时刷新网页(REFRESH) 4.控制浏览器缓存当前文档内容 5. 通过response实现请求重定向. 6.setHe ...
- MS文件与路径的一些方法记录
一,路径相关 String path1 = System.IO.Directory.GetCurrentDirectory(); MessageBox.Show("获取应用程序的当前工作目录 ...
- 如何下载spring-framework
http://jingyan.baidu.com/album/a65957f49670ac24e67f9b85.html?picindex=1