• 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中

    clip_image002

    /**************************************************
    
    * 文件名称: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:数据库打开出错.
    错误原因:%s
    ",
    
    __FUNCTION__, sqlite3_errmsg(db));
    
    sqlite3_close(db);
    
    return NULL;
    
    }
    
    printf("%s:数据库打开成功
    ", __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:数据库关闭成功
    ", __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:这是回调函数!
    ", __FUNCTION__);
    
    return 0;
    
    }
    
    int main(void)
    
    {
    
    char sql[512];
    
    sqlite3 *db = NULL;
    
    char *err_msg;
    
    int ret = 0;
    
    printf("函数开始
    ");
    
    sprintf(sql, "SELECT * FROM environment;");
    
    db = open_db(DB_PATH);
    
    ret = sqlite3_exec(db, sql, callback, NULL, &err_msg);
    
    printf("函数返回值:%d
    ", ret);
    
    if (0 != ret) {
    
    //printf("函数执行失败
    ");
    
    perror("函数执行失败
    ");
    
    return -1;
    
    }
    
    close_db(db);
    
    printf("函数结束
    ");
    
    return 0;
    
    }

    程序执行结果

    clip_image004

    结果为预期结果.

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

    /**************************************************
    
    * 文件名称: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:数据库打开出错.
    错误原因:%s
    ",
    
    __FUNCTION__, sqlite3_errmsg(db));
    
    sqlite3_close(db);
    
    return NULL;
    
    }
    
    printf("%s:数据库打开成功
    ", __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:数据库关闭成功
    ", __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:这是回调函数!
    ", __FUNCTION__);
    
    printf("%s:回调函数的参数内容:%s
    
    ", __FUNCTION__, (char *)param);
    
    return 0;
    
    }
    
    int main(void)
    
    {
    
    char sql[512];
    
    sqlite3 *db = NULL;
    
    char *err_msg;
    
    int ret = 0;
    
    printf("函数开始
    ");
    
    sprintf(sql, "SELECT * FROM environment;");
    
    db = open_db(DB_PATH);
    
    ret = sqlite3_exec(db, sql, callback, "回调函数参数,来自主程序", &err_msg);
    
    printf("函数返回值:%d
    ", ret);
    
    if (0 != ret) {
    
    //printf("函数执行失败
    ");
    
    perror("函数执行失败
    ");
    
    return -1;
    
    }
    
    close_db(db);
    
    printf("函数结束
    ");
    
    return 0;
    
    }

    执行结果:

    clip_image006

    依旧没问题.

    OK!基本就这些了.

  • 相关阅读:
    Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效
    Django测试开发-19-auth模块之session,cookie
    Django测试开发-19-引入xadmin
    Django测试开发-17-报错:No module named 'django.contrib.staticfiles.templatetags'
    Django测试开发-16-ImportError: cannot import name 'six' from 'django.utils'
    Django测试开发-15-django.utils.encoding未发现 python_2_unicode_compatible包
    Django测试开发-14-数据库表设计:多对多,一对一,一对多
    Django测试开发-13-优化表单提交(GET、POST、登录、注册)
    Django测试开发-12-优化admin (2020-03-13 18:57)
    Django测试开发-11-返回json数据
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3411266.html
Copyright © 2020-2023  润新知