欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析SQLite3核心函数与操作技巧

时间:10-29 神话故事 提交错误

大家好,今天来为大家分享深入解析SQLite3核心函数与操作技巧的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

sqlite3_open()

sqlite3_prepare()

sqlite3_step()

sqlite3_column()

sqlite3_finalize()

sqlite3_close()

这些过程是概念性术语,并不完全是程序运行的过程。例如,sqlite3_column() 表示查询列以获取行中数据的每个操作的统称。事实上sqlite中不存在这个功能。

1. sqlite3_open():打开数据库

在操作数据库之前,必须先打开数据库。该函数打开一个到sqlite 数据库文件的连接并返回一个数据库连接对象。该操作是程序中调用的第一个SQLite函数,也是其他SQLite API的先决条件。许多SQLite 接口函数需要一个指向数据库连接对象的指针作为其第一个参数。

函数定义

int sqlite3_open(

const char *filename, /* 数据库文件名(UTF-8) */

sqlite3 **ppDb /* OUT: SQLite 数据库句柄*/

);

int sqlite3_open16(

const void *filename, /* 数据库文件名(UTF-16) */

sqlite3 **ppDb /* OUT: SQLite 数据库句柄*/

);

int sqlite3_open_v2(

const char *filename, /* 数据库文件名(UTF-8) */

sqlite3 **ppDb, /* OUT: SQLite 数据库句柄*/

int flags, /* 标志*/

const char *zVfs /* 要使用的VFS 模块的名称*/

);

阐明:

如果要打开的数据文件不存在,则会创建一个同名的数据库文件。如果使用sqlite3_open和sqlite3_open_v2,数据库将使用UTF-8编码,而sqlite3_open16将使用UTF-16编码。

返回值:

如果sqlite数据库成功打开(或创建),则返回SQLITE_OK,否则返回错误码。 sqlite3_errmsg()或sqlite3_errmsg16可用于获取数据库打开错误代码的英文描述。这两个函数定义为:

const char *sqlite3_errmsg(sqlite3*);

const void *sqlite3_errmsg16(sqlite3*);

无论数据库是否成功打开,都应该使用sqlite3_close()关闭数据库连接。

参数说明:

filename:需要打开的数据库文件的文件名。在sqlite3_open和sqlite3_open_v2中,该参数使用UTF-8编码,而在sqlite3_open16中,它使用UTF-16编码。

ppDb:即使发生错误,也会将数据库连接句柄返回给此参数。唯一的例外是,如果SQLite 无法分配内存来存储SQLite 对象,则ppDb 将返回NULL 值。

flags:作为数据库连接的附加控制参数,可以是SQLITE_OPEN_READONLY、SQLITE_OPEN_READWRITE 和SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE 之一。用于控制数据库的打开方式。它可以与SQLITE_OPEN_NOMUTEX、SQLITE_OPEN_FULLMUTEX、SQLITE_OPEN_SHAREDCACHE 和SQLITE_OPEN_PRIVATECACHE 结合使用。具体情况是OK 查看文档

2 SQLite3_prepare()

该函数将SQL 文本转换为准备好的语句对象并返回指向该对象的指针。该接口需要一个数据库连接指针和一个包含要准备的SQL语句的文本。它并不实际执行(评估)SQL 语句,它只是准备执行SQL 语句

函数定义(仅列出UTF-8的)

int sqlite3_prepare(

sqlite3 *db, /* 数据库句柄*//* 数据库句柄成功打开*/

const char *zSql, /* SQL 语句,UTF-8 编码*//* UTF8 编码的SQL 语句*/

int nByte, /* zSql 的最大长度(以字节为单位)。 *//* 参数sql的字节数,包括"" */

sqlite3_stmt **ppStmt, /* OUT: 语句句柄*//* 输出: 预编译语句句柄*/

const char **pzTail /* OUT: 指向zSql 未使用部分的指针*//* 输出: 指向sql 语句未使用部分*/

);

