简述
sqlite3 接口的核心元素: 两大对象,八大函数;
其中两个对象指的是:
sqlite3_stmt SQL 语句对象
编程流程
打开或创建一个数据库函数(sqlite3_open)
#include <sqlite3.h>
SQLITE_API int sqlite3_open(const char *filename,sqlite3 **ppDb);
sqlite3 * pDB = NULL; //用来表示你打开的数据库
//打开数据库
int ret = sqlite3_open(argv[1],&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{
printf("open sqlite3 database error\n");
return 0;
}
关闭数据库函数(sqlite3_close)
#include <sqlite3.h>
SQLITE_API int sqlite3_close(sqlite3* ppDb);
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
准备一条 SQL 语句对象(sqlite3_prepare_v2)
#include <sqlite3.h>
SQLITE_API int sqlite3_prepare_v2(
sqlite3 *db, /* 数据库句柄 */
const char *zSql, /* SQL 语句,UTF-8 编码 */
int nByte, /* zSql 的最大长度,以字节为单位。 */
sqlite3_stmt **ppStmt, /* OUT:语句句柄 */
const char **pzTail /* OUT:指向 zSql 中未使用部分的指针,一般给 NULL*/
);
int num; //存放 ID
char name[20] = {0}; //存放 name
char Tel[20] = {0}; //存放电话号码
char sql[256] = {0}; //存放 sql 语句
memset(name,0,20);
memset(Tel,0,20);
scanf("%d%s%s",&num,name,Tel);
if(num == 0) //输入 0 结束
{
break;
}
memset(sql,0,20);
sprintf(sql,"INSERT INTO STU VALUES(%d,'%s','%s');",num,name,Tel);
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象
if(ret != SQLITE_OK)
{
perror("sqlite3_prepare_v2 failed");
sqlite3_close(pDB);
return -1;
}
销毁 SQL 语句对象(sqlite3_finalize)
#include <sqlite3.h>
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
执行一条 SQL 语句对象(sqlite3_step)
#include <sqlite3.h>
SQLITE_API int sqlite3_step(sqlite3_stmt* pStmt);
//执行准备好的 sql 语句
ret = sqlite3_step(stmt);
if(ret == SQLITE_DONE)
{
printf("sqlite3_step success\n");
}else
{
printf("sqlite3_step failed,%d\n",ret);
}
普通编程流程示例
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char const *argv[])
{
sqlite3 * pDB = NULL; //用来表示表示你打开的数据库
//打开数据库
int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{
printf("open sqlite3 database error\n");
return 0;
}
//准备一条 sql 语句对象,表的列有 ID,NAME,TEL
int num; //存放 ID
char name[20] = {0}; //存放 name
char Tel[20] = {0}; //存放电话号码
char sql[256] = {0}; //存放 sql 语句
while(1)
{
//输入插入表中的数据
memset(name,0,20);
memset(Tel,0,20);
scanf("%d%s%s",&num,name,Tel);
if(num == 0) //输入 0 结束
{
break;
}
memset(sql,0,20);
sprintf(sql,"INSERT INTO JIUYUE VALUES(%d,'%s','%s');",num,name,Tel);
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象
if(ret != SQLITE_OK)
{
perror("sqlite3_prepare_v2 failed");
sqlite3_close(pDB);
return -1;
}
//执行准备好的 sql 语句
ret = sqlite3_step(stmt);
if(ret == SQLITE_DONE)
{
printf("sqlite3_step success\n");
}else
{
printf("sqlite3_step failed,%d\n",ret);
}
//释放 sql 语句资源,销毁 sql 语句对象
sqlite3_finalize(stmt);
}
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
return 0;
}
添加数据前表中内容:
执行函数后:
文章来源:https://www.toymoban.com/news/detail-737217.html
回调函数执行接口(sqlite3_exec)
#include <sqlite3.h>
SQLITE_API int sqlite3_exec(
sqlite3* ppDb, /* 数据库句柄 */
const char *sql, /* SQL 语句 */
int (*callback)(void*,int,char**,char**), /* 回调函数 */
void *arg1, /* 回调的第一个参数 */
char **errmsg /* 保存错误信息*/
);
typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char**columnName);
#include<stdio.h>
#include<sqlite3.h>
int my_callback(void* arg,int ncols,char*col_values[],char*col_names[])
{
//打印表头
int i;
if(*((int *)arg) == 1)
{
for(i = 0;i<ncols;i++) //打印表头
{
printf("%s\t",col_names[i]);
}
printf("\n");
*((int *)arg) = 0; //表头只打印一次即可
}
//打印这一条记录的值
for(i = 0;i<ncols;i++)
{
printf("%s\t",col_values[i]); //打印表中一行数据
}
printf("\n");
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 * pDB = NULL;
//打开数据库
int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{
printf("open sqlite3 database error\n");
return 0;
}
const char *sql = "INSERT INTO JIUYUE VALUES(9,'lishi','17654329987');SELECT * FROM JIUYUE;";
int flag = 1; //表头打印标志,为 1 打印,为 0 不打印
char *ermsg = NULL; //用来保存出错信息
ret = sqlite3_exec(pDB,sql,my_callback,(void *)&flag,&ermsg);
if(ret != SQLITE_OK)
{
printf("sqlite3_exec failed:%s\n",ermsg);
}
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
return 0;
}
获取结果集的列数(sqlite3_column_count)
#include <sqlite3.h>
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
获取表头信息(sqlite3_column_name)
#include <sqlite3.h>
SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N);
//获取结果集的列数
int nCols = sqlite3_column_count(stmt);
int i = 0;
if(flag == 1)
{
for(i = 0;i<nCols;i++) //打印一行记录的表头
{
printf("%s\t",sqlite3_column_name(stmt,i));
}
printf("\n");
flag = 0;
}
获取指定列数据类型(sqlite3_column_type)
#include <sqlite3.h>
SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int iCol);
获取指定列数据(sqlite3_column_类型名)
#include <sqlite3.h>
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
for(i = 0;i<nCols;i++) //打印一行记录的所有的列
{
//获取结果行中第 i 列的类型
int vtype = sqlite3_column_type(stmt,i);
if(vtype == SQLITE_INTEGER) //如果当前列为整型
{
int val = sqlite3_column_int(stmt,i);
printf("%d\t",val);
}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型
{
double val = sqlite3_column_double(stmt,i);
printf("%f\t",val);
}else if(vtype == SQLITE_TEXT) //如果当前列为字符串
{
const char *val = sqlite3_column_text(stmt,i);
printf("%s\t",val);
}else
{
printf("\t\t");
}
}
采用 column 类函数打印表示例程序
#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{
sqlite3 * pDB = NULL;
//打开数据库
int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{
printf("open sqlite3 database error\n");
return 0;
}
//准备一条 sql 语句对象
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
const char *sql = "SELECT * FROM JIUYUE;";
ret = sqlite3_prepare_v2(
pDB, /* 数据库的连接句柄,打开的数据库对象 */
sql, /* 要执行的原始的 SQL 语句 */
-1, /*zSql 指向的 SQL 语句的长度 */
&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */
NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */
);
if(ret != SQLITE_OK)
{
perror("sqlite3_prepare_v2 failed");
sqlite3_close(pDB);
return -1;
}
int r;
int flag = 1; //表头打印标志,为 1 打印,为 0 不打印
do
{
//3.执行 sql 语句,select 有多少条结果,就可以执行多少次语句
r = sqlite3_step(stmt);
if(r == SQLITE_DONE)
{
printf("sqlite3_step success\n");
break;
}
//打印 select 语句产生的结果集
//获取结果集的列数
int nCols = sqlite3_column_count(stmt);
int i = 0;
if(flag == 1)
{
for(i = 0;i<nCols;i++) //打印一行记录的表头
{
printf("%s\t",sqlite3_column_name(stmt,i));
}
printf("\n");
flag = 0;
}
for(i = 0;i<nCols;i++) //打印一行记录的所有的列
{
//获取结果行中第 i 列的类型
int vtype = sqlite3_column_type(stmt,i);
if(vtype == SQLITE_INTEGER) //如果当前列为整型
{
int val = sqlite3_column_int(stmt,i);
printf("%d\t",val);
}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型
{
double val = sqlite3_column_double(stmt,i);
printf("%f\t",val);
}else if(vtype == SQLITE_TEXT) //如果当前列为字符串
{
const char *val = sqlite3_column_text(stmt,i);
printf("%s\t",val);
}else
{
printf("\t\t");
}
}
printf("\n");
} while (r == SQLITE_ROW);//表示 sqlite3_step 产生了一行数据
//释放 sql 语句资源,销毁 sql 语句对象
sqlite3_finalize(stmt);
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-737217.html
获取 SQL 语句索引值(sqlite3_bind_parameter_index)
#include <sqlite3.h>
SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt * pStmt, const char *zName);
char *sql = "INSERT INTO STU(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(
pDB, /* 数据库的连接句柄,打开的数据库对象 */
sql, /* 要执行的原始的 SQL 语句 */
-1, /*zSql 指向的 SQL 语句的长度 */
&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */
NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */
);
//1.获取 sql 语句中占位符的索引值
int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");
绑定索引值(sqlite3_bind_类型名)
#include <sqlite3.h>
//常用类型
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
//其他类型
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64,void(*)(void*));
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64,void(*)(void*), unsigned char encoding);
SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, constchar*,void(*)(void*));
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64);
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");
//2.给索引值绑定自己的值
sqlite3_bind_int(stmt,var_index[0],num);
sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);
sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL);
复位操作(sqlite3_reset)
#include <sqlite3.h>
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
采用绑定的方式从文件中添加数据到数据库程序示例
#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{
sqlite3 * pDB = NULL;
//打开数据库
int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{
printf("open sqlite3 database error\n");
return 0;
}
//准备一条 sql 语句对象
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
const char *sql = "INSERT INTO JIUYUE(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";
ret = sqlite3_prepare_v2(
pDB, /* 数据库的连接句柄,打开的数据库对象 */
sql, /* 要执行的原始的 SQL 语句 */
-1, /*zSql 指向的 SQL 语句的长度 */
&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */
NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */
);
if(ret != SQLITE_OK)
{
perror("sqlite3_prepare_v2 failed");
sqlite3_close(pDB);
return -1;
}
//打开文件
FILE * fp = fopen("table.txt","r");
if(fp == NULL) //打开失败
{
perror("fopen error");
sqlite3_finalize(stmt); //打开失败,释放语句对象
sqlite3_close(pDB); //关闭数据库
return -1;
}
//获取 sql 语句中占位符的索引值
int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");
while (1)
{
int num = 0; //保存 ID
char name[20] = {0}; //保存名字
char tel[20] = {0}; //保存电话
int r = fscanf(fp,"%d%s%s",&num,name,tel); //从文件中获取数据
if(r!=3)
{
if(feof(fp)) //如果文件读到末尾
{
fclose(fp); //关闭文件
break;
}
continue;
}
//给索引值绑定自己的值
sqlite3_bind_int(stmt,var_index[0],num);
sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);
sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL);
r = sqlite3_step(stmt);
if(r == SQLITE_DONE)
{
printf("sqlite3_step success\n");
}else
{
printf("sqlite3_step failed,%d\n",ret);
}
//复位 sql 语句对象,方便下一轮的绑定
sqlite3_reset(stmt);
}
//释放 sql 语句资源,销毁 sql 语句对象
sqlite3_finalize(stmt);
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
return 0;
}
到了这里,关于SQLITE3 函数接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!