sqlite回调函数的解释与使用

2023-05-16

>在sqlite3的api函数中有一个sqlite3_exec,用来执行sql语句:

函数原型:
int sqlite3_exec
(
sqlite3* ppDb, /* An open database */
const char sql, / SQL to be evaluated */
int (callback)(void,int,char**,char**), /* Callback function */
void , / 1st argument to callback */
char *errmsg / Error msg written here */
);
第1个参数不再说了,是sqlite3_open函数得到的指针。
第2个参数constchar*sql是一条sql 语句,以\0结尾。
第3个参数sqlite3_callback 是回调,sqlite3每查询到一条结果,都会去调用你提供的这个函数。
第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第5个参数char** errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec 之后,执行失败时可以查阅这个指针。
回调函数的格式:

int sqlite_callback(
void* pvoid, /* 由 sqlite3_exec() 的第四个参数传递而来 */
int argc, /* 表的列数 */
char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
char** col /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
);
在所有的回掉函数中,都要加上return 0;否则失去其回调函数的意义。

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

int create_table(sqlite3 *db)
{
    char *errmsg = NULL;
    char *sql;

    sql = "create table if not exists mytable(id integer primary key,name txt);";

    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("operater failed1 : %s \n",errmsg);
        exit(0);
    }
}

int insert_record(sqlite3 *db)
{
    char *errmsg;
    char sql[100];
    char name[10];
    int id;
    int n;
    int i;
    printf("enter the number \n");
    scanf("%d",&n);
    for(i = 0; i < n;i++)
    {
    printf("enter the id you want to insert :\n");
    scanf("%d",&id);
    printf("enter the name you want to insert :\n");
    scanf("%s",name);

    sprintf(sql,"insert into mytable(id,name) values(%d,'%s');",id,name);
    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("operater failed2 : %s \n",errmsg);
        exit(0);
    }
    }

/*  sql = "insert into mytable(id,name) values(NULL,'xie');";
    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("operater failed3 : %s \n",errmsg);
        exit(0);
    }

    sql = "insert into mytable(id,name) values(NULL,'zhen');";
    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("operater failed4 : %s \n",errmsg);
        exit(0);
    }*/
}

int displaycb(void *para,int n_column,char **column_value,char **column_name)
{
    int i;
    printf("total column is %d \n",n_column);
    for(i = 0;i < n_column;i++)
    {
//      printf("\t\t %s \t\t %s \n",column_name[i],column_value[i]);
            printf("column_name : %s ----> column_value : %s \n",column_name[i],column_value[i]);
    }
    return 0;
}

int inquire_usecb(sqlite3 *db)
{
    char *errmsg;
    char *sql;

    sql = "select * from mytable;";

    if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("operater failed5 : %s \n",errmsg);
        exit(0);
    }
}
int delete_record(sqlite3 *db)
{
    char *errmsg;
    char sql[100];
    int id;

    printf("enter the id you want to delete\n");
    scanf("%d",&id);

    sprintf(sql,"delete from mytable where id = %d",id);

    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("operater failed6 :%s \n",errmsg);
        exit(0);
    }
}