int sqlite3_prepare_v2(

sqlite3 *db, /* 数据库句柄*/

const char *zSql, /* SQL语句,UTF-8编码*/

int nByte, /* zSql 的最大长度(以字节为单位)。 */

sqlite3_stmt **ppStmt, /* OUT: 语句句柄*/

const char **pzTail /* OUT: 指向zSql 未使用部分的指针*/

);

范围:

db:数据指针

zSql:sql语句,使用UTF-8编码

nByte:如果nByte小于0,则函数取出zSql中从开头到第一个0终止符的内容;如果nByte不为负,则它是该函数可以从zSql读取的最大字节数。如果nBytes 为非负数,则zSql 在第一次遇到"/000/或"u000" 时终止。如果用户知道传入的sql语句以""结尾,那么更好的做法是:将nbytes的值设置为字符串的长度(包括"")。这可以防止SQLite 复制字符串并提高程序效率。

pzTail:如上所述,zSql在遇到终止符或达到设定的nByte后结束。如果zSql有剩余内容,则剩余内容存储在pZTail中,不包括终止符。如果pszTail不为NULL,则*pszTail指向sql中第一个传递的SQL语句的末尾。该函数只编译sql的第一条语句,因此*pszTail指向的内容不会被编译。

ppStmt:指向可使用sqlite3_step() 执行的已编译准备语句的指针。如果发生错误,则将其设置为NULL,例如如果输入文本不包含sql 语句。调用进程必须负责在使用完编译后的sql语句后使用sqlite3_finalize()删除它。

阐明

如果执行成功,则返回SQLITE_OK,否则返回错误码。建议在任何当前程序中使用sqlite3_prepare_v2 函数。 sqlite3_prepare 仅用于向前兼容。

评论

1 准备好的语句对象

typedef 结构sqlite3_stmt sqlite3_stmt;

准备好的语句对象表示简单SQL 语句对象的实例。该对象通常称为“准备好的语句”或“编译的SQL 语句”或简称为“语句”。

Statement对象的生命周期经历这样的过程:

l 使用sqlite3_prepare_v2或相关函数创建该对象

l 使用sqlite3_bind_*()将值绑定到主机参数

l 通过调用sqlite3_step一次或多次执行该sql

l 使用sqlite3——reset()重置该语句,然后返回步骤2。重复此过程0次或多次。

l 使用sqlite3_finalize()销毁这个对象

sqlite3_stmt结构体的具体内容在sqlite.h中没有定义。它只是一个抽象类型。使用时一般是用它的指针来进行操作。 sqlite3_stmt类型的指针实际上是一个指向Vdbe的结构体指针。

2主机参数

在传递给sqlite3_prepare_v2() 或其变量的sql 语句文本中,满足以下模板的文本将被替换为参数:

我?

l ?NNN,NNN代表一个数字

l :VVV,VVV代表字符

我@VVV

l$VVV

上述模板中,NNN代表数字,VVV代表字母数字标记(例如:222代表名为222的标记),sql语句中的参数(变量)是通过上述模板指定的,如

“select ? from ?”该语句指定了两个参数。 sqlite语句中第一个参数的索引值为1。这意味着该语句中两个参数的索引分别为1和2。使用“?”会自动给出一个索引值,使用“?NNN”可以自己指定参数的索引值,表示该参数的索引值为NNN。 “:VVV”代表一个名为“VVV”的参数,它也有一个索引值,并且是自动分配的。

例子:

INSERTINTOpeople(id,name)VALUES(?);

INSERTINTOpeople(id, id2,name)VALUES(?1,1.2);功能:可以绑定多个具有相同值的变量

INSERTINTOpeople(id,name)VALUES(:id,name);

INSERTINTOpeople(id,name)VALUES(@id,@name);

INSERTINTOpeople(id,name)VALUES($id,$name);用于支持Tcl变量的扩展语法。除非使用Tcl编程,否则建议使用“:”版本。

您可以使用sqlite3_bind_*() 将值绑定到这些参数

3.

int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n,void(*)(void*));

