本文介绍一下SQLite C/C++接口。

早期的SQLite C/C++接口只有5个接口函数, 很容易学习。 新版本的SQLite新增了很多功能, 目前大概有185个API接口。本文介绍一些核心的API接口和对象。

1. 核心对象 
数据库连接对象: sqlite3
prepared_statement对象: sqlite3_stmt

严格的讲 sqlite3_stmt对象也不是必须的, 另外两个封装了qlite3_stmt的接口sqlite3_exec和sqlite3_get_table可以代替sqlite3_stmt对象完成数据存取工作。 但是理解sqlite3_stmt对于充分使用SQLite有很大帮助。

以下是一些操作 sqlite3和sqlite3_stmt对象的接口。下面这些名字只是提供一个概念,实际的函数可能会有很多版本比如sqlite3_open() 有,sqlite3_open_v16(), sqlite3_open_v2()
sqlite3_open()
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()

函数说明
sqlite3_open() 打开一个数据库连接, 返回sqlite3对象
sqlite3_prepare() 此函数将SQL转换成sqlite3_stmt对象, 通常使用sqlite3_prepare_v2()
sqlite3_step()  此函数单步执行sqlite3_stmt
sqlite3_column()   返回 sqlite3_stmt所在行的指定column的值, 有如下具体函数
    * sqlite3_column_blob()
    * sqlite3_column_bytes()
    * sqlite3_column_bytes16()
    * sqlite3_column_count()
    * sqlite3_column_double()
    * sqlite3_column_int()
    * sqlite3_column_int64()
    * sqlite3_column_text()
    * sqlite3_column_text16()
    * sqlite3_column_type()
    * sqlite3_column_value()

sqlite3_finalize()  销毁 sqlite3_stmt对象, 所有sqlite3_stmt对象都应该销毁以防止内存泄漏
sqlite3_close()  关闭数据库连接,  销毁sqlite3对象, 所有与这个sqlite3对象相关的sqlite3_stmt对象都应该在调用这个函数之前销毁。

2. 绑定和重新执行sqlite3_stmt 
sqlite3_reset():  此函数使得执行过sqlite3_step()的sqlite3_stmt重新执行, 相当于将游标返回到开始位置重新读取数据, sqlite3_reset()的效率比重新创建一个sqlite3_stmt搞很多。

sqlite3_bind(): 此函数用于INSERT SQL, 当同一个INSERT SQL要插入一系列数据时使用, 每次sqlite3_step()后重新bind数据。

3. 一般用法和步骤 
(1) Create a prepared statement using sqlite3_prepare().
(2) Evaluate the prepared statement by calling sqlite3_step() one or more times.
(3) For queries, extract results by calling sqlite3_column() in between two calls to sqlite3_step().
(4) Destroy the prepared statement using sqlite3_finalize().

4. 简易接口 
sqlite3_get_table()
sqlite3_exec()

5. 例子

view plaincopy to clipboardprint?
01.void basic_interface()   
02.{   
03.    sqlite3 *db;   
04.    char *zErrMsg = 0;   
05.    int rc;   
06.    char sql[]="select * from addr;";   
07.    sqlite3_stmt *stmt;   
08.    int id;   
09.    unsigned char *street, *city;   
10.    rc = sqlite3_open("D:/VCWork/test.db", &db);   
11.    if( rc ){   
12.        fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));   
13.        sqlite3_close(db);   
14.        return;   
15.    }   
16.    rc= sqlite3_prepare_v2(db,sql, strlen(sql), &stmt,0);     
17.    if( rc ){   
18.        fprintf(stderr, "Can't open statement: %s/n", sqlite3_errmsg(db));   
19.        sqlite3_close(db);   
20.        return;   
21.    }   
22.    //right align output format   
23.    printf("%10s %10s %10s/n", "id", "street", "city");   
24.    printf("%10s %10s %10s/n", "---", "---", "---");   
25.    while(sqlite3_step(stmt)==SQLITE_ROW ) {   
26.        id = sqlite3_column_int(stmt, 0);   
27.        street = (unsigned char*)sqlite3_column_text(stmt,1);   
28.        city = (unsigned char*)sqlite3_column_text(stmt, 2);   
29.        printf("%10d %10s %10s/n", id, street, city);   
30.    }   
31.    sqlite3_finalize(stmt);   
32.    sqlite3_close(db);   
33.}  
void basic_interface()
{
 sqlite3 *db;
 char *zErrMsg = 0;
 int rc;
 char sql[]="select * from addr;";
 sqlite3_stmt *stmt;
 int id;
 unsigned char *street, *city;
 rc = sqlite3_open("D:/VCWork/test.db", &db);
 if( rc ){
  fprintf(stderr, "Can't open database: %s/n", sqlite3_errmsg(db));
  sqlite3_close(db);
  return;
 }
 rc= sqlite3_prepare_v2(db,sql, strlen(sql), &stmt,0);  
 if( rc ){
  fprintf(stderr, "Can't open statement: %s/n", sqlite3_errmsg(db));
  sqlite3_close(db);
  return;
 }
 //right align output format
 printf("%10s %10s %10s/n", "id", "street", "city");
 printf("%10s %10s %10s/n", "---", "---", "---");
 while(sqlite3_step(stmt)==SQLITE_ROW ) {
  id = sqlite3_column_int(stmt, 0);
  street = (unsigned char*)sqlite3_column_text(stmt,1);
  city = (unsigned char*)sqlite3_column_text(stmt, 2);
  printf("%10d %10s %10s/n", id, street, city);
 }
 sqlite3_finalize(stmt);
 sqlite3_close(db);
}

