sqlite3 c/c++ 接口:
sqlite3 接口的核心元素
两个对象
八大函数
两个对象:
sqlite3 :the database connection object 数据库连接对象
数据库连接句柄/数据库文件描述符
sqlite3 代表着你所打开的那个sqlite3的数据库文件,后序对这个数据库文件
进行操作都需要用到这个对象
sqlite3_stmt :the prepared statemet object SQL语句对象
八大函数:
sqlite3_open :打开或创建一个sqlite3数据库,返回一个sqlite3数据库连接对象
sqlite3_close :关闭一个sqlite3数据库
sqlite3_prepare_v2 :创建一个SQL语句对象
sqlite3_bind_* :给语句对象绑定参数的函数
sqlite3_step :执行SQL语句对象
sqlite3_column :分析一行中的列
sqlite3_reset :用来复位SQL语句对象,以便下一轮的参数绑定
sqlite3_finalize:销毁一个语句对象
sqlite3_exec:
sqlite3_prepare_v2
sqlite3_step
sqlite3_finalize
三个函数的合成
-
具体的API函数解析
(1)打开一个sqlite3数据库
在sqlite3数据库管理系统中,用结构体 sqlite3来表示一个已经打开的数据库对象int sqlite3_open( const char *filename, sqlite3 **ppDb);
filename:要打开的数据库的路径名
ppDb:二级指针,用来保存打开的数据库连接对象返回值: 成功返回 SQLITE_OK 失败返回其他值
(2) 关闭一个sqlite3数据库
int sqlite3_close(sqlite3*ppDb);
ppDb:要关闭的数据库连接对象
返回值:
成功返回 SQLITE_OK
失败返回其他值(3)sql语句对象
用sqlite3_stmt结构体来描述一个SQL语句对象
我们的应用都是通过 SQL语句对象 把 SQL语句指令发给数据库管理系统sqlite3_prepare_v2 :创建一个SQL语句对象 int sqlite3_prepare_v2( sqlite3 *db, /* 数据库连接对象,表示要操作哪个数据库 */ const char *zSql, /* 要执行的SQL语句,多条SQL语句用 ; 隔开,可以包含变量名 */ int nByte, /* 表示要编译到哪个位置 */ < 0 :编译到zSql指向的语句中第一个\0为止 == 0 :什么都不编译 >0 : 只编译 zSql指向的语句中的前n个字节 sqlite3_stmt **ppStmt, /* *ppStmt 用来保存编译好的SQL语句对象 */ const char **pzTail /* 如果不为空 ,*pzTail 指向的zSql中编译的第一条完整的 SQL语句的第一个字符的地址*/ ); 返回值: 成功返回 SQLITE_OK 失败返回其他值 zSql指向的SQL语句: (1)不带参数 const char * sql = "create table t_stu\ (\ num int primary key,\ name varchar(255) not null,\ age int\ );insert into t_stu(num,name,age) values (1001,'pxl',\ 18);"; (2)带参数 编译的SQL语句中可以包含 “变量/参数”,其值在运行期间可以改变,但是 SQL语句对象不需要重新编译,通过特定的采纳数接口来指定这些SQL变量的值 const char*sql = "insert into t_stu(num,name,age) values (变量名1,变量名2,变量名3));"; 变量名按照以下方式来执行: ?NUM NUM 的范围[1,MAX_NUM] eg: const char*sql = "insert into t_stu(num,name,age) values (?1,?2,?3));"; :NMAE NAME 就是你取的变量的名字 @NAME $NAME eg: const char*sql = "insert into t_stu(num,name,age) values (:a,:b,:c));"; (2.1)给SQL语句对象中的参数赋值 1. 获取参数的索引 因为所有的绑定参数的函数,都是通过索引去操作这些参数 sqlite3_bind_parameter_index :用来获取某个变量在SQL语句对象中的索引 int sqlite3_bind_parameter_index(sqlite3_stmt*stmt, const char *zName); stmt:SQL语句对象 zName:变量名 返回值:成功返回索引 (> 0) 假如没有匹配到参数名 返回0 2. 绑定相应的值到变量/参数上面 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*stmt,int index,const char*str,int,void(*)(void*)); 第一个参数:SQL语句对象 第二个参数: 要绑定的变量的索引 第三个参数: 要绑定的值 sqlite3_bind_int==》int sqlite3_bind_double ==》double sqlite3_bind_null ==>空 int sqlite3_bind_text(sqlite3_stmt*stmt,int index,const char*str,int len,void(*p)(void*)); str :要绑定的字符串的地址 len :字符串的长度 p : 函数指针,指向的函数用来释放字符串的空间 如果不需要释放字符串的空间 直接给 NULL
(4)sqlite3_step :执行SQL语句对象
int sqlite3_step(sqlite3_stmt*pStmt);
pStmt : 指向要编译好的并且要执行的SQL语句对象返回值: SQLITE_DONE :SQL语句执行完成 SQLITE_ERROR :出错啦 SQLITE_BUSY :没有拿到锁,没有执行语句 SQLITE_MISUSE:使用方法不当 SQLITE_ROW:返回一行 当SQL语句时select时候,执行结果是一个结果集,一行一行的返回。 调用一次sqlite3_step就可以获取一行的结果,一直调用到结果为DONE SQLITE_ROW:返回一行,需要用户自己调用解析函数去解析这一行的数据 //用来获取一行中有多少列 int sqlite3_column_count(sqlite3_stmt *pStmt); //用来获取一行中第i列的数据类型 int sqlite3_column_type(sqlite3_stmt*pStmt, int iCol); pStmt:SQL语句对象 iCol :第几列 ,从 0开始 返回值: SQLITE_INTEGER 1 SQLITE_FLOAT 2 SQLITE_BLOB 4 SQLITE_NULL 5 SQLITE_TEXT 3 // 获取一行中第i列的值 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); double 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); //获取第i列的列名 const char *sqlite3_column_name(sqlite3_stmt*, int N);
(5) sqlite3_finalize:销毁一个语句对象
int sqlite3_finalize(sqlite3_stmt *pStmt);
pStmt:要销毁的语句对象(6) sqlite3_reset :重置SQL语句对象,以便下一轮绑定参数
int sqlite3_reset(sqlite3_stmt *pStmt);
pStmt:要重置的语句对象(7) sqlite3_errmsg :输出数据库中的出错信息
const charsqlite3_errmsg(sqlite3pDb);