sqlite3_bind_*系列函数有很多。这里我们只解释sqlite3_bind_text。 sqlite3_bind_text的第二个参数是序列号(从1开始),第三个参数是字符串值,第四个参数是字符串长度。 sqlite3_bind_text的第五个参数是函数指针。 SQLITE3完成操作后回调该函数。通常用于释放字符串占用的内存。该参数有两个常量。 SQLITE_STATIC告诉sqlite3_bind_text函数该字符串是一个常量,可以放心使用; SQLITE_TRANSIENT 将导致sqlite3_bind_text 函数复制该字符串。一般这两个常量参数是用来调整sqlite3_bind_text的。准备好语句后,将执行操作。

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

函数:将数据绑定到查询结构

PARAM1(IN): 查询结构

PARAM2(IN): 绑定了哪些数据(sql语句中的哪个问号(?))

PARAM3(IN): 二进制数据指针

PARAM4(IN): 二进制数据长度

PARAM5(IN): 销毁回调函数,通常设置为NULL,完成后释放

返回值:SQLITE_OK 成功。

注意,绑定函数必须在sqlite3_step之前、sqlite3_prepare或sqlite3_reset之后调用。

未绑定的参数默认为NULL。类似的绑定函数如下:

int sqlite3_bind_double(sqlite3_stmt*, int, double);

int sqlite3_bind_int(sqlite3_stmt*, int, int);

int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite_int64);

int sqlite3_bind_null(sqlite3_stmt*, int);

int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));

int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));

int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);

4.sqlite3_step()

该进程用于执行先前由sqlite3_prepare 创建的准备语句。执行该语句直到第一行结果可用。要继续查看第二行结果,只需再次调用sqlite3_setp() 即可。继续调用sqlite3_setp(),直到该语句完成。对于不返回结果的语句(例如INSERT、UPDATE 或DELETE),sqlite3_step() 仅执行一次并返回。

函数定义

int sqlite3_step(sqlite3_stmt*);

返回值

该函数的返回值基于用于创建sqlite3_stmt 参数的函数。如果使用旧版本的接口sqlite3_prepare() 和sqlite3_prepare16(),则返回值将为SQLITE_BUSY、SQLITE_DONE、SQLITE_ROW、SQLITE_ERROR 或SQLITE_MISUSE,而v2 版本的接口sqlite3_prepare_v2() 和sqlite3_prepare16_v2() 将返回这些结果同时显示代码和扩展结果代码。

对于所有V3.6.23.1及其之前的所有版本,需要在sqlite3_step()之后、后续sqlite3_step之前调用sqlite3_reset()。如果调用sqlite3_reset重置prepared语句失败,sqlite3_step将返回SQLITE_MISUSE,但在V3之后。 6.23.1,sqlite3_step()会自动调用sqlite3_reset。

描述:

当sqlite3_prepare()或其相关函数准备一条语句时,必须调用sqlite3_step()一次或多次来评估准备好的语句。

该函数的详细行为取决于sqlite3_prepare() (或其相关函数)生成哪种类型的准备好的语句。

该函数将返回以下结果之一来标识其执行结果:

SQLITE_BUSY: 忙。数据库引擎无法锁定数据以完成其工作。但可以尝试多次。

SQLITE_DONE: 已完成。 sql语句已成功执行。在调用sqlite_reset() 之前,不应由sqlite3_step() 再次调用当前准备好的语句。

SQLITE_ROW: 查询生成结果。这时可以通过相关的‘列访问函数’来获取数据。再次调用sqlite3_step() 将获得下一个查询结果。

SQLITE_ERROR: 发生错误。此时可以通过sqlite3_ermmsg()获取相关错误信息。 sqlite3_step() 无法再次调用。

SQLITE_MISUSE: 库使用不正确。该功能使用不当。

其他:

预编译的使用将在后续函数介绍中详细讲解。

5.intsqlite3_reset(sqlite3_stmt *pStmt);

sqlite3_reset 用于将准备好的语句对象重置为其初始状态,然后准备重新执行。所有SQL 语句变量都使用sqlite3_bind* 绑定值,并使用sqlite3_clear_bindings 重置这些绑定。 Sqlite3_reset 接口将准备好的语句重置为其代码的开头。 sqlite3_reset不会改变prepared语句上的任何绑定值,所以这里的猜测是语句执行过程中可能发生了其他变化,然后这条语句将其重置为绑定值被绑定时的状态。

