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

List of C-language APIs

Last modification:2021 年 04 月 19 日 20 : 08 : 56