SQLite学习笔记(7)

前端之家收集整理的这篇文章主要介绍了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。

原文链接:https://www.f2er.com/sqlite/201761.html

猜你在找的Sqlite相关文章