查询参数化:
API支持在sql语句中绑定参数,允许在后面为参数提供值,绑定的参数与sqlite3_prepare( ) 一起使用。如果没有绑定参数,那么sqlite3_step()默认使用null作为该参数的值。
准备语句过后,将使用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_namevalues(?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() 等。
声明: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有关。
函数声明:void *sqlite3_trace(sqlite*,void(*xTrace)(void *,const char *),void * );和窃听器的功能类似。
操作控制:
提交钩子:sqlite3_commit_hook()监视连接上的事务提交事件。
声明: void * sqlite_commit_hook(
int (*xCallback )(void * data),/*回调函数*/
void *data,/*应用程序数据*/
);
回滚钩子:sqlite3_rollback_hook()监视连接上的事务提交事件。
声明: void * sqlite_rollback_hook(
sqlite * cnx,/*应用程序数据*/
);
更新钩子:sqlite3_update_hook()监视连接上的事务提交事件。
声明: void * sqlite_update_hook(
sqlite * cnx,/*应用程序数据*/
);
此时,回调函数的行式: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 *,
const char *,const char *,
const char *,
),
void *pUserData;
);
int auth(
void *,/*用户数据*/
int,/*事件代码*/
const char *,/*事件具体相关的参数*/
const char *,/*触发器或者视图名称*/
)
授权函数的返回值:sqlITE_OK、sqlITE_DENY(终止整个sql语句)、sqlITE_IGNORE。注意交互式程序的帮助。page209。
原文链接:https://www.f2er.com/sqlite/201761.html