Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71200
  • 博文数量: 14
  • 博客积分: 286
  • 博客等级: 二等列兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 16:39
文章分类

全部博文(14)

文章存档

2012年(13)

2011年(1)

我的朋友

分类: 数据库开发技术

2012-02-26 13:29:32

    最简单的程序使用三个函数(sqlite3_open(), sqlite3_exec(), 和 sqlite3_close().)就可以完成。要是想更好地控制数据库引擎的执行,可以使用sqlite的核心API

在使用这几个接口前,需要了解两个对象
* 数据库连接对象 sqlite3 : sqlite3是一个结构体,用于保存打开的数据库连接
* 预处理过的SQL语句对象 sqlite3_stmt: sqlite3_stmt 用于保存处理过的SQL语句    


1.数据库的打开和关闭:

  1. int sqlite3_open(const char*, sqlite3**);
  2. int sqlite3_close(sqlite3*);
sqlite3_open()的第一个参数为数据库文件名,第二个参数的类型sqlite3为一个结构体,它用于保存建立的数据库连接。当执行成功时,这两个均返回SQLITE_OK, 失败则返回错误代码,可调用sqlite3_errmsg()或者sqlite3_errmsg16()给出错误描述。

UTF-16版本的函数为
  1. int sqlite3_open16(const char*, sqlite3**);
  2. int sqlite3_close16(sqlite3*);
UTF-8编码的另一个数据库打开函数为
  1. int sqlite3_open_v2(
  2.   const char *filename,
  3.   sqlite3 **ppDb,
  4.   int flags,
  5.   const char *zVfs
  6. );
第三个参数可以采用提供的几个选项进行 位或运算,控制数据库的读写权限以及互斥访问。

2预编译SQL语句:
 
  1. int sqlite3_prepare(
  2.   sqlite3 *db,
  3.   const char *zSql
  4.   int nByte,
  5.   sqlite3_stmt **ppStmt,
  6.   const char **pzTail
  7. );
  8. int sqlite3_prepare_v2(
  9.   sqlite3 *db,
  10.   const char *zSql,
  11.   int nByte,
  12.   sqlite3_stmt **ppStmt,
  13.   const char **pzTail
  14. );
此函数需要一个数据库连接的指针,将给定的SQL文本转换为预声明语句对象并返回一个指向它的指针,这个函数并不执行SQL语句。建议使用v2版本。这两个函数的UTF-16版本的参数与此相同,但传入的SQL语句采用UTF-16编码。
SQL语句中可以带有“?”,它代表不确定的值,当需要对这些“?”赋值时,可以使用sqlite3_bind_*()函数族:
  1. int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
  2. int sqlite3_bind_double(sqlite3_stmt*, int, double);
  3. int sqlite3_bind_int(sqlite3_stmt*, int, int);
  4. int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
  5. int sqlite3_bind_null(sqlite3_stmt*, int);
  6. int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
  7. int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
  8. int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
  9. int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
以sqlite3_bind_text()为例,它用于给处理过的SQL语句中的“?”绑定字符串值,第二个参数用于指定要绑定的“?”的序号(每条SQL语句中可以包含多个“?”,序号从1开始),第三个参数为要绑定到“?”上的字符串,第四个参数为字符串长度,第五个参数为一个函数指针,sqlite3执行完后回调此函数,通常用于释放字符串占用的内存,有两个常数可以传递给它,SQLITE_STATIC 表示字符串为常量,而SQLITE_TRANSIENT会使得sqlite3_bind_text()对字符串做一份拷贝。

3.执行SQL语句
   
  1. int sqlite3_step(sqlite3_stmt*);
    这一例程的功能是执行sqlite3_prepare()例程处理过的SQL语句,当返回的结果的第一行可以被获取时,这一例程将会返回,若要获得下一行的结果,可再此调用这一例程,若执行的是无返回结果的SQL语句(例如INSERT),该例程将在一此调用中完成并返回。
    当SQL语句执行成功时,此例程将返回SQLITE_DONE,当SQL语句执行成功且SQL返回一个单行结果集,此例程返回SQLITE_ROW,否则将返回错误代码,比如,如果不能打开数据库文件则会返回SQLITE_BUSY。
    当返回值为SQLITE_ROW时,如需要对返回结果进行处理时,可以使用sqlite3_column_*()函数族:

  1. const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
  2. int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
  3. int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
  4. double sqlite3_column_double(sqlite3_stmt*, int iCol);
  5. int sqlite3_column_int(sqlite3_stmt*, int iCol);
  6. sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
  7. const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
  8. const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
  9. int sqlite3_column_type(sqlite3_stmt*, int iCol);
  10. sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
其中参数 iCol为列的序号,从0开始。

4.销毁预编译的SQL语句
  1. int sqlite3_finalize(sqlite3_stmt *pStmt);
    sqlite3_finalize 和sqlite3_prepare 是相对的,当使用sqlite3_prepare 编译的SQL在使用完后,应该使用sqlite3_finalize 语句来释放掉它。
    如果要多次使用处理过的SQL语句,且要更换里面绑定的参数,可以使用
  1. int sqlite3_reset(sqlite3_stmt *pStmt);

来清除处理过的SQL语句里面绑定的所有参数,然后调用sqlite3_bind_*()函数族重新绑定参数即可。

阅读(3794) | 评论(0) | 转发(0) |
0

上一篇:sqlite3 数据类型

下一篇:arm gnu 汇编伪操

给主人留下些什么吧!~~