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]! |