SQLite3学习

1,关于版本号
编译阶段,字符串版本号:SQLITE_VERSION="X.Y.Z";
X为主版本号,Y为次版本号,Z为发布版本号;
版本字符串后一般跟随:alpha或者beta
编译阶段,数值型版本号:SQLITE_VERSION_NUMBER=3003007
一般公式为:X*100000+Y*1000+Z
运行阶段,字符串版本号:const char* sqlite3_version();

运行阶段,数值型版本号:int sqlite3_libversion_number();
2,数据库接口
typedef struct sqlite3 sqlite3;

学习中将定义一个新的类型
typedef sqlite3* HDB;
3,64位长整类型
有些编译器不支持标准64位长整型long long int
微软用__int64/unsigned __int64

这儿内部定义一个:sqlite_int64/sqlite_uint64

学习中将定义一个新的类型
typedef sqlite_int64 i64;
typedef sqlite_uint64 u64;

4,数据库关闭
int sqlite3_close(sqlie3*);
如果返回代码为SQLITE_BUSY,则数据库仍旧打开着
原因是语句准备(sqlite3_prepare)没有释放掉(sqlite3_finalize)
5,回调函数及运行函数
typedef int (*sqlite3_callback)(void*,int,char**,char**);
int sqlite3_exec(sqlite3*,const char*,sqlite3_callback,void*,char**);
运行函数一次可以执行一至多个SQL语句
运行函数的第2个参数是SQL语句,如果它包括一至多个select,
运行中每得到一个数据,运行函数第三个参数回调函数将执行,
一般在这个回调中,你应该返回0,如果你返回一个非零值,
则这个select将被中断,并且接下来的其它SQL语句都将被忽略,
运行函数将返回SQLITE_ABORT
第4个参数是个随意指针,用途可用户指定,它将传给回调函数的第1个参数
回调函数第2个参数代表数据结果集中有几列数据,
第3个参数代表列数据的字符串数组,第4个参数代表列名的字符串数组
运行函数中可以指定一个空回调,它并不是一个错误,仅代表不执行回调
运行函数在分析与评估SQL语句且还未执行回调函数时发出一错误,
运行函数将分配适当的堆内存并在其中写入错误信息,错误信息用第5参数返回,
注意你必须用sqlite3_free释放它,如果第5参数为空,运行函数将忽略错误信息。
运行函数成功后,将返回SQLITE_OK,其它错误将依据相应的错误代码
如果数据库文件被锁定或者很忙,则运行函数将返回SQLITE_BUSY
这个行为可以通过使用sqlite3_busy_handler()与sqlite3_busy_timeout改变
6,数据库运行函数sqlite3_exec()与单步运行函数sqliet3_step()的返回值
SQLITE_OK/0 成功执行
SQLITE_ERROR/1 SQL错误或数据库不存在
SQLITE_INTERNAL/2 SQLite内部逻辑错误(没有使用)
SQLITE_PERM/3 访问许可禁止
SQLITE_ABORT/4 回调函数请求中止
SQLITE_BUSY/5 数据库文件被锁定
SQLITE_LOCKED/6 数据库中的一表被锁定
SQLITE_NOMEM/7 malloc()分配堆失败
SQLITE_READONLY/8 企图写只读数据库
SQLITE_INTERRUPT/9 操作被sqlie3_interrupt()中止
SQLITE_IOERR/10 磁盘I/O错误
SQLITE_CORRUPT/11 数据库文件变形
SQLITE_NOTFOUND/12 表或纪录没有找到(没有使用)
SQLITE_FULL/13 插入失败因为数据库满
SQLITE_CANTOPEN/14 不能打开数据库文件
SQLITE_PROTOCOL/15 数据库锁协议错误
SQLITE_EMPTY/16 数据库是空的
SQLITE_SCHEMA/17 数据库模式改变
SQLITE_TOOBIG/18 单行数据过多(没有使用)
SQLITE_CONSTRAINT/19 因约束违背而中止
SQLITE_MISMATCH/20 数据类型不匹配
SQLITE_MISUSE/21 库使用方法不当
SQLITE_NOLFS/22 主机不支持库中操作系统功能
SQLITE_AUTH/23 认证禁止
SQLITE_FORMAT/24 附属数据库格式错误
SQLITE_RANGE/25 sqlite3_bind()第2个参数超出范围
SQLITE_NOTADB/26 打开非数据库文件
SQLITE_ROW/100 sqlite3_step()有另一行数据就绪
SQLITE_DONE/101 sqlite3_step()完成执行,已无数据
7,上一次主键值
sqlite_int64 sqlite3_last_insert_rowid(sqlite3*);
如果表中的主键生效:integer primary key
则这个函数返回的值是确定的,否则将是随机的
8,改变的行数
int sqlite3_changes(sqlite3*);
它将返回数据库最近一次运行sqlite3_exec()所改变的行数(插入或删除)
就算是在事务中回滚rollback中止abort,这些改变都被计数
除非创建表或删除表,这时将不会计数,一般是返回0
在sqlite3_exec()回调中,改变数在sqlite3_exec内部统计,
sqlite3_exec返回后将合计这引起改变数
SQLite对没有where子句的SQL语句"delete from table"实现是这样的:
直接删除表,然后重新表,这样做主要是为了提高效率,
没有where子句的"delete from table"的改变数将返回0

如果你确实需要改变数,请使用"delete from table where 1"
int sqlite3_total_changes(sqlite3*);
这个函数将返回返数据库打开以来所有的insert,delete,update所改变的行数,
触发器中的insert,delete,update也统计在内,但要注意上文的删除所有数据的实现。
9,运行中断
void sqlite3_interrupt(sqlite3*);
在任何数据库运行操作期间,运行这个函数将ABORT数据库运行,
数据库也会寻找最佳良机返回。一般在很长时间的查询中,
用户等得不耐烦了,可以用它中止查询,
10,简单的语句完整性
int sqlite3_complete(const char*);
int sqlite3_complete16(const void*);
前一个是UTF-8版本,后一个是UTF-16版本
如果是一至多个完整的SQL语句,它们将返回true(不知能否当BOOL用)
它的实现策略很简单:最后一个标记只能是空白符或分号
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值