SQLite学习笔记(6)

准备查询的优点:

        不需要回调接口,编码简单、清晰;关联了提供信息的函数,可以获得列的存储类型、声明类型、模式名称、表名、数据库名;sqlite3_exec( )的接口只是提供列的名称;准备查询提供一种文本外的获取字段、列值的方法,可以以C数据类型获取;准备查询能重新运行,可以重用已经编译的SQL;准备查询支持参数化的SQL语句

 

         检查变化:

                 可以从sqlite3_changes()获得有多少记录受到影响,提供最后一次执行的更新、插入、删除语句影响的记录数目。不包含原始命令触发器的结果。而最后的字段信息可以通过sqlite3_last_inert_rowid( )获得该值。

 

获取表查询:

         函数:sqlite3_get_table( )返回单独函数调用中一个命令的结果集。封装了sqlite3_exec( )且尽可能的返回数据,获取记录更便捷。

         函数声明:

         int   sqlite3_get_table(     sqlite  *  ,     /*打开的数据库*/

                                                      const  char  * sql ,       /*将要执行的sql语句*/

                                                      char  ***resultp ,        /* 结果写入该指针指向的char  *[ ]*/

                                                      int    *nrow,                 /* 结果集中行的数目*/

                                                      int     * ncolumn,        /*结果集中列的数目*/

                                                      char ** errmsg          /*error  message*/

                                             );

           函数接收sql语句中返回的所有记录,使用堆上锁声明的内存,使用sqlite3_malloc( )存储在resultp中。必须使用sqlite3_free_table()释放内存,该函数的唯一参数就是resultp指针。

 

 查询准备:

          每个查询函数都有自己的行和列的获取方式。相对于准备查询来说,sqlite3_exec()和sqlite3_get_table()提供的功能还是比较少的;值得一提的是sqlite3_exec()对于运行修改数据库的命令的很合适,一个函数调用就可以完成工作。

          准备查询使用一组特别函数进行列和行的访问。列值可以使用sqlite3_column_xxx()函数获取,xxx为返回值的数据类型;

          准备查询的三个步骤:编译、执行、完成。

                    sqlite3_prepare_v2()编译查询,由sqlite3_step()分布执行查询,sqlite3_finalizer()完成关闭查询。sqlite3_reset()可以重用编译。

            编译:

                     SQL语句 →  VBDE字节码。由sqlite3_prepare_v2()完成。

                     函数声明:int  sqlite3_prepare_v2(  

                                                                                       sqlite*    db , /*打开的数据库*/

                                                                                       const   char  *zSQl ,      /*sql文本*/

                                                                                       int   nBYTES ,   /*zsql字节长度*/

                                                                                       sqlite3_stmt     **ppStmt , /*语句句柄*/

                                                                                       const  char  **pzTail    /*指向zSQl未使用的部分*/

                                                                                   );

                                         分配执行该语句的所需的所有资源,将其字节码关联到单个语句句柄,参数ppStmt (是sqlite3_stmt的结构体)来指定。这种数据结构包含了命令的字节码、绑定的参数、B-tree游标、执行上下文、以及sqlite3_step( )在执行过程中查询状态所需的其他数据。sqlite3_prepare_v2()不会对连接或者数据库产生任何影响,也不启动事务或者获取锁。他可以直接通过编译器工作,未执行查询准备。 语句句柄高度依赖于他所被编译的数据库模式 ,数据库模式的更改对于准备查询语句会有失败的影响,此时可能会开启自动重新编译,而当无法重新编译的时候,sqlite3_step()函数会返回sqlite_schema错误。此时,检查错误需用sqlite3_errmsg() 。

          执行:

                  前提是查询语句准备就绪,利用sqlite3_step()执行,声明:int  sqlite3_step( sqlite3_stmt    *pstmt);

                  sqlite3_step()直接接受语句句柄与VDBE通信,生成vdbe字节码。

                  the  first time 调用sqlite3_step()d的时候,vdbe会获取一个执行指令的数据库锁。如不能获取锁的时候,且无繁忙处理程序,比如说发邮件服务什么的,就会返回sqlite_busy错误。而有繁忙处理程序的时候,就会调用该程序。

                 若SQL不返回数据,那么第一次调用就完成工作,返回完成结果的指示性代码;若要返回数据,那么第一次调用将语句定位在第一个记录的B-tree游标上,后续调用的sqlite3_step()将游标定位在结果集的后续记录上。到达末尾前,sqlite3_step()将为结果集的每个记录返回sqlite_row. 如果返回的是sqlite_down()表示游标到达结果集的末尾。

        完成与重置:

                 函数: int  sqlite3_finalize(sqlite3_stmt   *pStmt) ;

                               int  sqlite3_reset( sqlite3_stmt  *pStmt) ;

                 sqlite3_finalize() 关闭语句,释放资源并提交或者回滚任何隐式事务,清除日志文件并释放相关联的锁。

                 sqlite3_reset()通过重置重复使用语句,保持已编译的sql语句,但是会将目前语句的变化提交到数据库。启动自动提交后,会释放并且锁定清除日志文件。相对于sqlite3_finalize()来说,他保留了与语句相关的资源,可重复执行,避免了多次对于sqlite3_prepare()的调用。

                函数:sqlite3_complete( )是提示符提出的工具。

 

