Linux平台上SQLite数据库教程(二)——C语言API介绍
来源:互联网 发布:golang vendor 编辑:程序博客网 时间:2024/06/07 00:31
前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c、sqlite3.h。源码地址:https://github.com/AnSwErYWJ/SQLite。
打开数据库
1.原型:
- 1
- 2
- 3
- 4
2.说明:
参数filename为指定打开的数据库, sqlite3的结构指针 *ppDB 为数据库连接句柄。如果数据库被成功打开(和/或 创建), 函数返回 SQLITE_OK;否则返回一个错误码, 可以通过* sqlite3_errmsg()* 查看错误原因.。出错,则只可能是 SQLite无法为 SQLite 对象分配内存空间, 此时将返回 NULL。
关闭数据库
1.原型:
- 1
- 2
- 3
2.说明:
该函数用来关闭 sqlite3 对象。返回 SQLITE_OK 表示对象被成功关闭,以及所有相关的资源被成功回收。应用程序必须在关闭之前 “完成(finalize)” 所有的 “预编译语句(prepared statements)”, 并且关闭所有的 “二进制句柄绑定(BLOB handle)”, 如果在关闭时还有未完成的预编译语句或二进制句柄, 那么函数返回 SQLITE_BUSY(5)。
错误处理
原型1:
- 1
- 2
- 3
说明1:
该函数返回与pDB数据库指针相关的错误信息,下次调用会覆盖。
原型2:
- 1
- 2
- 3
说明2:
该函数返回最近一次调用 sqlite3_ API时产生的错误码。
示例一:
- 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
- 37
示例一实现打开和关闭操作。
执行sql语句
原型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
当回调函数不为 NULL, 则它对每一个行查询结果都会调用该回调函数;如果没有回调函数被指定, sqlite3_exec() 只是简单地忽略查询结果。
如果回调函数返回非零,sqlite3_exec() 立即中断查询,并且不再执行后续的 SQL 语句,也不再调用回调函数,sqlite3_exec() 将返回 SQLITE_ABORT 结束执行。
当发生错误时, 执行将中断。如果 errmsg 参数不为空,错误信息将会被写入(errmsg 由 sqlite3_malloc() 分配内存空间,由sqlite3_free() 释放该内存空间)。如果 errmsg 参数不为 NULL, 并且没有错误发生, errmsg 被设置为 NULL。
通常情况下callback在select操作中会使用到,如果不需要回调函数。第三第四个参数设为NULL。
回调函数原型:
- 1
- 2
- 3
- 4
- 5
- 6
示例二
- 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
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
示例二执行使用回调函数的select语句。此外,还有不使用回调函数的select语句(使用sqlite3_get_table,此函数是sqlite3_exec的包装)。 不过个人感觉还是使用回调函数好,这样代码可看性强,更整洁。
sqlite3_get_table原型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
这里贴一段网上查到的不使用回调函数的select示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
示例三
- 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
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
示例三演示创建\删除表,数据的插入、更新与删除。
预编译操作
注意:sqlite3_exec中已经封装了预编译操作,直接使用即可,预编译操作只需稍作了解。
网上查了很多sqlite的预编译操作的例子,比较复杂,大致可以分为以下几个步骤:
1. 通过sqlite3_prepare创建一个sqlite3_stmt对象
2. 通过sqlite3_bind_*()绑定预编译字段的值
3. 通过sqlite3_step()执行SQL语句
4. 通过sqlite3_reset()重置预编译语句,重复操作2多次
5. 通过sqlite3_finalize()销毁资源
下面依次来看看这些函数。
sqlite3_prepare原型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
如果nbytes小于0, 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, 否则返回一个错误码。
sqlite3_bind_*有多种形式,分别对应不同的数据类型:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
预编译SQL语句中可以包含如下几种形式:
- 1
- 2
- 3
- 4
- 5
NNN代表数字,VVV代表字符串.
如果是?或者?NNN,那么可以直接sqlite3_bind_*()进行操作,如果是字符串,还需要通过sqlite3_bind_parameter_index()获取对应的index,然后再调用sqlite3_bind_*()操作。这通常用于构造不定条件的SQL语句(动态SQL语句)。
int sqlite3_step原型:
- 1
- 2
- 3
说明:
当一条语句被 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:不正确的库的使用. 该函数使用不当。
sqlite3_finalize原型:
- 1
- 2
- 3
说明:
该函数用来删除一条被预编译的 sql 语句。
预编译实现代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
总结
上文列出的是一些最基本精简的C语言API,sqlite为C语言一共提供了200多个API。不过,上述这些API对一般的开发者而言已经足够了,如果你还有更多的需求,那就请查阅前言中给出的源代码文件(sqlite3.c,sqlite3.h)。
- Linux平台上SQLite数据库教程(二)——C语言API介绍
- Linux平台上SQLite数据库教程(二)——C语言API介绍
- Linux平台上SQLite数据库教程(二)——C语言API介绍
- Linux平台上SQLite数据库教程(一)——终端使用篇
- Linux平台上SQLite数据库教程(一)——终端使用篇
- Linux平台上SQLite数据库教程(一)——终端使用篇
- SQLite学习3_Linux平台上SQLite数据库教程(一)——终端使用篇
- sqlite-C语言API介绍
- Sqlite数据库在各种平台下的C语言应用程序开发(windows,linux,arm-linux)
- C API--linux上c语言读取数据库内容(mysql)
- Linux C语言操作SQLite数据库
- SQlite数据库的C编程接口(二) 数据库连接 ——《Using SQlite》读书笔记
- SQlite数据库的C编程接口(二) 数据库连接 ——《Using SQlite》读书笔记
- SQlite数据库的C编程接口(二) 数据库连接 ——《Using SQlite》读书笔记
- hjr教程-Android(二):Sqlite数据库
- hjr教程-Android(二):Sqlite数据库
- Android SQLite数据库—SQLiteOpenHelper(二)
- 在ARM-Linux平台上移植SQLite(上)
- 1041. 考试座位号(15)
- 数据结构实验之栈八:栈的基本操作
- 在云上打包你的snap应用
- 在Windows 10系统下安装Oracle 11g数据库
- 什么是绝对URL、相对URL
- Linux平台上SQLite数据库教程(二)——C语言API介绍
- Ubuntu在命令行下将默认语言改为英语
- C primer plus(编程练习)file-9.11-1
- poj2251 Dungeon Master
- CentOS 6.5安装MySQL中文乱码问题解决
- 数组基础知识1
- 【BZOJ】1041: [HAOI2008]圆上的整点
- ubuntu安装和查看已安装
- uva11997