sqlite3_open
打开或创建数据库
头文件:
#include <sqlite3.h>
原型:
int sqlite3_open(const char *filename,sqlite3 **ppDb);
参数:
char *filename:数据库的路径+数据库名;
sqlite3 **ppDb:sqlite句柄指针,指向打开的数据库地址;
返回值:
成功,返回0,SQLITE_OK;
失败,返回错误码(非0值);
例程:
//打开数据库
sqlite3* db = NULL;
if(sqlite3_open("./my.db", &db) != SQLITE_OK)
{
printf("数据库打开失败\n");
return -1;
}
printf("数据库打开成功\n");
sqlite3_close
关闭数据库
头文件:
#include <sqlite3.h>
原型:
int sqlite3_close(sqlite3* db);
参数:
sqlite3* db:指定要关闭的数据库的句柄;
返回值:
成功,返回0,SQLITE_OK;
失败,返回错误码(非0值);
例程:
sqlite3_close(db);
sqlite3_errmsg
通过错误码获取错误信息,一般放在打开数据库失败后
头文件:
#include <sqlite3.h>
原型:
const char *sqlite3_errmsg(sqlite3* db);
参数:
sqlite3* db:句柄指针;存储打开失败的数据库地址;
返回值:
返回错误码对应的错误信息;
例程:
sqlite3* db = NULL;
if(sqlite3_open("./my.db", &db) != SQLITE_OK)
{
//打印错误信息
fprintf(stderr, "%s\n", sqlite3_errmsg(db));
return -1;
}
printf("数据库打开成功\n");
sqlite3_exec
执行一条sql语句
头文件:
#include <sqlite3.h>
原型:
int sqlite3_exec(sqlite3* db,const char *sql,int (*callback)(void*,int,char**,char**),void *,char **errmsg);
参数:
sqlite3* db:数据库的句柄指针;
char *sql:sql语句;
int (*callback)(void*,int,char**,char**):回调函数,可以指向 int func(void*, int, char**, char**);
注意:只有在sql查询语句的时候有用到,其余时候填NULL;
void *:传入给回调函数的第一个参数;
char **errmsg:错误信息;
返回值:
成功,返回0,SQLITE_OK;
失败,返回错误码,非0参数;
创建表格
create table 表名 (字段 类型 primary key,字段 类型,字段 类型);
create table if not exists 表名 (字段 类型,字段 类型,字段 类型);
int create_table(sqlite3* db,char* sql)
{
char* errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%d %s %s\n",__LINE__,__func__,errmsg);
return -1;
}
return 0;
}
char sql[SQLLEN] = "create table if not exists usr(name char primary key,passwd char,state char);";
if(create_table(db,sql) < 0)
{
fprintf(stderr,"%d %s %s\n",__LINE__,__func__,"打开(创建)表usr失败");
}
printf("表usr打开(创建)成功\n");
插入记录
insert into 表名 values (数据1, 数据2, 数据3, 数据4);
insert into 表名 (字段2,字段4) values (数据2, 数据4);
int do_insert(sqlite3* db)
{
char en[N] = "",zh_CN[N] = "";
printf("请输入英文--->");
scanf("%s",en);
getchar();
printf("请输入中文--->");
scanf("%s",zh_CN);
getchar();
char sql[SQLLEN] = "";
sprintf(sql,"insert into dict_en_zh_CN values('%s','%s');",en,zh_CN);
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%s %d\n",errmsg,__LINE__);
return -1;
}
printf("增加记录成功\n");
return 0;
}
更新记录
update 表名 set 字段=数值 where 字段=数值;
int do_update(sqlite3* db)
{
char en[N] = "",zh_CN[N] = "";
printf("请输入要修改的英文--->");
scanf("%s",en);
getchar();
printf("请输入修改后的中文--->");
scanf("%s",zh_CN);
getchar();
char sql[SQLLEN] = "";
sprintf(sql,"update dict_en_zh_CN set zh_CN='%s' where en='%s';",zh_CN,en);
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%s %d\n",errmsg,__LINE__);
return -1;
}
printf("修改记录成功\n");
return 0;
}
删除记录
delete from 表名 where 字段=数值;
int do_delete(sqlite3* db)
{
char en[N] = "";
printf("请输入要删除的英文--->");
scanf("%s",en);
getchar();
char sql[SQLLEN] = "";
sprintf(sql,"delete from dict_en_zh_CN where en = '%s';",en);
char *errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%s %d\n",errmsg,__LINE__);
return -1;
}
printf("删除记录成功\n");
return 0;
}
查询记录
select * from 表名;
select * from 表名 where 限制条件;
select 字段1,字段2 from 表名;
select 字段1,字段2 from 表名 where 限制条件;
//回调函数,有几行的记录就会调用几次
//传入的arg作用:只在第一次调用时打印字段名,之后调用只打印字段值
int callback(void* arg,int column,char** value,char** name)
{
int i;
if(*(int*)arg == 0)
{
for(i=0;i<column;i++)
{
printf("%s\t",name[i]);
}
*(int*)arg = 1;
putchar(10);
}
for(i=0;i<column;i++)
{
printf("%s\t",value[i]);
}
putchar(10);
return 0;
}
int do_select(sqlite3* db)
{
int flag = 0;
char sql[SQLLEN] = "select * from dict_en_zh_CN;";
char *errmsg = NULL;
if(sqlite3_exec(db,sql,callback,(void*)&flag,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%s %d\n",errmsg,__LINE__);
return -1;
}
printf("查询记录成功\n");
return 0;
}
sqlite3_get_table
查询数据,获取表格数据
头文件:
#include <sqlite3.h>
原型:
int sqlite3_get_table(sqlite3 *db,const char *zSql,char ***pazResult,int *pnRow,int*pnColumn,char **pzErrmsg);
参数:
sqlite3 *db:数据库的句柄指针;
char *zSql:sql语句,注意:只能填写查询相关的sql语句;
char ***pazResult:用来指向sql指向结果(字段内容+记录内容)的指针;
int *pnRow:存储满足条件的记录条数(行数);
int *pnColumn:满足条件的字段数(列数);
char **pzErrmsg:错误信息;
返回值:
成功,返回0,SQLITE_OK;
失败,返回错误码,非0参数;
例程:
int do_get_table(sqlite3* db)
{
char sql[SQLLEN] = "select * from dict_en_zh_CN;";
char** result;
int row,column;
char* errmsg = NULL;
if(sqlite3_get_table(db,sql,&result,&row,&column,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"%s %d\n",errmsg,__LINE__);
return -1;
}
int i,j,k=0;
for(i=0;i<=row;i++)//4行 = 字符段1行 + 记录段3行
{
for(j=0;j<column;j++)//2列
{
printf("%s\t",result[k]);
k++;
}
putchar(10);
}
//释放sqlite3_get_table的空间
sqlite3_free_table(result);
return 0;
}
sqlite3_free_table
释放sqlite3_get_table函数查询到的结果的空间
头文件:
#include <sqlite3.h>
原型:
void sqlite3_free_table(char **result);
参数:
char **result:储存结果(字段内容+记录内容)的二级指针指向的首地址
Official
An Introduction To The SQLite C/C++ Interface
本文链接:https://shengto.top/database/sqlite3_API1.html
转载时须注明出处及本声明