获取记录:

          函数:sqlite3_column_count( ) 和sqlite3_data_count( ) ;

          函数声明:

                  int    sqlite3_column_count(sqlite3_stmt   *pStmt );          返回语句句柄相关的字段数;

                  int    sqlite3_column_count(sqlite3_stmt   *pStmt );          sqlite3_step()返回SQLITE_ROW后,该函数返回当前记录的列数,但是要求语句句柄上有活动游标。

 

         获取字段信息:

                  函数sqlite3_column_name( );

                  函数声明:  const  char  *sqlite_column_name(

                                                                                                         sqlite3_stmt  * , /* 语句句柄*/

                                                                                                         int   iCol              ,/*字段的次序*/

                                                                                                        );

                 获取当前记录中所有字段的关联的存储类:

                 函数声明:int        sqlite3_column_type(

                                                                                               sqlite3_stmt  * , /* 语句句柄*/

                                                                                               int   iCol  ;            ,/*字段的次序*/

                                                                                           );

                该函数返回5个存储类对应的整数值(原生数据类型或者存储类):

                                      #define    SQLITE_INTEGER        1;  

                                      #define    SQLITE_FLOAT             2;  

                                      #define    SQLITE_TEXT                3;  

                                      #define    SQLITE_BLOB               4;  

                                      #define    SQLITE_NULL               5;  

                可以使用sqlite3_column_decltype( )函数获取字段在表模式定义中声明的数据类型,函数声明:

                            const char *sqlite3_column_decltype(

                                                                                               sqlite3_stmt  * , /* 语句句柄*/

                                                                                               int               ;            ,/*字段的次序*/

                                                                                               );

             获取字段值:

                      sqlite3_column_xxx()返回字段值。通用形式:

                       xxx     sqlite3_column_xxx(

                                                                     sqlite3_stmt  * , /* 语句句柄*/

                                                                      int                          ,/*字段的次序*/

                                                                    );

             最常用的sqlite3_column_xxx()函数:

                 int      sqlite3_column_int( sqlite3_stmt  * ,    int   iCol );

                 double     sqlite3_column_double( sqlite3_stmt  * ,    int   iCol );

                 long    long  int    sqlite3_column_int64( sqlite3_stmt  * ,    int   iCol ); 

                 const  void   *sqlite3_column_blob( sqlite3_stmt  * ,    int   iCol );

                 const  unsigned   char   *sqlite3_column_text( sqlite3_stmt  * ,    int   iCol );

                 const  void  *sqlite3_column_text16( sqlite3_stmt  * ,    int   iCol ); 

            列类型之间可以相互转换,具体的转换规则参照《SQLite权威指南》page187.

            其中,对于blob列,复制时要指明其长度。获取其长度后,利用sqlite3_column_blob()复制二进制数据。

 


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值