SQLite学习笔记(6)

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

intnBYTES,/*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_FLOAT2;

#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()复制二进制数据。

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

猜你在找的Sqlite相关文章