这篇主要是sqlit3的库函数使用,sql语句在上篇中,但是c的sql语句是可以使用占位符的,占位符为“?”,使用方法例如:
sql = "insert into mytable (id, name, age, phone,address) values(?,?,?,?,?);"
下载
下载地址:https://www.sqlite.org/download.html
下载源码后解压,解压后的文件夹中有四个文件,编写C程序需要使用到的文件是sqlite3.c和sqilte3.h,将这两个文件复制到项目目录下。
打开关闭数据库
首先要有一个数据库链接句柄,类型为sqlite3
sqlite3 *db;
sqlite3_open(path, &db); //打开数据库
sqlite3_close(db); //关闭数据库
path为数据库表路径
sqlite3_open()打开数据库表,表不存在则创建
执行sql语句
执行sql语句有两种形式,一种是sqlite3_exec(),一个是sqlite3_prepare_v2,第二个还要结合其他语句一起使用。一般只执行一次的sql语句使用sqlite3_exec(),需要多次执行的使用sqlite3_prepare_v2,可以提高速率,例如插入和读取数据库数据。sqlite3_exec()是sqlite3_prepare_v2和其他语句的一个封装。
sqlite3_exec()
函数原型
int sqlite3_exec(
sqlite3 *db, /* The database on which the SQL executes */
const char *zSql, /* The SQL to be executed */
sqlite3_callback xCallback, /* Invoke this callback routine */
void *pArg, /* First argument to xCallback() */
char **pzErrMsg /* Write error messages here */
)
参数解析
db:数据库句柄
zSql:执行的SQL语句
xCallback:回调函数
pArg:回调函数参数
pzErrMsg:错误信息
sqlite3_prepare_v2()
插入数据
1、准备sql语句
函数原型
int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
函数参数
db:数据库句柄
zSql:sql语句
nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。
ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL
pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
2、绑定数据
函数原型
绑定数据为一系列函数,该系列函数为sqlite3_bind_xx()
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n,void(*)(void*));
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_double(sqlite3_stmt*, int, double);
函数参数
第一个参数:上一个函数中的stmt
第二个参数:序号,从1开始,代表第几列
第三个参数:绑定的值
第四个参数:第四个参数为字符串长度,-1表示全部
第五个参数:函数指针,一般为SQLITE_STATIC(表示字符串为常量)或SQLITE_TRANSIENT(对字符串拷贝)。
SQLITE3执行完操作后回调此函数,通常用于释放字符串占用的内存。
3、执行sql语句
函数原型
sqlite3_step(stmt)
4、清空内存
sqlite3_reset(stmt);
sqlite3_finalize(stmt);
5、整体步骤
1 准备SQL语句
2 绑定数据
3 执行
4 释放内存
读取数据
读取数据与插入数据差不多,只不过读取数据使用的是sqlite3_column_xx系列函数,该系列函数是从执行完sqlite3_step的结果的当前行中读取一列值(即某一行的某一列值)
使用方式
ret = sqlite3_column_int(sqlite3_stmt*, int);
ret = sqlite3_column_text(sqlite3_stmt*, int);
第一个参数:stmt
第二个参数:哪列,索引从0开始
返回值:ret为读到的值,ret类型与函数有关
5、整体步骤
1 准备SQL语句
2 执行 (这里与读取步骤有差别)
3 绑定数据
4 释放内存
github项目
https://github.com/Wangmenghahaha/learning/tree/master/sqlite3_test