SQLite3学习笔记5:INSERT(写)+ SELECT(读)数据(C API)

核心知识点

  1. INSERT 实现 :依然用sqlite3_exec,只需把 SQL 语句换成 INSERT 即可,和命令行语法完全一致;
  2. SELECT 实现sqlite3_execcallback参数是核心 ------SELECT 返回的每一行数据都会触发一次回调函数,通过回调函数处理查询结果(如存储到结构体 / 数组);
  3. 回调函数规则
    • 返回值:0表示继续处理下一行,非 0 表示终止查询;
    • 参数 1(void* data):用户自定义数据(sqlite3_exec的第 4 个参数);
    • 参数 2(int argc):结果集的列数(比如 device_params 有 4 列,argc=4);
    • 参数 3(char** argv):每列的数值(字符串形式,需手动转换类型,如 REAL 转 float);
    • 参数 4(char** azColName):每列的列名(调试 / 日志用)。

完整 C 代码示例

创建文件sqlite3_c_demo2.c

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// 回调函数:处理SELECT查询结果(可改为存储到全局数组/结构体)
// 每查询到一行数据,该函数就会被调用一次
static int select_callback(void *data, int argc, char **argv, char **azColName)
{
    // data:用户传入的自定义提示信息(sqlite3_exec的第4个参数)
    printf("[%s]\n", (char *)data);

    // 遍历每一列,打印列名+值(可解析为对应类型,如param_value转float)
    for (int i = 0; i < argc; i++)
    {
        // argv[i]可能为NULL(字段为空),需做判空处理
        printf("  %s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");

    return 0; // 返回0:继续处理下一行;返回非0:终止查询
}

int main(int argc, char *argv[])
{
    sqlite3 *db   = NULL;
    char *err_msg = NULL;
    int ret       = SQLITE_OK;

    // 1. 打开数据库
    ret = sqlite3_open("embedded_db.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 打开数据库失败: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 数据库打开成功\n");

    // 2. 插入数据(模拟传感器采集的温度/湿度数据)
    const char *insert_sql = "INSERT INTO device_params (param_name, param_value, update_ts) VALUES "
                             "('temp', 26.5, datetime(CURRENT_TIMESTAMP, '+8 hours')), "
                             "('humidity', 61.0, datetime(CURRENT_TIMESTAMP, '+8 hours'));";
    ret                    = sqlite3_exec(db, insert_sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 插入数据失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 数据插入成功\n");

    // 3. 查询所有数据(调用回调函数处理结果)
    const char *select_all_sql = "SELECT * FROM device_params;";
    ret                        = sqlite3_exec(db, select_all_sql, select_callback, (void *)"查询所有设备参数", &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 查询所有数据失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }

    // 4. 条件查询
    const char *select_temp_sql = "SELECT param_name, param_value FROM device_params WHERE param_name = 'temp';";
    ret                         = sqlite3_exec(db, select_temp_sql, select_callback, (void *)"查询温度参数", &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 查询温度失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }

    // 5. 关闭数据库
    ret = sqlite3_close(db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 关闭数据库失败: %s\n", sqlite3_errmsg(db));
        return -1;
    }
    printf("[INFO] 数据库关闭成功\n");

    return 0;
}

操作步骤

  1. 编译代码(必须链接 sqlite3 库):
bash 复制代码
gcc sqlite3_c_demo2.c -o sqlite3_c_demo2 -lsqlite3
  1. 运行程序:
bash 复制代码
./sqlite3_c_demo2

输出如下:

bash 复制代码
[INFO] 数据库打开成功
[INFO] 数据插入成功
[查询所有设备参数]
  id = 1
  param_name = temp
  param_value = 26.5
  update_ts = 2026-01-27 13:35:06
   
[查询所有设备参数]
  id = 2
  param_name = humidity
  param_value = 61.0
  update_ts = 2026-01-27 13:35:06
   
[查询温度参数]
  param_name = temp
  param_value = 26.5
   
[INFO] 数据库关闭成功
  1. 验证插入结果:
bash 复制代码
sqlite3 embedded_db.db "SELECT * FROM device_params;"

输出如下:

bash 复制代码
1|temp|26.5|2026-01-27 13:35:06
2|humidity|61.0|2026-01-27 13:35:06
相关推荐
学计算机的计算基14 分钟前
二叉树算法下篇:递归核心技巧与高频面试题详解
java·笔记·算法
WZF-Sang15 分钟前
TCP和UDP协议
linux·服务器·网络·c++·学习·tcp/ip·udp
my_power52016 分钟前
大模型概述学习笔记
笔记·学习
心中有国也有家18 分钟前
Flutter 鸿蒙编译与构建流程深度解析
学习·flutter·华为·harmonyos
敲不会代码也学不会英语23 分钟前
【AI学习之旅02】AI全景图:一张图看懂AI生态——机器学习/深度学习/大模型关系与术语扫盲
人工智能·学习·机器学习
LiaoWL1231 小时前
【SpringCloud合集-02】Spring Cloud LoadBalancer 负载均衡器学习笔记
学习·spring cloud·负载均衡
YUS云生1 小时前
Python学习笔记·第28天:Git入门——版本控制与基础操作
笔记·python·学习
Yang_jie_031 小时前
笔记:数据结构(链表)
数据结构·笔记·链表
xiaoyuchidayuma1 小时前
【# 电压极限圆、电流极限圆、MTPA曲线、最大功率曲线的关系】
笔记·学习
五哈俱乐部1 小时前
TCHouse-C分布式表创建指南
笔记