[转]SQLITE3 C语言接口 API 函数简介

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;

时间: 2024-10-26 08:05:45

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

SQLite3 C语言API入门

下载SQLite3 我们下载sqlite源码包,只需要其中的sqlite3.c.sqlite.h即可. 最简单的一个创建表操作 #include <stdio.h>#include "sqlite3.h"int main(int argc,char *argv[]){    const char *sql_create_table="create table t(id int primary key,msg varchar(128))";    char

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

Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得)用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为.具体用途是:拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的

SQLite3 C语言 API使用记录

a #include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName){     int i;     for(i=0;i<argc;i++){         printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL&qu

LTP语言云API使用文档

简介 语言云新版API是REST风格的WEB API调用服务,REST API服务有诸多优点,这使得它越来越流行.应用于语言云服务中,主要有如下特点: 免SDK安装:REST API的调用无须用户下载SDK,使得语言分析更为便捷. 结果表示格式丰富:API提供了包括PLAIN/XML/JSON/CONLL等多种格式的结果表示.且返回结果容易扩展,便于进行二次开发. 支持JavaScript调用:语言云支持JavaScript以JSON-P回调的方式调用API,使得返回结果可以嵌入到Web页面或者

Atitit.跨语言反射api&#160;兼容性提升与增强&#160;java&#160;c#。Net&#160;&#160;php&#160;&#160;js

Atitit.跨语言反射api 兼容性提升与增强 java c#.Net  php  js 1. 什么是反射1 1.1.       反射提供的主要功能:2 1.2.       实现反射的过程:2 2. 类反射中所必须的类: 的类反射所需要的类并不多,它们分别是:Field.Constructor.Method.Class.Object,2 3. . 反射的用处3 3.1. 可视化 3 3.2. 系统的灵活性.可扩展性 3 3.3. Json xml序列化3 3.4. 函数指针3 3.5. R

操作系统和程序设计语言的API使用的字符编码分析

 1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确定并默认的. 我们可以通过java的Charset类的defaultCharset()方法来获取它默认的字符编码. 我安装的JDK是1.7,系统环境是64位,获取的默认的字符编码是utf16的,并且是Big-Endian(这点我比较奇怪,我的机器是Little-endian的,而虚拟机竟然默认是大端

VB调用API函数

API函数快速入门--怎样在VB中声明和使用API函数-- 一.在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的 General部分声明它: 声明的语法是: Private Declare Function ... Private Declare Sub..... 这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用. 如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中 声明了. 先添加

quick-cocos2d-x API函数汇总

quick-cocos2d-x API函数汇总 1.  init 在quick\framework\init.lua文件中. quick framework 初始化,载入 quickframework 预定义的常量.模块. 1.1             常量 在初始化框架之前,可以定义以下常量: ·        DEBUG: 设置框架的调试输出级别 ·         DEBUG = 0           -- 不输出任何调试信息(默认值) ·         DEBUG = 1     

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest &#160;attilax大总结.docx

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx 1. 为什么需要接口调用??1 1.1. 为了方便集成复用模块类库1 1.2. 嫁接不同的语言与类库,以及嵌入dsl1 1.3. 方便跨机器,跨开发板,跨硬件,跨运行环境的代码复用2 2. 接口api的历史2 2.1. 发展历程2 2.2. API 这个类库默认提供的接口,要求同语言调用一般2 2.3. Cli接口 命令行接口.单机跨语言接口(推荐比较常用)3 2.4. 图形用户