LV07-06-SQLite-C语言API
本文主要是SQLite数据库的C语言接口相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
| Windows | windows11 |
| Ubuntu | Ubuntu16.04的64位版本 |
| VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
| SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
| 开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
| uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
| linux内核 | linux-4.15(NXP官方提供) |
| STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
| 参考方向 | 参考原文 |
| SQLite官网 | SQLite Home Page |
| SQLite中文网 | SQLite 中文网 |
| SQLite 基础教程 | SQLite参考手册 - 在线原生手册 |
| 菜鸟教程 | SQLite 教程 |
| 易百教程 | SQLite 教程 |
这一部分就主要是C语言的API函数介绍了,这些函数在SQLite官网首页上都有:List Of SQLite Functions (或者功能列表:_SQlite中文网 ),需要注意的是,一定要提前装好sqlite3和相关库,这样编译链接程序的时候才不会报错。
1 | sudo apt install sqlite3 # 安装sqlite3 |
编译链接程序的时候要记得加上-lsqlite3
一、sqlite3_open()函数
1. 函数说明
我们可以在这里看到函数原型:Opening A New Database Connection (sqlite.org) (或者打开一个新的数据库连接_SQlite中文网 )。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于打开一个 SQLite 数据库文件。
【函数参数】
filename:char类型指针变量,指向要打开的数据库文件。ppDb:sqlite3类型二级指针变量,表示数据库句柄,一般我们会定义一个一级指针变量sqlite3 *db,所以这里在进行传参的时候要传入一个地址,所以就需要传入&db。
【返回值】int类型,如果成功打开(或创建)数据库,则返回SQLITE_OK,失败返回出错码。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】
(1)如果 filename参数是 NULL 或 :memory:,那么 sqlite3_open() 将会在 RAM中创建一个内存数据库,这只会在会话session 的有效时间内持续。
(2)如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
2. 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open [user.db] success! |
二、sqlite3_close()函数
1. 函数说明
我们可以在这里看到函数原型:Closing A Database Connection (sqlite.org) (或者关闭数据库连接_SQlite中文网 )。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于关闭一个打开的 SQLite 数据库文件。
【函数参数】
arg1:sqlite3类型指针变量,指向要关闭的数据库文件,函数声明只需要数据类型即可,所以这里没有写形参名,注意这里是一个一级指针。
【返回值】int类型,如果成功关闭数据库,则返回SQLITE_OK,如果还有操作没有完成,将返回 SQLITE_BUSY 禁止关闭的错误消息。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】none
2. 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open [user.db] success! |
三、sqlite3_errmsg()函数
1. 函数说明
我们可以在这里看到函数原型:Error Codes And Messages (sqlite.org) (或者错误代码和消息_SQlite中文网 )。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于得到错误信息的描述。
【函数参数】
arg1:sqlite3类型指针变量,指向要获取错误信息的数据库句柄,函数声明只需要数据类型即可,所以这里没有写形参名,注意这里是一个一级指针。
【返回值】char类型指针变量,返回一个指向描述错误信息的字符串的指针变量。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】none
2. 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open success:[not an error]! |
四、sqlite3_exec()函数
1. 函数说明
我们可以在这里看到函数原型:One-Step Query Execution Interface (sqlite.org) (或者一站式查询执行界面_SQlite中文网 )。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于执行一条执SQLite语句。
【函数参数】
arg1:sqlite3类型指针变量,指向一个已经打开的数据库,其实就是要操作数据库的句柄,函数声明只需要数据类型即可,所以这里没有写形参名,注意这里是一个一级指针。sql:char类型指针变量,要执行的SQLite语句(是一个指向SQLite语句字符串首地址的指针变量)。callback:int (*)(void*,int,char**,char**)类型的一个函数指针,指向一个回调函数,一般只有在查询时(也就是执行SELECT语句)才用得上,若设置为NULL,则不会调用任何回调函数,并且将忽略结果行。
点击查看数据类型分析
(1)callback前边有一个*并且由()括起来,说明这首先是一个指针变量;
(2)后边的()表示这个指针变量指向一个函数,这个函数带有四个形参;
(3)前边的int表示函数返回值为int类型。
总的来说,指针变量callback可以指向一个带有void*,int,char**,char**等四个类型形参且返回值为int类型的函数。
arg4:void类型指针变量,一般要进行强制类型转换,用于为回调函数传递参数;errmsg:char类型的二级指针变量,指向错误消息。
【返回值】int类型,如果成功执行语句,则返回SQLITE_OK,失败返回出错码。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】none
2. 回调函数
这里再来详细说明一下回调函数,前边我们学习函数指针的时候有说过,通过typedef定义一个函数指针的类型的话,可以简化书写方式,于是这个函数就可以写成这个样子:
1 | typedef int(*sqlite3_callback)(void *, int, char **, char **); |
但是这个函数是存在于库中的,我们是无法修改的,所以我们其实不用管这个,需要使用到回调函数的时候,直接传入一个函数名就可以了,回调函数可以定义成下边的形式:
1 | int callBack(void *arg, int f_num, char ** f_value, char ** f_name) |
【参数说明】
para:sqlite3_exec传递给回调函数的参数,传入的其实是sqlite3_exec函数的第四个void *的那个参数。f_num:记录中包含的字段数目。f_value:包含每个字段值的指针数组。f_name:包含每个字段名称的指针数组。
【返回值】int类型,成功返回0(这个其实可以自己定义,一般这个返回值我们并不进行判断)。
【注意事项】
(1)只有在查询语句中,回调函数才会被调用。
(2)有多少条符合条件的查询记录,就会调用多少次回调函数。
3. 使用实例
3.1 不使用回调函数
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open success:[not an error]! |
这说明所有语句都正常执行了,接下来我们打开SQLite来看一下里边的数据:
- 打开数据库
1 | sqlite3 user.db |
- 设置输出格式
1 | sqlite> .head on |
- 查询数据
1 | sqlite> select * from fruit; |
可以看到数据都已经写入到数据库中了。
3.2 使用回调函数
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open success:[not an error]! |
这说明所有语句都正常执行了,接下来我们打开SQLite来看一下里边的数据:
- 打开数据库
1 | sqlite3 user.db |
- 设置输出格式
1 | sqlite> .head on |
- 查询数据
1 | sqlite> select * from fruit; |
可以看到数据都已经写入到数据库中了。
五、sqlite3_get_table()函数
1. 函数说明
我们可以在这里看到函数原型:Convenience Routines For Running Queries (sqlite.org) (或者方便的运行查询例程_SQlite中文网 )。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于可以不使用回调函数就执行SQLite语句,一般用于执行SELECT查询语句。这是一个旧接口,保留该接口是为了向后兼容,不建议使用此接口。
【函数参数】
db:sqlite3类型指针变量,指向已打开的数据库句柄。zSql:char类型指针变量,指向要执行的SQLite语句首地址。pazResult:char类型三级指针变量,用来指向sql语句执行结果的指针。pnRow:int类型指针变量,表示满足条件的记录的数目。pnColumn:int类型指针变量,每条记录包含的字段数目。pzErrmsg:char类型二级指针变量,指向错误信息指针的地址。
【返回值】int类型,成功返回SQLITE_OK,失败返回错误码。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】none
2. 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall -lsqlite3 # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | Open success:[not an error]! |