SQLITE3 C语言接口 API 函数简介

说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新.

/* 2012-05-25 */
int sqlite3_open(
const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */
sqlite3** ppDB /* 输出: SQLite 数据库句柄 */
);
说明:
该函数打开由 filename 指定的数据库, 一个数据库连接句柄由 *ppDB 返回(不管是否发生了一个错误). 唯一异常是 SQLite 无法为 SQLite 对象分配内存空间, 此时将返回 NULL. 如果数据库被成功打开(和/或 创建), 函数返回 SQLITE_OK(0). 否则返回一个错误码, 可以通过 sqlite3_errmsg() 取得错误原因. 无论是否成功打开数据库, 都应该使用 sqlite3_close() 关闭数据库连接.
示例:
int ret = 0;
char* filename = "./nbsg.db";
sqlite3* pDB = NULL;
to_utf8(filename);
ret = sqlite3_open(filename, &pDB);
if(ret != SQLITE_OK)
... int sqlite3_close(
sqlite3* pDB /* 由 sqlite3_open 或基相关的函数打开的 SQLite 对象句柄 */
);
说明:
该函数用来析构 sqlite3 对象. 返回 SQLITE_OK 表示对象被成功析构, 以及所有相关的资源被成功回收
应用程序必须在关闭之前 "完成(finalize)" 所有的 "预编译语句(prepared statements)", 并且关闭所有的 "二进制句柄绑定(BLOB handle)", 如果在关闭时还有未完成的预编译语句或二进制句柄, 那么函数返回 SQLITE_BUSY(5).
示例:
if(pDB != NULL)
{
sqlite3_close(pDB);
pDB = NULL;
}
/* 2012-05-26 */

int sqlite3_errcode(
sqlite3* pDB /* SQLite3 数据库句柄 */
); 说明:
该函数返回最近一次调用 sqlite3_ API时产生的错误码.
示例:
int errcode = sqlite3_errcode(pDB); const char *sqlite3_errmsg(
sqlite3* pDB /* SQLite3 数据库句柄 */
);
说明:
该函数返回与pDB数据库指针相关的错误信息, 由英语书写.
用户不必考虑内存的释放, 其由SQLite内部管理, 它也将会在下产次调用函数时被覆盖.
示例:
printf("%s\n", sqlite3_errmsg(pDB)); 女孩不哭(QQ:191035066)@2012-05-26 11:31:54 @ http://www.cnblogs.com/nbsofer
/* sqlite3_exec(), 2012-05-28 */

