最简单的程序使用三个函数(sqlite3_open(), sqlite3_exec(), 和 sqlite3_close().)就可以完成。要是想更好地控制数据库引擎的执行,可以使用sqlite的核心API:
在使用这几个接口前,需要了解两个对象
* 数据库连接对象 sqlite3 : sqlite3是一个结构体,用于保存打开的数据库连接
* 预处理过的SQL语句对象 sqlite3_stmt: sqlite3_stmt 用于保存处理过的SQL语句
1.数据库的打开和关闭:
- int sqlite3_open(const char*, sqlite3**);
- int sqlite3_close(sqlite3*);
sqlite3_open()的第一个参数为数据库文件名,第二个参数的类型sqlite3为一个结构体,它用于保存建立的数据库连接。当执行成功时,这两个均返回SQLITE_OK, 失败则返回错误代码,可调用sqlite3_errmsg()或者sqlite3_errmsg16()给出错误描述。
UTF-16版本的函数为
- int sqlite3_open16(const char*, sqlite3**);
-
int sqlite3_close16(sqlite3*);
UTF-8编码的另一个数据库打开函数为
- int sqlite3_open_v2(
-
const char *filename,
-
sqlite3 **ppDb,
-
int flags,
-
const char *zVfs
-
);
第三个参数可以采用提供的几个选项进行 位或运算,控制数据库的读写权限以及互斥访问。
2预编译SQL语句:
- int sqlite3_prepare(
-
sqlite3 *db,
-
const char *zSql,
-
int nByte,
-
sqlite3_stmt **ppStmt,
-
const char **pzTail
-
);
-
int sqlite3_prepare_v2(
-
sqlite3 *db,
-
const char *zSql,
-
int nByte,
-
sqlite3_stmt **ppStmt,
-
const char **pzTail
-
);
此函数需要一个数据库连接的指针,将给定的SQL文本转换为预声明语句对象并返回一个指向它的指针,这个函数并不执行SQL语句。建议使用v2版本。这两个函数的UTF-16版本的参数与此相同,但传入的SQL语句采用UTF-16编码。SQL语句中可以带有“?”,它代表不确定的值,当需要对这些“?”赋值时,可以使用sqlite3_bind_*()函数族:
- int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
-
int sqlite3_bind_double(sqlite3_stmt*, int, double);
-
int sqlite3_bind_int(sqlite3_stmt*, int, int);
-
int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
-
int sqlite3_bind_null(sqlite3_stmt*, int);
-
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
-
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
-
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
-
int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
以sqlite3_bind_text()为例,它用于给处理过的SQL语句中的“?”绑定字符串值,第二个参数用于指定要绑定的“?”的序号(每条SQL语句中可以包含多个“?”,序号从1开始),第三个参数为要绑定到“?”上的字符串,第四个参数为字符串长度,第五个参数为一个函数指针,sqlite3执行完后回调此函数,通常用于释放字符串占用的内存,有两个常数可以传递给它,SQLITE_STATIC 表示字符串为常量,而SQLITE_TRANSIENT会使得sqlite3_bind_text()对字符串做一份拷贝。
3.执行SQL语句
- int sqlite3_step(sqlite3_stmt*);
这一例程的功能是执行sqlite3_prepare()例程处理过的SQL语句,当返回的结果的第一行可以被获取时,这一例程将会返回,若要获得下一行的结果,可再此调用这一例程,若执行的是无返回结果的SQL语句(例如INSERT),该例程将在一此调用中完成并返回。 当SQL语句执行成功时,此例程将返回SQLITE_DONE,当SQL语句执行成功且SQL返回一个单行结果集,此例程返回SQLITE_ROW,否则将返回错误代码,比如,如果不能打开数据库文件则会返回SQLITE_BUSY。
当返回值为SQLITE_ROW时,如需要对返回结果进行处理时,可以使用sqlite3_column_*()函数族:
- const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
-
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
-
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
-
double sqlite3_column_double(sqlite3_stmt*, int iCol);
-
int sqlite3_column_int(sqlite3_stmt*, int iCol);
-
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
-
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
-
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
-
int sqlite3_column_type(sqlite3_stmt*, int iCol);
-
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
其中参数 iCol为列的序号,从0开始。
4.销毁预编译的SQL语句
- int sqlite3_finalize(sqlite3_stmt *pStmt);
sqlite3_finalize 和sqlite3_prepare 是相对的,当使用sqlite3_prepare 编译的SQL在使用完后,应该使用sqlite3_finalize 语句来释放掉它。
如果要多次使用处理过的SQL语句,且要更换里面绑定的参数,可以使用
- int sqlite3_reset(sqlite3_stmt *pStmt);
来清除处理过的SQL语句里面绑定的所有参数,然后调用sqlite3_bind_*()函数族重新绑定参数即可。
阅读(3826) | 评论(0) | 转发(0) |