SQLite 本身就是用 ISO C 编写的,因此在 C/C++ 中使用 SQLite 是最直接的方式。这种方式提供了最完整、最灵活的控制能力,适合高性能系统和对细节要求极高的场景。
📚 目录
- 准备工作:包含头文件与链接库
- 打开与关闭数据库
- 执行 SQL:三种方式对比
- 查询结果处理
- 参数绑定机制
- 错误处理与调试技巧
- 多线程与并发控制
- 出站链接与推荐阅读
- 参考资料
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. 查询结果处理
查询过程分为:
sqlite3_prepare_v2()
:编译 SQLsqlite3_step()
:逐行读取sqlite3_column_*(stmt, col)
:获取列值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_null | NULL |
6. 错误处理与调试技巧
- 所有 SQLite API 函数返回错误码(如
SQLITE_OK
、SQLITE_BUSY
、SQLITE_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. 📚 参考资料
- SQLite C 接口权威手册:https://www.sqlite.org/c3ref/intro.html
- SQLite 源码解析系列(GitHub/博客园)
- Stack Overflow 高赞问题:SQLite C 使用问题合集
- 《SQLite 权威指南》第 6 章 C API
- 《The Definitive Guide to SQLite》
✅ 下一篇将深入 Java 开发环境,介绍如何通过 JDBC 使用 SQLite。如果准备好了,请回复 “继续”。
发表回复