int sqlite3_exec(
sqlite3* pDB, /* sqlite3句柄 */
const char* sql, /* 被执行的 SQL 语句 */
int (*callback)(void*,int,char**,char**), /* 执行/查询回调函数 */
void* pvoid, /* 传递给回调函数的第一个参数 */
char**errmsg /* 错误输出信息 */
); 说明:
该函数用来执行若干条 SQL 语句.
该函数包裹了先前版本的 sqlite3_prepare(), sqlte3_step() 和 sqlite3_finalize() 函数, 这样, 用户就可以执行简单的代码执行多条 SQL 语句.
sqlite3_exec()接口执行多条以";"分隔的SQL语句. 如果回调函数不为 NULL, 则它对每一个行查询结果都会调用该回调函数. 如果没有回调函数被指定, sqlite3_exec() 只是简单地忽略查询结果.
当在执行该SQL语句发生错误时, 执行将发生中断, 并且后面的语句也全部被忽略. 如果 errmsg 参数不为空任何错误信息将会被写进由 sqlite3_malloc() 得到的的内存空间中, 即 errmsg 指向的内存. 为了避免内存泄漏, 应用程序应该在不需要该错误信息后立即调用 sqlite3_free() 释放该内存空间. 如果 errmsg 参数不为 NULL, 并且没有错误发生, errmsg 被设置为 NULL.
如果回调函数返回非零, sqlite3_exec() 立即中断查询, 并且不再执行后续的 SQL 语句, 也不再调用回调函数, sqlite3_exec() 将返回 SQLITE_ABORT 结束执行.
示例:
sqlite3_exec(pDB, to_utf8("delete from tablename where id=123;"), NULL, NULL, NULL);
sqlite3_exec(pDB, to_utf8("create table if not exists tablename (id integer primary key,name text);"), NULL, NULL, NULL);
sqlite3_exec(pDB, to_utf8("insert into tablename (name) values ('女孩不哭');"), NULL, NULL, NULL);
if(sqlite3_exec(pDB, to_utf8("select * from tablename;"), sqlite_callback, NULL, &pszErrMsg) != SQLITE_OK)
{
...
sqlite3_free(pszErrMsg);
pszErrMsg = NULL;
}
参阅:在 sqlite3 中使用回调函数(http://www.cnblogs.com/nbsofer/archive/2012/05/29/2523807.html)
/* 2012-05-29, sqlite3_prepare(), sqlite3_step(), sqlite3_finalize() */
int sqlite3_prepare(
sqlite3* pDB, /* 成功打开的数据库句柄 */
const char* sql, /* UTF8编码的 SQL 语句 */
int nbytes, /* 参数 sql 的字节数, 包含 '\0' */
sqlite3_stmt** ppStmt, /* 输出:预编译语句句柄 */
const char** pszTail /* 输出:指向 sql 语句中未使用的部分 */
); 说明:
要执行一条 SQL 查询,其必须先被编译成字节码, 然后才能被其它函数使用.
如果 nbytes 小于零, sql 语句则以第一个 '\0'终结. 如果它非负, 则为读取的最大长度. 当 nbytes 大于 0 时, 则读取指定长度, 如果'\0'先被读到, 则以'\0'结束. 如果用户知道被传入的 sql 语句是以 '\0' 结尾的, 那么有一个更好的做法是:把nbytes的值设为该字符串的长度(包含'\0'), 这样可以避免 SQLite 复制该字符串的一份拷贝, 以提高程序的效率.
如果 pszTail 不为 NULL, 则 *pszTail 指向 sql 中第一个被传入的 SQL 语句的结尾. 该函数只编译 sql 的第一个语句, 所以 *pszTail 指向的内容则是未被编译的.
*ppStmt 指向一条可以被 sqlie3_step() 函数使用的预编译语句. 如果有错误发生, *pszStmt 的值为NULL.
调用者应该使用 sqlite3_finalize() 删掉被预编译的语句.
如果函数成功, 返回 SQLITE_OK, 否则返回一个错误码. int sqlite3_step(
sqlite3_stmt* ppStmt /* 一条被预编译的 sql 语句 */
);
说明:
当一条语句被 sqlite3_prepare() 或其相关的函数预编译后, sqlite3_step() 必须被调用一次或多次来评估该预编译语句.
该函数的详细行为依赖于由 sqlite3_prepare()(或其相关的函数) 产生的是一条怎样的预编译语句.
函数将返回一个以下的结果来标识其执行结果:
SQLITE_BUSY:忙碌. 数据库引擎无法锁定数据去完成其工作. 但可以多次尝试.
SQLITE_DONE:完成. sql 语句已经被成功地执行. 在调用 sqlite_reset() 之前, 当前预编译的语句不应该被 sqlite3_step() 再次调用.
SQLITE_ROW:查询时产生了结果. 此时可以通过相关的"数据访问函数(column access functions)"来取得数据. sqlite3_step() 的再一次调用将取得下一条查询结果.
SQLITE_ERROR:发生了错误. 此时可以通过 sqlite3_errmmsg() 取得相关的错误信息. sqlite3_step() 不能被再次调用.
SQLITE_MISUSE:不正确的库的使用. 该函数使用不当.
其它:
有关预编译的使用, 将在以后的函数介绍中详细说明. int sqlite3_finalize(
sqlite3_stmt* pStmt /* 被预编译的语句 */
);
说明:
该函数用来删除一条被预编译的 sql 语句
示例:
sqlite3_finalize(pStmt);
pStmt = NULL;

[转]SQLITE3 C语言接口 API 函数简介的更多相关文章

  1. MySql接口API函数综述

    C API函数概述 函数 描述 mysql_affected_rows() 返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. mysql_autocommit() 切换 a ...

  2. 微信公众平台自定义菜单接口API指南

    微信公众平台开发模式自定义菜单接口API指南 简介 开发者获取使用凭证(如何获取凭证)后,可以使用该凭证对公众账号的自定义菜单进行创建.查询和删除等操作. 自定义菜单接口可实现以下类型按钮: clic ...

  3. SQLite3 C/C++ 开发接口简介(API函数)

    from : http://www.sqlite.com.cn/MySqlite/5/251.Html 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的 ...

  4. sqlite数据库的基本用法及C语言的API接口简介

    ********************sqlite数据库******************** http://www.sqlite.org/c3ref/intro.html 1-- 安装数据库: ...

  5. Detours简介 (拦截x86机器上的任意的win32 API函数)

    Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Det ...

  6. 开放数据接口 API 简介与使用场景、调用方法

    此文章对开放数据接口 API 进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用. 在给大家分享的一系列软件开发视频课程中,以及在我们的社区微信群聊天中,都积极地鼓励大家开 ...

  7. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  8. C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载

    <C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...

  9. 07. Go 语言接口

    Go 语言接口 接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具 ...

随机推荐

  1. Echart多图联动

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. ABAP简单表维护的制作

    为了知识的积累,特作了个简单的表维护. 因为自己之前做dynpro程序的时候建了一个Tree node的表,所以就不在此重复.(在表的交付和维护页签中标的属性要是‘允许标准表维护的’) 直接Alt+U ...

  3. 委托传参,lambda

    今天一朋友问到一问题,怎么在timer的委托里面传参数,我初一想Invoke 可以传参数吧,我就说了. 后来他说这个委托是微软定义,不能变参数,于是我就自己写了一段代码试 试. 我最初写的代码如下 p ...

  4. Eclipse如何设置代码提示功能

    Windows→Preference→XML→XML Files→Editor→Content Assist→Auto Activation→Prompt when these characters ...

  5. 如何实现301的跳转?当输入域名http://xxx.com的时候自动重定向到www上去

    答案:在服务器上操作,注意勾选和不勾选的区别,使用Fiddle进行观察,301和302之间的区别

  6. 优化MYSQL数据库的方法

    1.选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM2.使用连接(JOIN)来代替子查询: a.删除没有任何订单客户:DELETE ...

  7. Android 4.3正式发布:四大新功能一览

    在旧金山举行的新品发布会上,Google正式发布了Android 4.3,代号仍为“Jelly Bean”.此次更新并没有太大改变,只是紧跟4.1.4.2步伐, 新增了低功耗蓝牙.多用户登录等一系列功 ...

  8. 如何在android项目中引用project作为类库引用

    前言: 在我们开发项目的时候,存在很多多个项目共有一个资源.逻辑代码的情况,这种情况一般我们采用在开发项目中导入别的项目作为引用的类库.资源等. 操作: 1.  新建一个android项目common ...

  9. C#获取本机mac地址

    添加System.Management的引用, using System.Management; string mac = ""; ManagementClass mc = new ...

  10. 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...