首先要注意句柄关联。其次,开始看关于查询参数化的内容。
查询参数化:
API支持在SQL语句中绑定参数,允许在后面为参数提供值,绑定的参数与sqlite3_prepare( ) 一起使用。如果没有绑定参数,那么sqlite3_step()默认使用null作为该参数的值。
准备语句过后,将使用sqlite3_bind_xxx( ) 函数绑定参数值。
函数的声明:sqlite3_bind_xxx(
sqlite3_stmt * , /*语句句柄*/
int i, /*参数个数*/
xxx value, /*绑定的值*/
) ;
不同类型参数的绑定声明:
int sqlite3_bind_xxx(sqlite3_stmt * , int , xxx) ,其中xxx代表int 、double、int64、null、zeroblob 、blob、text、text16,其中前四个用于标量值,后三个用于数组。sqlite3_mprintf()函数自动转移引号字符的功能在sqlite3_bind_text() 体现出。使用blob变种类型:
int sqlite3_bind_bolb(
sqlite3_stmt * ; /* 语句句柄 */
int , /*次序*/
const void * , /*指向blob数据*/
int n , /**数据的字节长度/
void (*(void * ) ) , /*清除字节程序*/
) ;
API为清理句柄提供的两个特殊含义的预定义值:
#define SQLITE_STATIC ( (void (*)(void *))0 ) 指示帮顶函数数组内存驻留在非托管空间,SQLite不会试图清理该空间
#define SQLITE_TRANSIENT ( (void (*)(void *))-1) 指示数组内存经常变化,SQLite需要自己的数据副本,副本在语句结束是自动清除
清除函数:void cleanup_fn( void *) .如果提供了自动清理函数,在语句结束时会自动调用。
参数绑定完成,sqlite3_step()接受参数帮顶值,替换sql文本,执行语句。
四种参数绑定办法的不同:就是参数的表示方式(位置参数,显式定义函数编号,字母数字化的数字名称)、参数分配编号的方式。
参数编号:允许为参数指定编号,不使用内部给定的序列。参数编号的语法是问号后紧跟一个数字。
比如:insert into table_name values(?num,?num,?num……);其中num的值在1——999之间而且是越小越好,当num一样,可以节省时间。
参数命名:在指定参数编号的地方给参数绑定一个名称。给参数编号的方法就是前缀为一个问号,表示命名的参数是在前面加上一个冒号(:)或者加上@符号。
比如:insert into table_name values(:value, : value , @value);sqlite3_prepare()为命名的参数自动分配编号,虽然编号未知,但是可以使用函数sqlite3_bind_parameter_index( )获得编号。
TCL参数:使用$符号。
错误与异常:
错误处理:
API可能返回错误的整数结果代码。比如:sqlite3_open_v2() 、sqlite3_prepare()sqlite3_exec()、sqlite3_bind_xxx()、sqlite3_close() 、sqlite3_create_collation()、sqlite3_collation_needed()、sqlite3_create_function()、sqlite3_finalize()、sqlite3_sqlite3_get_table()、sqlite3_reset() 、sqlite3_step() 等。
获取错误的函数信息函数:sqlite3_errmsg().
声明:const char * sqlite3_errmsg(sqlite3 *) ; 语句句柄是唯一参数,返回该链接上API调用产生的最近的错误,无错误才返回“not an error”.
SQLite 结果代码:《SQLite权威指南》page195.
繁忙情况处理:sqlite3_busy_handler() , sqlite3_busy_timeout( ).注意应急计划的启动,设置合理的超时时间。
模式改变处理:从锁定的角度来看,模式改变的时间在sqlite3_prepare()调用和sqlite3_step()调用之间。应对的方法就是处理改变重新开始。导致SQLITE_SCHEMA存在的原因:分离数据库、修改或者安装用户自定义的函数或者聚合、修改或者安装用户自定义的排序规则、修改或者安装授权函数、清理数据库空间等。这种错误情况与VDBE有关。
追踪SQL:使用函数sqlite3_trace( ) .
函数声明:void *sqlite3_trace(sqlite* , void(*xTrace)(void * , const char *) , void * );和窃听器的功能类似。
操作控制:
基本都是监视数据库的连接和事务的函数。
提交钩子:sqlite3_commit_hook()监视连接上的事务提交事件。
声明: void * sqlite_commit_hook(
sqlite * cnx , /*数据库句柄*/
int (*xCallback )(void * data) , /*回调函数*/
void *data , /*应用程序数据*/
);
回滚钩子:sqlite3_rollback_hook()监视连接上的事务提交事件。
声明: void * sqlite_rollback_hook(
sqlite * cnx , /*数据库句柄*/
int (*xCallback )(void * data) , /*回调函数*/
void *data , /*应用程序数据*/
);
注意自动回滚无法触发回调函数。
更新钩子:sqlite3_update_hook()监视连接上的事务提交事件。
声明: void * sqlite_update_hook(
sqlite * cnx , /*数据库句柄*/
int (*xCallback )(void * data) , /*回调函数*/
void *data , /*应用程序数据*/
);
此时,回调函数的行式:void callback( void * data, /*更新钩子的第三个参数*/
int operation_code, /*与sqlite_update、sqlite_insert、sqlite_delete操作对应*/
char const *db_name,
char const *table_name,
sqlite_int64 rowid,
);
授权函数:
事件过滤器:sqlite3_set_authorizer()
声明: int sqlite3_set_authorizer(
sqlite3 * ,
int (*xAuth)(void *,int ,
const char * , const char * ,
const char * , const char * ,
) ,
void *pUserData;
);
注意:授权函数是存在回调函数的:
int auth(
void *, /*用户数据*/
int, /*事件代码*/
const char *, /*事件具体相关的参数*/
const char *, /*事件具体相关的参数*/
const char *, /*数据库名称*/
const char *, /*触发器或者视图名称*/
)
授权函数的返回值:SQLITE_OK、SQLITE_DENY(终止整个sql语句)、SQLITE_IGNORE。注意交互式程序的帮助。page209。