SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前这篇文章,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高效的调用方式。
1.1 普通方式
之前的文章介绍过sqlite3的C语言API函数基础操作,通过sqlite3_exec函数即可执行sql语句函数,该函数指定一个 sql语句字符串和对应的回调函数。
当执行sqlite3_exec时,其内部的执行可分为3步:
解析sql语句字符串
编译sql语句
执行sql语句
可以看到,sqlite3_exec一个函数就实现了这么多功能,这是它的优点——使用方便,但同时也是它的缺点——效率低,因为解析和编译都是比较耗时的。
关于sqlite3_exec的使用示例可参考之前的文章:玩转SQLite6:使用C语言来读写数据库
1.2 高效方式
为此解决sqlite3_exec函数执行效率低的问题,就出现了其它更加高效的解决方式:将sqlite3_exec的功能进行分解,由多个函数共同完成。这就是本篇要介绍的:
sqlite3_prepare_v2()函数:实现对sql语句(模板)的解析和编译,生成了可以被执行的 sql语句实例
sqlite3_stmt()数据结构:可以理解为一种“准备语句对象”,它可以结合变量使用,进而实现相同操作的循环
sqlite3_bind_*()函数:用于绑定赋值变量
sqlite3_step()函数:用于执行sql语句
相比较使用sqlite3_exec函数,现在这种方式,sql语句的解析和编译只执行了一次,而sqlite3_step执行多次,整体的效率势必大大提升。
2 函数介绍
2.1 sqlite3错误码
在介绍各个函数之前,先来看一个这些函的错误码有哪些
2.2 sqlite3_prepare_v2
该函数实现对sql语句(模板)的解析和编译,生成了可以被执行的sql语句实例
参数:
db:sqlite数据库
zSql:要执行的sql语句(可以包含未赋值的变量)
nByte:sql语句的(字符串的)长度
ppStmt:解析编译出的sql语句实例
pzTail:
返回值:见前面的sqlite3错误码
2.3 sqlite3_bind
该函数组用于绑定变量值到prepare语句中,也就是给 sqlite3_stmt变量赋值。前面的文章讲过,我们一定是先通过sqlite3_prepare_v2函数创建并初始化一个 sqlite3_stmt 变量语句,然后使用sqlite3_bind_xxx函数对 这个 sql语句变量进行绑定参数。
参数:
形参1:sqlite3_stmt: prepare语句编译出的sql语句实例
形参2:sqlite3_stmt变量参数的序号索引值,规定最左侧的SQL参数的索引值为 1,也就是说参数索引值从1开始。
形参3:是要绑定给第2个形参指向的 变量参数的 实际值。第2个形参可以指向不同的索引值。
形参4:对于有4个形参的函数,第4个形参一般是第3个形参的长度。
形参5:是用于BLOB和字符串绑定后的 析构函数,用于在sqlite处理完blob或字符串之后处理它,一般可以设置为NULL。
返回值:见前面的sqlite3错误码
代码示例:假设表的字段结构为:person(name,age,sex),数据库指针为 pdb。
2.4 sqlite3_step
参数:
pStmt:prepare语句编译出的sql语句实例
返回值:
这里再对几个常见的返回值进一步说明:
SQLITE_DONE:意味着sql语句执行完成且成功。一旦执行成功后,sqlite3_step()就不应该被再次调用执行,除非我们使用sqlite3_reset()重置 sqlite3_stmt 数据。
SQLITE_ROW:这个比较常用,当我们的sql语句是 读命令,比如"SELECT* FROM...",返回的数据一般很多,并且数据是按行返回的,且每次只返回一行,其返回值为 SQLITE_ROW,所以需要重复调用sqlite3_step函数,直到sqlite3_step返回 SQLITE_DONE.
SQLITE_MISUSE:表示该函数实例被滥用,不合适,比如sqlite_stmt结构已经被销毁了。
2.5 sqlite3_reset
用于重置一个准备语句对象到它的初始状态,然后准备被重新执行。所有sql语句变量使用sqlite3_bind*绑定值,使用sqlite3_clear_bindings重设这些绑定。Sqlite3_reset接口重置准备语句到它代码开始的时候。sqlite3_reset并不改变在准备语句上的任何绑定值,那么这里猜测,可能是语句在被执行的过程中发生了其他的改变,然后这个语句将它重置到绑定值的时候的那个状态。
2.6 sqlite3_column
该函数实例用于 查询(query)结果的筛选,返回当前结果的某1列。
参数:
sqlite3_stmt*:prepare语句编译出的sql语句实例
iCol: 要查询的"列"索引值。sqlite3规定最左侧的“列”索引值是 0,也就是“列”索引号从 0 开始。
根据函数类型,返回相应的数据,比如int型,double型(浮点数也是),text(字符串型)等。
3 总结
本篇主要介绍了sqlite的C语言操作的高效API函数,用于取代功能强大但效率较低的sqlite3_exec函数。本篇介绍到的几个API函数总结如下:
sqlite3_prepare_v2()创建sqlite3_stmt对象
sqlite3_bind_*()绑定参数值到sqlite3_stmt
sqlite3_step()运行sql语句,可以是一次,也可以是循环执行
sqlite3_reset()重置sqlite3_stmt对象
sqlite3_finalize()销毁sqlite3_stmt对象
下篇,将通过一个实际的例子,来体会这些函数的具体使用效果。
领取专属 10元无门槛券
私享最新 技术干货