1.通过C/C++程序去操作我们的数据库
数据库对C/C++的编程接口口
如何通过API含接口 去执行SQL语句
Sqlite3两大对象和八大函数 两个对象
数据库连接对象(the database conncetion Object)
数据库连接句柄/数据库自己的文件描述符 表示一个已经打开了的数据库
sqlite3 * 代表者一个打开的数sqlite3数据库文件
后续所有的操作都要通过这个对象
SQL 语句对象(the prepare statment Object)
一条准备号的SQL语句 可以执行的
类型 sqlite3_stmt
操作数据库的标准语言就是SQL语句,在这里 也是用准备好的SQL语句对象
去表示SQL语句去操作 数据库连接对象 表示的数据库
八大语句
利用SQL语句操作数据库的流程
1.建立连接
2.打开/创建一个数据库
sqlite3_open() //打开或创建一个sqlite3的数据库连接对象
3.操作数据库
sqlite3_prepare_v2(); //准备SQL语句对象
sqlite3_bind_*(); //绑定参数
sqlite3_step(); //执行sql语句
sqlite3_column_*(); //数据查询到的数据库数据
sqlite3_finalize(); //释放资源 销毁SQL语句对象sqlite3_exec(); //相对万能的语句
4.关闭数据库
sqlite3_close(); //关闭一个数据库连接对象
2.具体的API函数接口
1.打开数据库
sqlite3_open()
SQLITE_API int sqlite3_open(
const char *filename, /* 你要打开数据库的名称 */
sqlite3 **ppDb, /* OUT: SQLite db handle */
);
handle 句柄 指打开的数据库的对象或者说打开的数据库的文件描述符
后续对该数据库的所有操作都是通过这个对象
参数
filename: 要打开数据库的名称(带路径)
ppDb: 要打开的数据对象 数据库对象是一个一级指针
所以保存数据对象需要一个二级指针来接收
返回值:
成功返回 SQLITE_OK
失败返回 其他值
2.关闭数据库
sqlite3_close()
SQLITE_API int sqlite3_close(sqlite3*);
sqlite3 :需要关闭的数据库对象 sqlite3_open()第三个参数的指向空间的值
3.准备一条SQL语句
sqlite3_prepare_v2();
SQLITE_API int sqlite3_prepare_v2(
sqlite3 *db, /*要对那个数据库进行操作 数据库对象*/
const char *zSql, /* 要执行的SQL语句 用字符串表示*/
表示字符串需要用到"" 那SQL语句中表示字符串的双引号怎么办
SQL语句中的双引号变成单引号int nByte, /* zSql字符串有多少个字符 */
<0 找到第一个'\0'表示第一条语句
一次只会准备一条语句
=0 不准备语句
>0 准备到nByte指定的字节为止
sqlite3_stmt **ppStmt, /* 保存解析好的SQL语句 */
需要一个二级指针去保存准备好的SQL语句const char **pzTail , /*保存zSql字符串里面没有解析的部分*/
);
返回值:
成功返回 SQLITE_OK;
失败返回其他值
4.执行一条准备好的语句
sqlite3_step()
SQLITE_API int sqlite3_step(sqlite3_stmt*);
sqlite3_stmt* 要执行的sql语句对象
成功返回 SQLITE_DONE;
失败返回 其他值
如果指令是查询 成功的返回值不是 SQLITE_DONE
SELECT 命令成功的返回值 SQLITE_ROW
5.释放资源
sqlite3_finalize()
在prepare的时候 很有可能让stmt指向动态分配的内存空间,通过函数释放所有资源
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
pStm: 需要释放掉的SQL语句对象
成功返回 SQLITE_OK;
失败返回 其他值
6.sqlite3_bind_*();//绑定参数
需要和几个函数一起使用
sqlite3_reset(sqlite3_stmt*); 如果有多个信息需要录入
正常情况下
char buf[1024];
sqlite3_stmt *pStmt;
for(int i = 3;i< 6;i++)
{
sprintf(buf,"INSERT INTO STUDENT_INFO VALUES(%d,'张飞','1970/1/1');",i);
sqlite3_prepare_v2(pDb,buf,strlen(buf),&pStmt,NULL);
sqlite3_step(pStmt);
}
sqlite3_stmt *pStmt;
char buf[1024] ={"INSERT INTO STUDENT_INFO VALUES(?,'张飞','1970/1/1');"};
sqlite3_prepare_v2(pDb,buf,strlen(buf),&pStmt,NULL);
for(int i = 3;i< 6;i++)
{
sqlite3_bind_int(pDb,1,i);
sqlite3_step(pStmt);
sqlite3_reset(pStmt);
}
? 用于占位
sqlite3_bind_int(sqlite3_stmt* , int , int );
第一个int 用于表示第几个?
第二个int 表示要输入的值
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int , const char* , int , void(*)(void*) );
第二个参数int 用于表示第几个?
第三个参数const char* 表示要输入的字符串
第四个参数int 表示的是字符串的产固定
第五个参数是一个回调函数 给NULL就好了
sqlite3_reset(pStmt); 重置SQL语句对象
7.sqlite3_exec();
这个函数结构 是 准备 执行和释放三个函数的集合
它可以简化程序操作SQL的流程
SQLITE_API int sqlite3_exec(
sqlite3* , /* 打开的数据库对象*/
const char *sql , /* 要执行的SQL语句 用字符串表示 以'\0'结束*/
int (*callback)(void*,int,char**,char**) ,/* 回调函数 只有命令是 SELECT 才会去调用相应的回调函数 */
/*否则填 NULL */
void *, /* 回调函数的第一个参数 */
char **errmsg, /* 错误信息 */
如果这个参数不为空 则将错误信息写入到(*errmsg)指向的空间中
这个空间的大小和地址由函数给你分配 所以如果出错了
需要调用sqlite3_free()去释放
);
回调函数的类型是 int (*callback)( void* , int , char** , char** )
只有命令是SELECT 才会去调用回调函数
第一个参数是用户定义 void*
第二参数 int 是查询结果有多少列
第三个参数char** 指向一个字符串的指针数组 就是查询数据的每一列信息
第四个参数char** 指向一个字符串的指针数组 表头 就是字段名
SELECT有多少条记录 就会执行多少次回调函数
回调函数需要 return 0 ,否则sqlite3_exec会报错