参考:

An Introduction To The SQLite C/C++ Interface

http://www.sqlite.org/cintro.html

sqlite3接口简要说明的更多相关文章

  1. [置顶] Android中使用sqlite3操作SQLite

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库:  1.将sqlit ...

  2. SQLite3命令操作大全

    SQLite3命令操作大全 SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.ql ...

  3. Sqlite数据库sqlite3命令小记

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 开始 启动sqlite3程序,仅仅需 ...

  4. python django中使用sqlite3数据库 存储二进制数据ByteArray

    在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...

  5. linux下安装sqlite3

    1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库.2.安装:  要安装sqlite3,可以在终端提示符后运行下列命令:  sudo apt-get install sqli ...

  6. Android中使用sqlite3操作SQLite

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库:  1.将sqlit ...

  7. 如何移植sqlite3到嵌入式平台

    本人也时常看其他人的blog,搜索资料的目的是尽快解决当前的问题,例如如何移植一个ssh,尽快要明白所需的东西,方能移植完成. 移植sqlite3的步骤如下: 1. 到官方网站下载指定的源码包:htt ...

  8. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  9. Cisco 交换机与路由器故障处理方法分享

    一.网络的复杂性 一般网络包括路由.拨号.交换.视频.WAN(ISDN.帧中继.ATM.…).LAN.VLAN.… 二.故障处理模型 1. 界定问题(Define the Problem) 详细而精确 ...

随机推荐

  1. 80个Python经典资料(教程+源码+工具)汇总——下载目录 ...

    原文转自:http://bbs.51cto.com/thread-935214-1.html 大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学 ...

  2. 解决Linux主机上的 远程MySQL客户端无法连接的问题

    无法连接到 MySQL 数据库可能的原因有: 1. PHP 无法连接 MySQL 可能是 PHP 配置不正确,没加上连接 MySQL 的功能. 2. MySQL 软件包升级,但没有升级数据库,或安装 ...

  3. CollabNetSubversionEdge 4.0.4教程

    CollabNetSubversionEdge是svn的集成环境,集合subversion,apache,viewvc, 参考网址:http://blog.miniasp.com/post/2011/ ...

  4. 本地通信实例(AF_UNIX) (转载)

    转自:http://www.groad.net/bbs/thread-1709-1-1.html 程序说明:  程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信.使用 ...

  5. bzoj 3779: 重组病毒【LCT+线段树维护dfs序】

    %.8lf会WA!!%.8lf会WA!!%.8lf会WA!!要%.10lf!! 和4817有点像,但是更复杂. 首先对于操作一"在编号为x的计算机中植入病毒的一个新变种,在植入一个新变种时, ...

  6. Luogu P1144 最短路计数 【最短路】 By cellur925

    题目传送门 常规的最短路计数问题:注意有重边(重边不用理,看样例),自环(读入时过滤). 另外这个无向图没有权,其实可以直接bfs做,但考虑到以后带权的情况,按spfa走了. 水题被卡了三次(嘤嘤嘤 ...

  7. NOIp 2010/Luogu P1525 关押罪犯 【二分图/并查集】 By cellur925

    题目传送门 感想:相信自己的想法!继续挖掘! 读完题目后:看到的最大值最小?二分答案啊!再仔细一看:wi达到了1e9,二分可能费点劲.(其实真的是可以的)而且check函数貌似并没有什么行之有效的写法 ...

  8. Luogu P1113 杂务 【拓扑排序】 By cellur925

    题目传送门 这题我们一看就知道是拓扑排序,然而在如何转化问题上花了大工夫,一个小时后最后还是无奈看了题解qwq. 显然我们可以对于每个任务,从他的前导任务到他连一条边,最后我们可以得到一个DAG.在这 ...

  9. 二分查找+数学 HDOJ 4342 History repeat itself

    题目传送门 题意:计算从1开始到第n个非完全平方数的开方和 分析:设第n个非完全平方数的值为a,x * x < a < (x+1) * (x+1),而且易得(tmp = sqrt (a) ...

  10. leaflet在地图上加载本地图片

    <link href="~/Scripts/Leaflet/leaflet.css" rel="stylesheet" /><script s ...