Sqlite 与 C/C++
建站提交历史文章,原文写作时间 2023 年 5 月 18 日前后。
Sqlite 与 C/C++
本篇介绍 Windows
Sqlite
与 C/C++
开发的连接方法。
本章节不教 SQL 语法。 如尚未学习 SQL
建议与 SQL
混合食用。
下载
- 前往
Sqlite
官网 SQLite Download Page 下载Source Code
C 语言源代码。 - 解压安装包到工程目录,得到
shell.c
sqlite3.c
sqlite3.h
sqlite3ext.h
,后面主要用到sqlite3.c
和sqlite3.h
。
编译
-
将源文件拷贝到工程目录下的
include/sqlite
目录。 -
主代码导入头文件
#include "sqlite/sqlite3.h"
-
然后使用以下两种方法之一用命令行编译(使用其他编译工具其原理都是基于命令行方式的):
-
直接编译
1
gcc main.c include\sqlite\sqlite3.c -o main.exe -I include # 注意 sqlite3.c 不能使用 g++ 编译
-
动态库编译(PS:静态库也可)
如果使用动态库编译方法, 后面只需要用到 include\sqlite\sqlite3.h 和 libsqlite3.dll,请注意保留这两个文件方便之后使用。1
2
3
4gcc -c -fpic include\sqlite\sqlite3.c -o sqlite3.o
gcc -shared sqlite3.o -o libsqlite3.dll
del sqlite3.o # 删除编译中间件, 保留 libsqlite3.dll 即可
g++ main.cpp -o main.exe -I include -L . -l sqlite3 # 之后编译只要这步即可
-
-
dll
动态库必须位于工程根目录,不得重命名。(因为我不会其他方法)
接口
Frequent Interface
仅介绍常用接口,足以满足基本开发需求,更多内容建议自行查看 sqlite3.h
头文件或搜索其他 blog
。
如果看不懂,别急,后面将提供演示。
-
int sqlite3_open(const char *filename, sqlite3 **ppDb)
1
2
3
4
5
6打开或创建数据库
参数:
filename: 数据库文件名
ppDb: 数据库对象指针 (二级指针)
返回值:
返回 0, 出现异常返回非 0 -
int sqlite3_close(sqlite3 *pDb)
1
2
3
4
5关闭数据库
参数:
pDb: 数据库对象 (一级指针)
返回值:
返回 0, 出现异常返回非 0 -
int sqlite3_errcode(sqlite3 *db)
1
2
3
4
5获取错误码
参数:
db: 数据库对象
返回值:
返回错误码 -
const char *sqlite3_errmsg(sqlite3 *db)
1
2
3
4
5获取错误信息
参数:
db: 数据库对象
返回值:
返回错误信息 (const char *) -
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *, int, char **, char **), void *pArg, char **pErrmsg)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19执行 SQL 语句
参数:
db: 数据库对象
sql: SQL 语句
callback: NULL 或 回调函数, 下面详细介绍
pArg: NULL 或 回调函数的第一项参数
errmsg: NULL 或 传出错误信息 (可用 sqlite3_errmsg 替代, 故无用)
回调函数: int (*callback)(void *pArg, int nCol, char **cols, char **heads)
当 sql 为查询 (SELECT) 语句时调用, 每查询一行信息都会调用一次该函数
参数:
pArg: 任意参数指针, 由函数外部 pArg 指定传入
nCol: 数据列数
cols: 行数据指针
heads: 标题数据指针
返回值:
用户自定义返回值, 正常结束要求返回 0, 如返回非 0, 外部函数将中断并返回错误 4: query aborted
返回值:
返回 0, 出现异常返回非 0
(有点抽象, 建议看 Demo) -
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***pResult, int *pnRow, int *pnColumn, char **pErrmsg)
1
2
3
4
5
6
7
8
9
10
11获取 SQL 查询结果
参数:
db: 数据库对象
sql: SQL 语句
pResult: 结果指针 (三级指针, 顶级用于赋值, 次级用于表示一维列表, 末级表示字符串)
pnRow: 行数指针 (不含标题)
pnCol: 列数指针
pErrmsg: NULL 或 传出错误信息
返回:
返回 0, 出现异常返回非 0
(要求 sql 语句为查询语句, 否则请使用 sqlite3_exec, 我也未尝试会出现什么错误) -
void sqlite3_free(void *p)
1
2
3
4
5释放字符串内存, 如 pErrmsg 属于此类
如果接收了此类内存指针, 一定别忘记释放
回调函数接收的内存 及 库函数产生的内存会自动释放, 如 sqlite3_errmsg
参数:
p: 内存指针 -
void sqlite3_free_table(char **result)
1
2
3
4
5释放数据表内存, 即 sqlite3_get_table 接收到的数据表
如果接受了此类内存指针, 一定别忘记释放
回调函数接收的内存 及 库函数产生的内存会自动释放, 如 sqlite3_exec 的 rollback h
参数:
result: 内存指针
Demo
1 |
|
Output:
1 | Connected successfully! |