SQLite学习笔记(7)
首先要注意句柄关联。其次,开始看关于查询参数化的内容。 查询参数化: 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_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() 等。 获取错误的函数信息函数: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,/*应用程序数据*/ ); 注意自动回滚无法触发回调函数。 更新钩子: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 *,/*数据库名称*/ const char *,/*触发器或者视图名称*/ ) 授权函数的返回值:SQLITE_OK、SQLITE_DENY(终止整个sql语句)、SQLITE_IGNORE。注意交互式程序的帮助。page209。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |