SQLite学习笔记(7)

来源:互联网 发布:淘宝号怎么升级心 编辑:程序博客网 时间:2024/05/13 00:52

首先要注意句柄关联。其次,开始看关于查询参数化的内容。

查询参数化:

         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。





原创粉丝点击