它的返回值比较特殊。返回SQLITE_BUSY表示操作暂时无法执行,SQLITE_DONE表示操作完成,SQLITE_ROW表示执行完成有返回(执行select语句时)。当返回值为SQLITE_ROW时,我们需要对查询结果进行处理。 SQLITE3提供了sqlite3_column_*系列函数。

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

参数iCol为列号,从0开始。如果返回值有多行,可以再次调用sqlite3_step函数,然后sqlite3_column_*函数获取返回值。利用以上函数,就可以基本完成对SQLITE3数据库的操作了(不过我这里只讲解文本数据类型)。

6. sqlite3_column()

此过程返回通过在准备好的语句上执行sqlite3_step() 获得的结果集的当前行中的一列。 sqlite3_step每次获取结果集中的一列并停止时,可以多次调用该过程来查询该行中每一列的值。列操作的函数有多个,均以sqlite3_column 为前缀

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);

双sqlite3_column_double(sqlite3_stmt*, int iCol);

int sqlite3_column_int(sqlite3_stmt*, int iCol);

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);

int sqlite3_column_type(sqlite3_stmt*, int iCol);

int sqlite3_column_numeric_type(sqlite3_stmt*, int iCol);

sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);

阐明

第一个参数是指向从sqlite3_prepare 返回的准备好的语句对象的指针,第二个参数指定要返回的该行中的列的索引。最左边一列的索引号为0,可以使用sqlite3_colum_count()获得该行的列数。

这些过程会根据情况转换值的类型。 SQLite 内部使用sqlite3_snprintf() 自动执行此转换。下面是详细的换算表:

内部型

请求类型

转变

无效的

整数

结果是0

无效的

漂浮

结果是0.0

无效的

文本

结果为空

无效的

BLOB

结果为空

整数

漂浮

从整数转换为浮点数

整数

文本

异型ASCII码显示

整数

BLOB

与上面相同

漂浮

整数

将浮点数转换为整数

漂浮

文本

浮点类型的ASCII显示

漂浮

BLOB

与上面相同

文本

整数

使用atoi()

文本

漂浮

使用atof()

文本

BLOB

没有转换

BLOB

整数

先转到TEXT,然后使用atoi

BLOB

漂浮

先转到TEXT,然后使用atof

BLOB

文本

如果需要,添加零终止符

注意:BLOB 数据类型是指二进制数据块。例如,如果要在数据库中存储一张图片,则该图片将以二进制形式存储。 SQLite中对应的数据类型是BLOB。

int sqlite3_column_bytes(sqlite3_stmt*, int iCol)int sqlite3_column_bytes16(sqlite3_stmt*, int iCol) 这两个函数返回相应列内容的字节数。这个字节数不包括后续类型转换过程中添加的0终止符。

以下是一些最安全、最简单的策略

首先是sqlite3_column_text(),然后是sqlite3_column_bytes()

首先是sqlite3_column_blob(),然后是sqlite3_column_bytes()

首先是sqlite3_column_text16(),然后是sqlite3_column_bytes16()

(1)

获取数据行中某一列的数据

sqlite3_column_xxx(sqlite3_stmt*, int iCol);

sqlite3_step返回SQLITE_ROW后,用它来获取iCol列的数据。

其中,xxx代表:

blob:指向保存数据的内存的指针

bytes, bytes16: 获取blob类型数据的大小,或者从文本转换为UTF8/UTF16的字符串长度。

double、int、int64:数值

text,text16:字符串指针

type: 该列的数据类型(SQLITE_INTEGER、SQLITE_FLOAT、SQLITE_TEXT、SQLITE_BLOB、SQLITE_NULL)

注意:如果该列使用与该列本身类型不同的数据读取方式,则获取的值为转换后的结果。

(2)

获取数据行中某列的数据类型

int sqlite3_column_type(sqlite3_stmt*, int iCol);

返回值:SQLITE_INTEGER、SQLITE_FLOAT、SQLITE_TEXT、SQLITE_BLOB、SQLITE_NULL

