zoukankan      html  css  js  c++  java
  • sqlite3API函数

    回顾:
    DDL
    表的创建、修改、删除
    create table 表名(字段名 字段类型 [约束],...);
    alter table 表名 {rename to 新名字 | add column 字段 字段类型};
    drop table 表名 ;
    DML
    记录的增、删、改、查
    insert into 表名(字段名,...)values(字段值,...);
    insert into 表名 values(字段值,...);

    delete from 表名 [where 条件];

    update 表名 set 字段=新值 [where 条件];

    select * from 表名 [where 条件];

    ------------------------------------------
    sqlite3接口函数

    sqlite3 数据库连接对象
    sqlite3_stmt 编译后的SQL语句对象
    sqlite3_open() 打开或创建一个数据库连接
    sqlite3_prepare() 准备SQL语句
    sqlite3_bind() 绑定参数
    sqlite3_step() 执行准备好的SQL语句
    sqlite3_column() 从sqlite3_stmt中取字段值
    sqlite3_finalize() 用来释放sqlite3_stmt
    sqlite3_close() 关闭数据库
    sqlite3_exec() 执行SQL语句

    ------------------------------------
    sqlite3
    sqlite3_open
    sqlite3_exec
    sqlite3_close
    sprintf()
    -------------
    数据库的操作流程:
    1.连接数据库
    sqlite3 *db;
    2.打开数据库
    int sqlite3_open(
    const char *filename, /* 数据库名(字符串类型) */
    sqlite3 **ppDb /* sqlite3结构二级指针,数据库连接对象 */
    );
    返回值:成功返回 SQLITE_OK,并且ppDb指向新的数据库连接
    其它值表示失败

    例:
    int res = sqlite3_open("test.db",&db);
    if(res != SQLITE_OK)
    {
    printf("open db err:%s ",sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
    }
    3.操作
    int sqlite3_exec(
    sqlite3*, 打开的数据库
    const char *sql, 要执行的SQL语句(字符串)
    int (*callback)(void*,int,char**,char**), 回调函数
    void *, 做为回调函数的第一个参数
    char **errmsg 错误信息写在这里
    )
    SQL语句的执行分为两类:
    a.没有返回结果的情况,那么就不需要回调函数,给NULL即可
    如:create insert update delete...
    b.有结果集返回的情况,那么就需要通过回调函数去获取结果集
    每查到一条记录调用一次回调函数
    如:select

    int (*callback)(void* arg,传给回调函数的参数
    int column_count,记录的字段(例)个数
    char**column_value,字段值(就是个一维数组)
    char**column_name)字段名(一维数组)
    例:
    char* column_name[3] = {"abc","123","hello"};


    4.关闭数据库
    int sqlite3_close(sqlite3*);

    id name age addr

    1000 白起 20 CHINA
    1001 李牧 21 CHINA
    1002 王箭 21 CHINA
    1003 廉颇 25 CHINA

    gcc sqlite3_exec_select.c
    -I /usr/local/sqlite3/PC/include/ 指明头文件所在目录
    -L /usr/local/sqlite3/PC/lib/ 指明库所在目录
    -lsqlite3 所用的库的名字


    ------------------------------------------------------------------------
    sqlite3 数据库连接对象
    sqlite3_stmt 编译后的SQL语句对象
    sqlite3_open() 打开或创建一个数据库连接
    sqlite3_prepare() 准备SQL语句
    sqlite3_bind() 绑定参数
    sqlite3_step() 执行准备好的SQL语句
    sqlite3_column() 从sqlite3_stmt中取字段值
    sqlite3_finalize() 用来释放sqlite3_stmt
    sqlite3_close()

    1.打开数据库,建立连接
    2.准备SQL语句
    (如果SQL语句有可变的参数,那就要绑定值)
    int sqlite3_prepare_v2(
    sqlite3 *db, /* 数据库连接对象 */
    const char *zSql, /* 要执行的SQL语句 */
    int nByte, /* SQL语句的长度 */ 可以为负数(-1),自动计算长度
    sqlite3_stmt **ppStmt, /* 准备好的SQL语句 */
    const char **pzTail /* 指向未执行的SQL语句*/
    );
    char *zSql = "create table....;intser into...";
    char *pzTail = "intser into...";

    3.执行
    (如果是查询语句,那就需要获取结果集)
    int sqlite3_step(sqlite3_stmt*);
    执行成功返回SQLITE_DONE
    如果有数据返回时,执行成功返回SQLITE_ROW

    4.释放sqlite3_stmt对象
    int sqlite3_finalize(sqlite3_stmt *pStmt);
    5.关闭

    -----------------
    int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
    int sqlite3_bind_double(sqlite3_stmt*, int, double);
    int sqlite3_bind_int(sqlite3_stmt*, int, int);
    int sqlite3_bind_null(sqlite3_stmt*, int);
    int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));

    第一、二个参数和返回值都是相同的:
    第一个参数:解析后的语句对象
    第二个参数:是要绑定的参数的索引号,从索引值1开始
    第三个参数:要给参数绑定的值
    第四个参数(如果有):代表第三个参数的绑定值的长度
    第五个参数(如果有):是一个指向内存管理的回调函数的指针,一般给0
    回调函数:void callback(void*);

    练习:
    用sqlite3_bind_blob,往数据库里存取图片

    const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
    int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

    double sqlite3_column_double(sqlite3_stmt*, int iCol);
    int sqlite3_column_int(sqlite3_stmt*, int iCol);
    const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
    int sqlite3_column_count(sqlite3_stmt *pStmt);

    int sqlite3_column_type(sqlite3_stmt*, int iCol);
    返回五个存储类型对应的整数值:
    SQLITE_INTEGER 1
    SQLITE_FLOAT 2
    SQLITE_TEXT 3
    SQLITE_BLOB 4
    SQLITE_NULL 5

    /*************************************************************************
    > File Name: sqlite3_exec.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Thu 25 Aug 2016 10:07:00 AM CST
    ************************************************************************/

    #include<stdio.h>
    #include<sqlite3.h>

    int main()
    {
    //1.打开数据库,并建立数据库连接
    sqlite3 *db;
    int res = sqlite3_open("test.db",&db);
    if(res != SQLITE_OK)
    {
    fprintf(stderr,"open err:%s ",sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
    }
    printf("打开数据库test.db成功~~ ");

    //2.操作数据库,建表,增 删 改 查等操作
    char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text default 'CHINA')";
    char *errmsg = NULL;
    res = sqlite3_exec(db,createSql,NULL,NULL,&errmsg);
    if(res != SQLITE_OK)
    {
    fprintf(stderr, "SQL error: %s ", errmsg);
    sqlite3_free(errmsg);
    }
    printf("建表 stud 成功~ ");

    //3.关闭数据库
    sqlite3_close(db);
    return 0;
    }

    /*************************************************************************
    > File Name: sqlite3_exec_select.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Thu 25 Aug 2016 10:07:00 AM CST
    ************************************************************************/

    #include<stdio.h>
    #include<sqlite3.h>


    int callback(void*arg,int column_count,char **column_value,char** column_name)
    {
    printf("字段数:%d ",column_count);
    int i;
    for(i = 0; i < column_count; i++)
    {
    printf("字段名:%s ",column_name[i]);
    }
    printf(" ");

    for(i = 0; i < column_count; i++)
    {
    printf("%s ",column_value[i]);
    }
    printf(" ");

    return 0;
    }
    int main()
    {
    //1.打开数据库,并建立数据库连接
    sqlite3 *db;
    int res = sqlite3_open("test.db",&db);
    if(res != SQLITE_OK)
    {
    fprintf(stderr,"open err:%s ",sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
    }
    printf("打开数据库test.db成功~~ ");

    //2.操作数据库,建表,增 删 改 查等操作
    // char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text default 'CHINA')";

    char *selectSql = "select * from stud";
    char *errmsg = NULL;
    res = sqlite3_exec(db,selectSql,callback,NULL,&errmsg);
    if(res != SQLITE_OK)
    {
    fprintf(stderr, "SQL error: %s ", errmsg);
    sqlite3_free(errmsg);
    }
    printf("建表 stud 成功~ ");

    //3.关闭数据库
    sqlite3_close(db);
    return 0;
    }

    /*************************************************************************
    > File Name: sqlite3_prepare.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Thu 25 Aug 2016 02:23:03 PM CST
    ************************************************************************/

    #include<stdio.h>
    #include<sqlite3.h>
    #include<string.h>
    int main()
    {
    sqlite3 *db;
    sqlite3_stmt *stmt;
    //1
    int res = sqlite3_open("test.db",&db);
    if(res != SQLITE_OK)
    {
    fprintf(stderr,"open error %s ",sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
    }
    printf("打开数据库test.db成功~ ");

    //2.
    int id;
    char name[32] = {0};
    int age;
    char *insertSql = "insert into stud(id,name,age) values(?,?,?);";
    printf("请输入ID: ");
    scanf("%d",&id);
    printf("请输入姓名: ");
    scanf("%s",name);
    printf("请输入年龄: ");
    scanf("%d",&age);
    res = sqlite3_prepare_v2(db,insertSql,strlen(insertSql),&stmt,0);
    if(res != SQLITE_OK)
    {
    printf("sqlite3_prepare_v2 error ");
    fprintf(stderr,"prepare error %s ",sqlite3_errmsg(db));
    return -1;
    }
    sqlite3_bind_int(stmt,1,id);
    sqlite3_bind_int(stmt,3,age);
    sqlite3_bind_text(stmt,2,name,strlen(name),0);


    //3
    res = sqlite3_step(stmt);
    if(res != SQLITE_DONE)
    {
    printf("sqlite3_step error ");
    return -1;
    }
    //4
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    }

    /*************************************************************************
    > File Name: sqlite3_prepare_select.c
    > Author: csgec
    > Mail: longer.zhou@gmail.com
    > Created Time: Thu 25 Aug 2016 02:23:03 PM CST
    ************************************************************************/

    #include<stdio.h>
    #include<sqlite3.h>
    #include<string.h>
    int main()
    {
    sqlite3 *db;
    sqlite3_stmt *stmt;
    //1
    int res = sqlite3_open("test.db",&db);
    if(res != SQLITE_OK)
    {
    fprintf(stderr,"open error %s ",sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
    }
    printf("打开数据库test.db成功~ ");

    //2.
    char *selectSql = "select * from stud;";
    res = sqlite3_prepare_v2(db,selectSql,strlen(selectSql),&stmt,0);
    if(res != SQLITE_OK)
    {
    printf("sqlite3_prepare_v2 error ");
    fprintf(stderr,"prepare error %s ",sqlite3_errmsg(db));
    return -1;
    }

    //3
    res = sqlite3_step(stmt);
    /*
    if(res != SQLITE_DONE)
    {
    printf("sqlite3_step error ");
    return -1;
    }
    */
    int count = sqlite3_column_count(stmt);
    printf("count = %d ",count);
    int i;
    //获取字段名和字段类型
    for(i = 0; i < count; i++)
    {
    printf("column name:%s ",sqlite3_column_name(stmt,i));
    printf("column type:%i ",sqlite3_column_type(stmt,i));
    }

    //获取字段值
    int id;
    const char *name;
    int age;
    const char *addr;
    while(res == SQLITE_ROW)
    {
    id = sqlite3_column_int(stmt,0);
    name = sqlite3_column_text(stmt,1);
    age = sqlite3_column_int(stmt,2);
    addr = sqlite3_column_text(stmt,3);
    printf("id = %d,name = %s,age = %d,addr = %s ",
    id,name,age,addr);

    res = sqlite3_step(stmt);
    }
    //4
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    }

  • 相关阅读:
    JavaBean理解
    你应该掌握的七种回归技术
    回归分析步骤
    rsync命令(同步/备份数据)
    获取客户端访问的ip地址
    SSO单点登陆
    产品分类之属性选择
    linux的SVN搭建与同步
    php 实现 mysql数据表优化与修复
    php程序备份还原mysql数据库
  • 原文地址:https://www.cnblogs.com/liudehao/p/5808177.html
Copyright © 2011-2022 走看看