int inquire_nocb(sqlite3 *db)
{
    int nrow,ncolumn;
    char **azresult;
    char *sql;
    char *errmsg;
    int i;
    sql = "select * from mytable;";
    if(SQLITE_OK != sqlite3_get_table(db,sql,&azresult,&nrow,&ncolumn,&errmsg))
    {
        printf("operater failed : %s\n",errmsg);
        exit(0);
    }
    printf("row :%d        column :%d\n",nrow,ncolumn);
    printf("the result of querying : \n");
    for(i = 0;i < (nrow + 1) * ncolumn;i++)
    {
        printf("%10s",azresult[i]);
        if((i + 1) % ncolumn == 0)
        {
            printf("\n");
        }
    }
    sqlite3_free_table(azresult);
}
int main()
{
    sqlite3 *db = NULL;
    int ret;

    ret = sqlite3_open("mydatabase.db",&db);

    if(ret != SQLITE_OK)
    {
        perror("open error!\n");
        exit(0);
    }
    else
    {
        printf("you have opened a qulite3 database successfully !\n");
    }

    create_table(db);
    insert_record(db);
    inquire_usecb(db);
    delete_record(db); 
    inquire_nocb(db);
    sqlite3_close(db);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlite回调函数的解释与使用 的相关文章

随机推荐

  • 标注工具labelme的使用

    在做目标检测任务时 xff0c 少不了对图像进行标注 xff0c 标注工具有好几种 xff0c labelme是其中比较好用的一种 labelme可对图像进行标注 xff0c 包括多边形 矩形 线 点和图像级标注 它是用Python编写的
  • Linux小技巧之终端terminal全选

    当打开一个终端 xff0c 经过若干指令后 xff0c 终端上输出的内容较多 xff0c 直接框选这些内容进行选择比较费事 有没有全选的功能呢 xff1f 答案是有的 xff01 方法1 xff1a 终端菜单栏全选 当窗口比较小时 xff0
  • 如何使用set::key_comp 和 set::value_comp 标准模板库 (STL) 函数

    下面的代码示例演示如何使用 Visual C 43 43 set key comp 和 set value comp 的 STL 功能 所需要的头文件 xff1a lt set gt 原型 template lt class K class
  • Linux小技巧之终端快捷键大全

    在前面一篇博客中记录了终端全选的技巧 下面记录一下关于终端使用的其它一些小技巧 F1查看帮助F11全屏Shift 43 Ctrl 43 T 打开一个新的终端Shift 43 Ctrl 43 N新建一个窗口打开终端Shift 43 Ctrl
  • ROS问题:Yolo v4移植到ROS后检测结果/darknet_ros/detection_image在rviz中显示乱码

    在前面一篇博客 xff08 Yolo v4移植ROS xff09 中介绍了将Yolo v4移植到ROS中 由于Yolo v4的源码在Yolo v3源码的基础上有改动 xff0c 移植成功后会出现一个小bug xff0c 如下图所示 xff1
  • 吉洪诺夫正则化(Tikhonov regularization )

    最近看了看吉洪诺夫正则化方法 xff0c 对其基本内容作了一个简单的了解 现在总结如下 1 正则化 定义 xff1a 正则化 regularization xff0c 是指在线性代数理论中 xff0c 不适定问题通常是由一组线性代数方程定义
  • C++中getline()、gets()等函数的用法

    在学习C 43 43 的过程中 xff0c 经常会遇到输入输出的问题 xff0c 以下总结一下下面几个函数的用法 xff1a 1 cin 2 cin get 3 cin getline 4 getline 5 gets 1 cin gt g
  • C++字母大小写转换方法

    字母大小写这个问题相对比较简单 xff0c 总结了一些常用的大小写转换的方法 xff0c 欢迎指正补充 xff01 思路1 xff1a 根据字母的ASCII表进行转换 xff1a 由表格可以看出 xff0c 对应大小写字母之间相差32 xf
  • C++ 标准输出控制小数点后位数的方法

    在C 43 43 中 xff0c 要实现这个功能 xff0c 就要用到std命名空间中常用于流的控制符 xff0c 这里通常要用到setprecision 函数 xff0c 可以通过这个函数控制小数点后面位数 还要注意的是 xff0c 使用
  • C++中string::npos的一些用法总结

    一 关于npos的定义 在MSDN中有如下说明 xff1a basic string npos static const size type npos 61 1 定义 The constant is the largest represen
  • CMake:通过target_link_libraries链接第三方库

    sdbusplus 通过new method call同步调用service的method 风静如云的博客 CSDN博客 例子中需要在编译时链接 lsdbusplus lsystemd 这两个第三方库 那么通过cmake怎么指定呢 其实很简
  • 在ubuntu终端打开谷歌浏览器的命令

    安装好谷歌浏览器后 xff0c 用以下命令在终端打开谷歌浏览器 adb shell am start n com android chrome com google android apps chrome Main 之后便出现如下内容 xf
  • PELCO_D通信协议

    1 球机通信接口 xff08 EIA RS 485 xff09 数据传输方式 xff1a 异步半双工串行通讯 通信波特率 xff1a 9600Bps 数据格式 xff1a Start Bit xff1a 1 Bit xff1b Data B
  • C buffer

    这学期在Dartmouth上ENGS20 Introduction to Scientific Computing xff0c 好多东西不记下来就会忘 xff0c 所以开一个笔记 在C语言中 xff0c 输入和输出都是有buffer的 xf
  • 寄存器值的操作方法

    通过这段时间的工作和学习 xff0c 我感觉在嵌入式硬件编程中 xff0c 大多数情况下都是对相应硬件的功能寄存器进行设置和操作 一 寄存器的设置和操作特性 1 xff0c 一个寄存器的每个位有其不同的意义 xff0c 进行不同的设置会使硬
  • UART串口通信(回环测试)

    一 UART串口通信简介 UART xff08 Universal Asynchronous Receiver Transmitter xff09 是采用异步串行通信方式的通用异步收发传输器 xff0c 在发送数据时将并行数据转换为串行数据
  • extern "C"的作用

    extern 34 C 34 的作用 一 前些天 编程序是用到了很久以前写的C程序 想把里面的函数利用起来 连接发现出现了找不到具体函数的错误 以下是假设旧的C程序库 C的头文件 c h ifndef C H define C H exte
  • 输入分钟数,按小时和分钟输出

    copyright C 2014 2015 Lighting Studio Co Ltd File name xff1a Author xff1a Jerey Jobs Version 0 1 Date Description xff1a
  • 输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果

    程序要求 xff1a 输入一个32位的整数a 使用按位异或 运算 生成一个新的32位整数b 使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果 copyright C 2014 2015 Lighting Studio C
  • sqlite回调函数的解释与使用

    gt 在sqlite3的api函数中有一个sqlite3 exec xff0c 用来执行sql语句 xff1a 函数原型 xff1a int sqlite3 exec sqlite3 ppDb An open database const