使用的方法与sqlite3_column_xxx()函数类似。

(3)

int sqlite3_column_count(sqlite3_stmt *pStmt);

函数: 获取列号

如果过程没有返回值,比如update,就会返回0

const char *sqlite3_column_name(sqlite3_stmt*,int);

函数: 获取列名

const char *sqlite3_column_dec

ltype(sqlite3_stmt *, int i); 功能:返回列数据类型 类似: 得到当前行中包含的数据个数 int sqlite3_data_count(sqlite3_stmt *pStmt); 如果sqlite3_step返回SQLITE_ROW,可以得到列数,否则为零。 7.intsqlite3_reset(sqlite3_stmt *pStmt); 功能:重置所有绑定的值,回到刚刚调用sqlite3_prepare后的状态 8.sqlite3_finalize int sqlite3_finalize(sqlite3_stmt *pStmt); 这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。 在空指针上调用这个函数没有什么影响,同时可以准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用sqlite_reset之后,或者在sqlite3_step任何调用之后不管语句是否完成执行 示例: sqlite3_finalize(pStmt); pStmt = NULL; 9.sqlite3_close 这个过程关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放 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; } 10.intsqlite3_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) 11.intsqlite3_errcode( sqlite3* pDB    /* SQLite3 数据库句柄 */ ); 说明: 该函数返回最近一次调用 sqlite3_ API时产生的错误码. 示例: int errcode = sqlite3_errcode(pDB); 12.const char *sqlite3_errmsg( sqlite3* pDB    /* SQLite3 数据库句柄 */ ); 说明: 该函数返回与pDB数据库指针相关的错误信息, 由英语书写. 用户不必考虑内存的释放, 其由SQLite内部管理, 它也将会在下产次调用函数时被覆盖. 示例: printf("%sn", sqlite3_errmsg(pDB)); 13. int sqlite3_key( sqlite3 *db,                   /* Database to be rekeyed */ const void *pKey, int nKey     /* The key */ ); 功能:为加密的数据库指定密码,改函数在sqlite3_open之后调用 14. int sqlite3_rekey( sqlite3 *db,                   /* Database to be rekeyed */ const void *pKey, int nKey     /* The new key */ ); 功能:重设数据库密码,如果pKey = 0 或者 nKey = 0,这数据库不加密

