SQLite3简单使用的详解

SQLite3返回值的意思:

#define SQLITE_OK 0 /* Successful result */ /* beginning-of-error-codes */

#define SQLITE_ERROR 1 /* SQL error or missing database */ #define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ #define SQLITE_PERM 3 /* Access permission denied */

#define SQLITE_ABORT 4 /* Callback routine requested an abort */ #define SQLITE_BUSY 5 /* The database file is locked */

#define SQLITE_LOCKED 6 /* A table in the database is locked */ #define SQLITE_NOMEM 7 /* A malloc() failed */

#define SQLITE_READONLY 8 /* Attempt to write a readonly database */

#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ #define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ #define SQLITE_CORRUPT 11 /* The database disk image is malformed */ #define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ #define SQLITE_FULL 13 /* Insertion failed because database is full */ #define SQLITE_CANTOPEN 14 /* Unable to open the database file */ #define SQLITE_PROTOCOL 15 /* Database lock protocol error */ #define SQLITE_EMPTY 16 /* Database is empty */

#define SQLITE_SCHEMA 17 /* The database schema changed */ #define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ #define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ #define SQLITE_MISMATCH 20 /* Data type mismatch */ #define SQLITE_MISUSE 21 /* Library used incorrectly */

#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ #define SQLITE_AUTH 23 /* Authorization denied */

#define SQLITE_FORMAT 24 /* Auxiliary database format error */

#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ #define SQLITE_NOTADB 26 /* File opened that is not a database file */ #define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ #define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ /* end-of-error-codes */

关于事物

int result;

result = sqlite3_exec( db, \开始一个事务 result = sqlite3_exec( db, \提交事务 result = sqlite3_exec( db, \回滚事务

关于SQLite3和标准sql之间的差异和用法(不全)

1. sql语句中不能使用top关键字,比如:

SELECT TOP x * FROM table_name WHERE .... ORDER BY .... DESC

检索到的记录按降序排,取其前x条记录。在sqlite中应该这样写: SELECT * FROM table_name WHERE .... ORDER BY .... DESC LIMIT 0,x 2. 拷贝表数据,拷贝表b数据到a

CREATE TABLE IF NOT EXISTS a AS SELECT * FROM b

3. 表更名:ALTER TABLE table_name RENAME TO new_table_name

4. 不能直接修改表字段,包括类型,以及默认值,比如删除一个字段,可以先将这个表 里除去要删除字段的其他数据都拷贝的新表里,删除原来这个表,将新表更名为原 来的表名

(1)CREATE TABLE table_name_new AS SELECT field1,field2,field3.... FROM table_name_old (2)DROP TABLE table_name_old

(3)ALTER TABLE table_name_old RENAME TO table_name_new 5. 往表里增加字段时,只能一个个加:

ALTER TABLE table_name ADD field_name field_type,如果字段是NOT NULL那么

ALTER TABLE table_name ADD field_name field_type NOT NULL这样写是不对的,sqlite如果是not null 那么你就应该给定一个默认值 所以应该这样写:ALTER TABLE table_name ADD field_name field_type DEFAULT default_value 6 如果sql语句中有字符串,应当加单引号,例如:WHERE field_name1 = '字符串'

关于SQLite3的简单使用

下面这些方法参数没有全部列出

假如我们要更新一个表,但是要SET的字段个数和内容并不确定,或者要更新的是blob类型的字段,这时就需要用到绑定,例如:

UPDATE table_name SET field1 = ?,field2 = ?... WHERE field = '匹配字段',问号处就是要绑定的内容。这个在标准sql也有用到

sqlite3_stmt* stmt 这个stmt就贯穿了整个sql语句的执行过程

一.如何使用

1. int rc = sqlite3_prepare16_v2(stmt,sql)准备sql语句,他开辟一段缓存,用来保存和记 录准备好的sql语句,所以它一旦出现,那么sqlite3_finalize也必须使用,用来在最后释放这块内存,正确执行后返回值rc = 0,然后得到一个stmt用来进行下一步

(1) 如果是double类型字段,这样绑定:rc = sqlite3_bind_double(stmt, i, val); i值代表绑定 的是第几个问号

(2) 字符串类型字段:rc = sqlite3_bind_text16(stmt, i, bstrVal, bytes, SQLITE_TRANSIENT);参

数的意思不懂,可以自己查

(3)如果内容为空:sqlite3_bind_null (stmt, i);

(4)blob类型:sqlite3_bind_blob(stmt,i,buff,dwSize,SQLITE_TRANSIENT);还有其他的类型 就不一一列举了,资料很多

2. int rc = sqlite3_step(stmt),绑定完毕后,用这个执行sql语句,假如这是一个update语 句,正确执行后返回值为rc = 100,如果是一个select语句的话,执行后stmt标志的就是第一条sql检索记录,在执行一次sqlite3_step后可得到第二条记录,依次可以遍历完整个记录集,到最后一条遍历完时,返回值rc = 101表示已经没记录了

3. int rc = sqlite3_reset(stmt);当使用sqlite3_reset时,就是将stmt又恢复到prepare执行

后的状态,因为频繁使用prepare效率不高,,所以用reset重复使用这块内存会使 效率大大提高

4. 怎么取得某条记录的某个字段值呢,那就是通过sqlite3_column_blob,

sqlite3_column_int,sqlite3_column_double,sqlite3_column_text16等来取得。例如

sqlite3_column_int(stmt,i),此时stmt对应的是第n条记录,i对应的是第i个字段,这个 方法的返回值就是取得字段值。至于blob字段可能有时会比较复杂 5. sqlite3_finalize(stmt) 这个就不用说了

二.效率问题

sqlite_exec()直接执行,可用来处理直接就能执行的sql语句,他是上面那一系列的封装, 所以他的效率并不比prepare那种方式高。在此只是简单的将我用到的讲述下,免得大家在用的时候走太多弯路,我在刚开始对这些一无所知的时候走了很多弯路。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4