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用) 它的实现策略很简单:最后一个标记只能是空白符或分号 |