15. int sqlite3_get_table( sqlite3*,               /* An open database */ const char *sql,       /* SQL to be executed */ char ***resultp,       /* Result written to a char *[]  that this points to */ int *nrow,             /* Number of result rows written here */ int *ncolumn,          /* Number of result columns written here */ char **errmsg          /* Error msg written here */ ); 功能:查询表 PARAM1(IN):数据库句柄 PARAM2(IN):sql语句,以结尾. PARAM3(OUT):查询结果 PARAM4(OUT):返回行数(多少条数据) PARAM5(OUT):返回列数(多少字段) PARAM6(OUT):返回错误信息 返回值:SQLITE_OK成功,房子失败见错误信息 16. void sqlite3_free_table(char **result); 功能:释放通过sqlite3_get_table查询保存的结果数据 PARAM1(IN):要释放的数据指针 17.intsqlite3_create_function( sqlite3 *, const char *zFunctionName, int nArg, int eTextRep, void*, void (*xFunc)(sqlite3_context*,int,sqlite3_value**), void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*) ); 功能: const void *sqlite3_value_blob(sqlite3_value*); int sqlite3_value_bytes(sqlite3_value*); int sqlite3_value_bytes16(sqlite3_value*); double sqlite3_value_double(sqlite3_value*); int sqlite3_value_int(sqlite3_value*); sqlite_int64 sqlite3_value_int64(sqlite3_value*); const unsigned char *sqlite3_value_text(sqlite3_value*); const void *sqlite3_value_text16(sqlite3_value*); const void *sqlite3_value_text16le(sqlite3_value*); const void *sqlite3_value_text16be(sqlite3_value*); int sqlite3_value_type(sqlite3_value*); int sqlite3_value_numeric_type(sqlite3_value*); 功能:类似sqlite3_column_*函数 其他: const char *sqlite3_libversion(void); int sqlite3_libversion_number(void); 功能:获取版本号 sqlite_int64 sqlite3_last_insert_rowid(sqlite3*); 功能:获取最后插入的行标示. int sqlite3_changes(sqlite3*); 功能:获取最近执行的sqlite3_exec影响的行数. int sqlite3_total_changes(sqlite3*); 功能:获取自从数据库打开后有改动的函数 void sqlite3_interrupt(sqlite3*); 功能:打断或停止数据库当前操作. int sqlite3_complete(const char *sql); 功能:判断语句是否以分号(;)结尾 int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); 功能:设置查询忙碌时的回调处理 说明:缺省的回调函数为空,如果回调函数为空,表锁定后sqlite3_exec()执行会直接返回SQLITE_BUSY int sqlite3_busy_timeout(sqlite3*, int ms); 功能:设置查询超时时间(毫秒) char *sqlite3_mprintf(const char*,...); char *sqlite3_vmprintf(const char*, va_list); char *sqlite3_snprintf(int,char*,const char*, ...); 功能:格式化字符,需要用%q来代替%s.(主要是不用对分号"进行转义) void *sqlite3_malloc(int); void *sqlite3_realloc(void*, int); void sqlite3_free(void*); 功能:内存函数 int sqlite3_set_authorizer( sqlite3*, int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), void *pUserData ); 功能:设置数据库授权 void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); void *sqlite3_profile(sqlite3*, void(*xProfile)(void*,const char*,sqlite_uint64), void*); void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); 功能:设置执行回调函数,sqlite3_exec(),sqlite3_step() ,sqlite3_get_table()时会调用 void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); 功能:设置事务回调函数 int sqlite3_errcode(sqlite3 *db); const char *sqlite3_errmsg(sqlite3*); 功能:获取错误码和错误消息 int sqlite3_bind_parameter_count(sqlite3_stmt*); 功能:返回需要绑定的参数数目(sql语句中问号?数量) const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); 功能:获取绑定参数名字,?参数返回NULL int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); 功能:获取绑定参数索引 int sqlite3_clear_bindings(sqlite3_stmt*); 功能:清除绑定的参数 参考代码: #include #include "sqlite3.h" int main(){ sqlite3 *db; char *zErrMsg = NULL; int rv; char szSql[128] = { 0 }; sqlite3_stmt *stmt; rv = sqlite3_open("test.db", &db); if(rv){ fprintf(stderr, "Can"t open database: %sn", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } else fprintf(stderr,"sqlite3_open OKn"); //这里查询时,假定数据库中存在表test,并且有一列为COL1(text类型) strcpy(szSql,"SELECT COL1 FROM test where COL1=?"); rv = sqlite3_prepare(db, szSql, 128, &stmt, NULL); if( rv != SQLITE_OK ) { fprintf(stderr, "sqlite3_prepare(%d): %sn", rv, sqlite3_errmsg(db)); return -1; } rv = sqlite3_bind_text(stmt, 1, "VALUE1", strlen("VALUE1"), SQLITE_STATIC); if( rv != SQLITE_OK ) { fprintf(stderr, "sqlite3_bind_text(%d): %sn", rv, sqlite3_errmsg(db)); return -1; } rv = sqlite3_step(stmt); if( (rv != SQLITE_OK) && (rv != SQLITE_DONE) && (rv != SQLITE_ROW) ) { fprintf(stderr, "sqlite3_step(%d): %sn", rv, sqlite3_errmsg(db)); return -1; } while( rv == SQLITE_ROW ){ fprintf(stderr, "result: %sn", sqlite3_column_text(stmt,0)); rv = sqlite3_step(stmt); } rv = sqlite3_finalize(stmt); if( rv != SQLITE_OK ) { fprintf(stderr, "sqlite3_finalize(%d): %sn", rv, sqlite3_errmsg(db)); return -1; } sqlite3_close(db); return 0; } #include "stdafx.h" #include "sqlite3.h" staticintcallback(void*NotUsed,intargc,char**argv,char**azColName) { inti; for(i=0; i printf("%s = %s/n", azColName[i], argv[i] ? argv[i] :"NULL"); } printf("/n"); return0; } #define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK) / {printf("%s error!/n",szInfo);/ printf("%s/n",szErrMsg);    / sqlite3_free(szErrMsg);         / sqlite3_close(db);              / return0;} int_tmain(intargc, _TCHAR* argv[]) { sqlite3 *db; char*dbPath="f:/test.db"; char*szErrMsg = 0; intrc= sqlite3_open(dbPath, &db); CHECK_RC(rc,"open database",db); char*szSql="create table UserInfo(ID int primary key , UserName char, PassWord char);"; rc=sqlite3_exec(db,szSql,0,0,&szErrMsg); CHECK_RC(rc,"create table",szErrMsg,db); rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(1,"kfqcome","123456")",0,0,&szErrMsg); CHECK_RC(rc,"insert info",szErrMsg,db); rc=sqlite3_exec(db,"insert into UserInfo(ID,UserName,PassWord) values(2,"miss wang","654321")",0,0,&szErrMsg); CHECK_RC(rc,"insert info",szErrMsg,db); szSql="select * from UserInfo"; rc = sqlite3_exec(db,szSql, callback, 0, &szErrMsg); CHECK_RC(rc,"query values",szErrMsg,db); sqlite3_close(db); getchar(); return0; } 输出的结果: ID = 1 UserName = kfqcome PassWord = 123456 ID = 2 UserName = miss wang PassWord = 654321 有参数的SQLite3处理过程 1、打开数据库sqlite3_open。 2、预处理SQL语句sqlite3_prepare_v2。 3、绑定参数sqlite3_bind_text。 4、执行语句sqlite3_step(statement) 。

