sqlite3接口简要说明
本文介绍一下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接口简要说明的更多相关文章
- [置顶] Android中使用sqlite3操作SQLite
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库: 1.将sqlit ...
- SQLite3命令操作大全
SQLite3命令操作大全 SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.ql ...
- Sqlite数据库sqlite3命令小记
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 开始 启动sqlite3程序,仅仅需 ...
- python django中使用sqlite3数据库 存储二进制数据ByteArray
在python中使用sqlite3数据库存储二进制流数据ByteArray,在django使用sqlite3数据库时,有时候也要注意最好使用二进制流ByteArray插入字符串. 使用ByteArra ...
- linux下安装sqlite3
1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库.2.安装: 要安装sqlite3,可以在终端提示符后运行下列命令: sudo apt-get install sqli ...
- Android中使用sqlite3操作SQLite
SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库: 1.将sqlit ...
- 如何移植sqlite3到嵌入式平台
本人也时常看其他人的blog,搜索资料的目的是尽快解决当前的问题,例如如何移植一个ssh,尽快要明白所需的东西,方能移植完成. 移植sqlite3的步骤如下: 1. 到官方网站下载指定的源码包:htt ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Cisco 交换机与路由器故障处理方法分享
一.网络的复杂性 一般网络包括路由.拨号.交换.视频.WAN(ISDN.帧中继.ATM.…).LAN.VLAN.… 二.故障处理模型 1. 界定问题(Define the Problem) 详细而精确 ...
随机推荐
- Java-Maven:Maven百科
ylbtech-Java-Maven:Maven百科 1.返回顶部 1. Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven 除了以程序 ...
- vue 基础知识随笔
在vue2.0中一个vue实例的生命周期中已经没有ready()了,在vue1.0中才有ready();在vue2.0中立即执行函数使用mounted v-for 参数顺序更新: 数组中使用(valu ...
- 让padding不影响容器总长度
增加CSS属性: box-sizing:border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box;
- cardboard sdk for unity 系统分析 - 对像与类
一.cardboard通过monobehavior派生的脚本组件与UNITY3D联系起来: 二.相关的类及其关系如下图:
- MySQL之不得不说的keepsync和trysync
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 开宗明义,keepsync和trysync是网易MySQL分支版本InnoSQL的两个参数,非常重要的两个参 ...
- Python机器学习算法 — 关联规则(Apriori、FP-growth)
关联规则 -- 简介 关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系.它的目的是利用一些度量指标来分辨数据库中存在的强规则.也即是说关联规则挖掘是用于知识发现,而非预 ...
- 【转】Hive安装及使用攻略
Posted: Jul 16, 2013 Tags: HadoophiveHiveQLsql分区表 Comments: 18 Comments Hive安装及使用攻略 让Hadoop跑在云端系列文章, ...
- SetViewportOrgEx(视口) 与 SetWindowOrgEx(窗口) 解析
SetViewportOrgEx (hdc,x/2,y/2) 视口中心点设置到窗口中心 获取客户群x和y,x/2,y/2 ,这样中心点就到窗口中间了. SetWindowOrgEx(hdc,-x/2, ...
- vijos1846 [NOIP2013] 华容道【最短路】
传送门:https://vijos.org/p/1983 (其实noip的题各个oj都会有的,就不贴其它传送门了) 这道题真的是,怎么说,我都不知道怎么评价了= =.果然数据量小的题怎么暴力都可以过. ...
- set和get方法
package day02; public class Person { /**为了封装,一般的属性都设置成为private(私有的),所以你无法用 .属性 的方式来得到属性值, * 因此此时用两个p ...