嵌入式数据库SQLite3相关操作---操作接口篇
时间:2011-04-11 来源:☆&寒 烟☆
在上节中,我们介绍了有关SQLite3移植到开发板的过程,这节就大家总结了一下SQLite3提供的C语言编程接口,以供大家编程时使用方便。
首先要说明的是。sqlite3本身是提供了一些命令来操作数据库的。为了与SQL语句相区别,他们都是以小数点.开头。可以用
.help 获取相关命令
一,打开和关闭数据库
使用SQLite3接口操作数据库时都要先打开数据库,有点多余啊,哪个数据库不是呢?嘿嘿
int sqlite3_open(const char *filename, sqlite3 **ppDb); |
参数即返回值意义如下:
filename:要打开的数据库的文件名
ppDb:用户返回数据库句柄
返回值:SQLITE_OK代表成功,否则为错误码
其实返回的错误码可以在SQLite3源码的sqlite3.h头文件找到,这里就不说了。需要说明的是这些错误是SQLite3编程接口共同使用的。而不是sqlite3_open函数私有。
用完了,当然要关闭:
int sqlite3_close(sqlite3 *ppDb); |
二,执行SQL语句
SQLite3提供了一个一般化的编程接口,可以对以打开的数据库执行任何SQL语句。这个函数的原型如下:
int sqlite3_exec(sqlite3 *pDb, const char *sql, int (*callback)(void* context, int nArg, char** azArg, char** azCol), void *context, char **errmsg); |
参数即返回值意义如下:
pDb:已打开的数据库的句柄
sql:字符串,内容是一条或多条sql语句
callback:回调函数
context:传递给回调函数的第一个参数,可称上下文参数
errmsg:指向一个字符串,其内容是对操作中发生的错误的文字描述
返回值:SQLITE_OK代表成功,否则为错误码
回调函数的作用是:当进行查询操作时,每查询到一条记录都会调用一次回调函数,这条记录的内容通过回调函数的参数传入。回调函数的参数既返回值的含义解释如下:
context:调用sqlite3_exec时传入的context指针。
nArg:数据的个数
azArg:字符串数组,有nArg个元素,表示每个字段的值
azCol:字符串数组,有nArg个元素,表示每个字段的名称
返回值:0表示要继续查询否则查询操作结束,对sqllite3_exe函数的调用将返回错误码SQLITE_ABORT.
即使记录中某个字段的类型为整数,它的值也是由C语言的字符串来代表中。
还有就是errmsg参数是一个字符指针变量的地址,通过它将得到一个字符串的首地址。显然,这个字符串的存储空间是在sqlite3_exec函数内动态分配得到的,因此用过后必须释放以免造成内存泄漏。鉴于外界并不知道sqlite3_exe函数内部是如何进行内存分配的。SQLite3平台专门提供了一个函数用于释放这块内存,其原型如下:
void sqlite3_free(void *p); |
其中参数P指向要释放的内存。
三.查询数据库
其实呢,使用上面的sqlite3_exec函数就可以对数据库进行查询操作,但它使用回调函数作为返回结果的手段,有时不是很方便,因此SQLite3也提供了一个专门的接口进行查询操作,其函数原型如下:
sqlite3_get_table(sqlite3 *pDb, const char *sql, char ***pResult, int *nrow, int *ncolumn, char **errmsg); |
其中各个参数的含义解释如下:
pDb:已打开的数据库的实例
sql:字符串,内容是一条或多条SQL语句。
pResult:一个(char **)型变量的地址,用于返回查询结果,查询结果由字符串数组代表。
nrow:结果表的行数。
ncolumn:结果的列数
errmsg:指向一个字符串,其内容是对操作中发生的错误的文字描述
这里的参数都好理解,不好理解的是pResult是查询的结果,它是一个字符串数组,因此它的首地址是(char **)地址。虽然它是一个一维的字符串数组,但要以二维的方式去理解,其中前ncolumn个字符串表示结果表的字段名,随后的ncolumn个字符串则是第一条记录的各个字段的值,依次类推。
内外一个需要说明的问题就是空间的问题,显然pResult所指向的字符串数组及各个字符串所占的空间都是在sqlite3_get_table函数内部动态分配得到的。因此需要使用后进行释放。由于它又不是一块平坦的内存,故也不能用sqlite3_free函数来释放,而必须用下面这个专用的函数:
void sqlite3_free_table(char **result); |