用户评论

屌国女农

我一直想学习 SQLite,这个帖子讲解函数太棒了!

    有17位网友表示赞同!

千城暮雪

终于找到一篇详细解释 SQLite 函数的文章!我之前一直对这些函数很疑惑。

    有20位网友表示赞同!

青墨断笺み

好贴,对我现在正在开发的应用程序很有用。

    有9位网友表示赞同!

执念,爱

看标题就知道这篇文章一定很专业,值得一读。

    有20位网友表示赞同!

日久见人心

学习数据库函数太难了,希望能通过这篇帖子了解一些知识点。

    有15位网友表示赞同!

蝶恋花╮

SQLite 的函数功能确实强大,想要全面掌握它需要深入学习。

    有9位网友表示赞同!

夏至离别

函数是程序开发的宝藏,理解 SQLlite 函数可以让我写出更强大的代码。

    有5位网友表示赞同!

看我发功喷飞你

这篇文章能帮助我更好地理解 SQLite 过程中的函数使用吗?

    有18位网友表示赞同!

毒舌妖后

我之前没接触过 SQLite3,这篇帖子正好可以帮我入门。

    有6位网友表示赞同!

来瓶年的冰泉

希望文中能够详细讲解一些常用的函数和用法,这样更方便学习。

    有19位网友表示赞同!

等量代换

写这篇文章的人一定是 SQLite 的高手!我很想看他们是如何解释这些函数的

    有18位网友表示赞同!

有恃无恐

终于找到解决我数据库问题的关键!

    有12位网友表示赞同!

最迷人的危险

SQLite3 是一个很棒的工具,有了这篇帖子可以帮助我更好地使用它。

    有20位网友表示赞同!

(り。薆情海

希望这篇文章能够提供一些实用的例子,以便更直观地理解函数用法

    有8位网友表示赞同!

醉红颜

我之前在开发项目时遇到了一些 SQLite 函数的问题,希望能通过这篇文章找到解决方法

    有20位网友表示赞同!

厌归人

学习数据库技能总是有挑战性,期待这篇文章能带给我新的知识!

    有6位网友表示赞同!

寒山远黛

如果能够结合一些代码示例讲解函数用法就更好了!

    有5位网友表示赞同!

别在我面前犯贱

太感谢作者了!希望更多人看到这篇文章,解开 SQLite 函数的迷雾

    有5位网友表示赞同!

【深入解析SQLite3核心函数与操作技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活