sqlite3接口函数(C/C++)
核心
Sqlite3接口的核心元素:两个对象 和 八个函数
一、两个对象
1.数据库连接对象
sqlite3 :the database connection object 数据库连接对象,
数据库的连接句柄/数据库的文件描述符,sqlite3 代表所打开的那个 sqlite3 的数据库文件,后序对该数据库的操作都需要用到这个对象。
2.SQL语句对象
sqlite3_stmt :the prepared statment object SQL语句对象,
去操作关系型数据库都是通过SQL语句来实现的
sqlite3_stmt这个结构体用来描述一个SQL语句对象,我们的应用都是用SQL语句对象去发送SQL指令给数据库管理系统
二、八个函数
1. sqlite3_open:打开或创建数据库
sqlite3_open:打开或创建一个sqlite3数据库,返回一个sqlite3的数据库连接对象
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
filename:要打开的sqlite3的数据库的路径名
ppDb: 二级指针 ,用来保存打开的数据库连接对象的
返回值:
成功返回SQLITE_OK(0),失败返回其他值
2. sqlite3_close :关闭
sqlite3_close:关闭一个sqlite3的数据库连接对象
int sqlite3_close ( sqlite3* );
返回值:
成功返回SQLITE_OK(0),失败返回其他值
3. sqlite3_prepare_v2 :创建SQL语句对象
3.1、sqlite3_prepare_v2 :编译SQL语句,并创建一个SQL语句对象
int sqlite3_prepare_v2(
sqlite3 *db, /* 数据库连接对象,表示要操作哪个数据库 */
const char *zSql, /*指向原始的SQL语句(要编译的SQL语句,多条SQL语句用;隔开)可以包含变量名*/
int nByte, /* 指示要编译SQL语句到哪个位置
<0 :编译SQL语句到第一个\0结束
=0 :什么都不编译
>0 :编译SQL语句到前面n个字节 */
sqlite3_stmt **ppStmt, /* ppStmt 用来保存编译好的SQL语句对象 */
const char **pzTail /* 如果不为NULL,则pzTail指向的SQL语句中第一条完整SQL语句后面的一个字符 */
);
返回值:
成功返回SQLITE_OK(0)失败返回其他值
3.2、zSql指向的原始字符串语句:
(1)不带参数(变量)
"create table t_school(
id int primary key,
name text not null,
tel text,addr text);
insert into t_school values(1001,'gec','123456','changsha');"
(2)包括参数
编译的SQL语句中可以包含“变量/参数”,其值可以在运行期间改变,但是SQL语句对象不需要重新编译,通过特定的参数接口来制定这些SQL变量的值
char *sql = "insert into stu (id,name,score)values(变量名,变量名,变量名);";
有如下方式来指定变量名:
(1)?NNN
NNN 必须是一个 1 ~ SQLITE_MAX_NUM
: AAA 命名参数,参数名AAA,AAA就是你取的一个变量的名字
@ AAA 命名参数,参数名AAA,AAA就是你取的一个变量的名字
$ AAA 命名参数,参数名AAA,AAA就是你取的一个变量的名字
4. sqlite3_bind_* :绑定参数
sqlite3_bind_* :给SQL语句对象绑定参数 ==》 一系列的绑定参数
4.1、给SQL语句对象的参数赋值
获取参数的索引,因为所有的绑定参数的函数,都是通过索引去指定参数
sqlite3_bind_parameter_index:用来获取zName参数名在语句对象中的索引
int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
返回值:
成功返回索引值(>0),假如没有匹配到参数名,返回0
4.2、给参数赋值
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
这些绑定函数的参数是:
第一个参数:SQL语句对象
第二个参数:要绑定的变量在SQL语句中的索引
第三个参数:要绑定的值
sqlite3_bind_text(sqlite3_stmt*, int, const char*str, int n, void(*p)(void*));
/* str:指定字符串
n :字符串的长度
p:函数指针
函数指针用来释放字符串的空间的
如果字符串不需要释放直接给NULL */
返回值:
成功返回SQLITE_OK(0),失败返回其他值
5. sqlite3_step:执行
sqlite3_step :执行编译好的SQL语句对象
int sqlite3_step(sqlite3_stmt*ppStmt);
// ppStmt:指向要执行的SQL语句对象
返回值:
SQLITE_BUSY :没获取到锁,语句没有执行
SQLITE_DONE :SQL语句执行完成
SQLITE_ERROR :出错
SQLITE_MISUSE:使用方法不当
SQLITE_ROW: 当SQL语句为 select 时候,执行后,结果是一个表,它是一行一行返回的,调用一次 sqlite3_step 就会返回一行,SQLITE_ROW就表示有返回结果,一直到返回值 SQLITE_DONE
查询结果:
select语句,他返回的是一个结果集,需要用到额外的一些函数接口去获取这些结果集中记录
// 返回select结果中有多少列
int sqlite3_column_count(sqlite3_stmt*ppStmt);
// 返回select结果中第i列的数据类型
int sqlite3_column_type(sqlite3_stmt*ppStmt, int iCol);
/* 返回值:
SQLITE_INTEGER:整型
SQLITE_FLOAT :浮点
SQLITE_TEXT :文本
SQLITE_BLOB :二进制
SQLITE_NULL :空类型 */
// 获取结果集中当前行中的第i列的值
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
// 返回结果集中第i列的名字
const char *sqlite3_column_name(sqlite3_stmt*, int iCol);
6. sqlite3_reset :复位
sqlite3_reset:用来复位SQL语句对象,以便下一轮的参数的绑定
7. sqlite3_finalize :销毁
sqlite3_finalize:用来销毁一个SQL语句对象
int sqlite3_finalize(sqlite3_stmt*ppStmt);
8. sqlite3_exec :一步到位
sqlite3_exec :一步到位,其实是这三个函数的组合:
sqlite3_prepare_v2 :创建一个SQL语句对象
sqlite3_step :执行SQL语句对象
sqlite3_finalize :用来销毁一个SQL语句对象
int sqlite3_exec(
sqlite3*, /* 指向数据库连接对象 */
const char *sql, /* 要执行的SQL语句,不带参数
可以执行多条SQL语句,以;分开*/
int (*callback)(void*,int,char**,char**), /* 回调函数 */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
第三个参数:回调函数
一般在SQL语句为 select 语句时,需要回调,因为select语句需要返回结果。select 每查询一条语句的时候,就会调用一次该回调函数。
int callback(void*arg,int n,char*column_value[],char*column_names[]);
/* arg:用户指定
n :结果行中有多少列
column_value:每一列的值(所有的值都是char* 字符串)
column_names:每一列的列名 */
返回值:
成功返回0,失败返回其他值,回调函数执行失败(返回非0),sqlite3_exec 就不会继续往下执行
只有SQL语句为 select 语句才会使用回调函数,其他语句时,可以NULL
.