SQLite 本身就是用 ISO C 编写的,因此在 C/C++ 中使用 SQLite 是最直接的方式。这种方式提供了最完整、最灵活的控制能力,适合高性能系统和对细节要求极高的场景。


📚 目录

  1. 准备工作:包含头文件与链接库
  2. 打开与关闭数据库
  3. 执行 SQL:三种方式对比
  4. 查询结果处理
  5. 参数绑定机制
  6. 错误处理与调试技巧
  7. 多线程与并发控制
  8. 出站链接与推荐阅读
  9. 参考资料

1. 准备工作:包含头文件与链接库

所需文件:

  • sqlite3.h
  • sqlite3.c
  • 编译为静态库(.a)或动态库(.so / .dll

示例编译命令:

gcc main.c sqlite3.c -o app -lpthread -ldl

如使用预编译库:

gcc main.c -lsqlite3


2. 打开与关闭数据库

sqlite3 *db;
int rc = sqlite3_open("example.db", &db);
if(rc) {
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    return 1;
}
sqlite3_close(db);

  • sqlite3_open_v2() 可指定只读、创建、共享缓存等选项
  • 返回值 rc == SQLITE_OK 表示成功

3. 执行 SQL:三种方式对比

(1)直接执行 SQL(不带结果)

char *errMsg = 0;
rc = sqlite3_exec(db, "CREATE TABLE test(id INTEGER);", 0, 0, &errMsg);
if (rc != SQLITE_OK) {
    fprintf(stderr, "SQL error: %s\n", errMsg);
    sqlite3_free(errMsg);
}

(2)准备语句 + 执行

sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "INSERT INTO test VALUES (1);", -1, &stmt, NULL);
sqlite3_step(stmt);   // 执行
sqlite3_finalize(stmt);

(3)回调函数执行查询(适用于简单 SELECT)

int callback(void *data, int argc, char **argv, char **azColName) {
    for(int i=0; i<argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i]);
    }
    return 0;
}

sqlite3_exec(db, "SELECT * FROM test;", callback, 0, &errMsg);


4. 查询结果处理

查询过程分为:

  1. sqlite3_prepare_v2():编译 SQL
  2. sqlite3_step():逐行读取
  3. sqlite3_column_*(stmt, col):获取列值
  4. sqlite3_finalize():释放资源
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT id FROM test;", -1, &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW) {
    int id = sqlite3_column_int(stmt, 0);
    printf("id = %d\n", id);
}
sqlite3_finalize(stmt);


5. 参数绑定机制

使用 ?:name 作为占位符,通过 sqlite3_bind_*() 绑定值:

sqlite3_prepare_v2(db, "INSERT INTO test(id) VALUES (?);", -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, 42);
sqlite3_step(stmt);
sqlite3_finalize(stmt);

绑定函数数据类型
sqlite3_bind_int整数
sqlite3_bind_text字符串
sqlite3_bind_double浮点
sqlite3_bind_nullNULL

6. 错误处理与调试技巧

  • 所有 SQLite API 函数返回错误码(如 SQLITE_OKSQLITE_BUSYSQLITE_ERROR
  • sqlite3_errmsg(db) 提供更详细的错误信息
  • 可使用 sqlite3_trace() 注册 SQL 跟踪器
  • 开启编译参数 -DSQLITE_DEBUG 可增加调试信息

7. 多线程与并发控制

SQLite 可配置为:

  • single-thread:单线程安全
  • multi-thread:同线程安全,跨线程需加锁
  • serialized(默认):全线程安全

可通过以下方法确认配置:

printf("Threadsafe: %d\n", sqlite3_threadsafe());

推荐设置:

sqlite3_config(SQLITE_CONFIG_SERIALIZED); // 在程序启动前

为提高写并发,推荐使用 WAL 模式:

sqlite3_exec(db, "PRAGMA journal_mode=WAL;", 0, 0, 0);


8. 🔗 出站链接与推荐阅读

外部资源:

推荐文章(站内):


9. 📚 参考资料

  1. SQLite C 接口权威手册:https://www.sqlite.org/c3ref/intro.html
  2. SQLite 源码解析系列(GitHub/博客园)
  3. Stack Overflow 高赞问题:SQLite C 使用问题合集
  4. 《SQLite 权威指南》第 6 章 C API
  5. 《The Definitive Guide to SQLite》

✅ 下一篇将深入 Java 开发环境,介绍如何通过 JDBC 使用 SQLite。如果准备好了,请回复 “继续”