sqlite3简洁的C++类封装

sqlite3使用非常广泛,但是使用C语言接口比较麻烦,以下为C++类的简单封装,只使用两个类,代码量少,使用简洁方便。

先看下如何使用,后面再介绍实现过程。

1.执行INSERT语句

int main()
{
    const char *sql;
    sql = R"(
          INSERT INTO student VALURES(1000, "张三")";

    sqlite db("my.db");
    stmt st(&db, sql);
    st.step();

    return 0;
}

2.执行SELECT带结果的查询


int main()
{
    const char *sql;

    sql = R"(
              SELECT * FROM student WHERE id = ?
              )";


    sqlite db("my.db");
    stmt st(&db, sql);
    st.bind_int(1, 1000);//自动替换sql中的问号为1000

    while(st.step() == SQLITE_ROW){
        int id = st.column_int(0);
        char *name = st.column_text(1);
        //......
    }
    return 0;
}

 

3.sqlite类

代表sqlite3的类,主要实现打开和关闭数据库


class stmt;
class sqlite{
    friend stmt;
public:
    sqlite(const char * filename):db(NULL){
        int rc = sqlite3_open(filename, &db);
        if( rc ){
           //fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        }else{
           //fprintf(stdout, "Opened database successfully\n");
        }

    }
    ~sqlite(){
        if(db)
            sqlite3_close(db);
    }

private:
    sqlite3 *db;
};

4.stmt类

代表sqlite3_stmt的类,主要实现SQL语句的预编译,数据的绑定,SQL语句的执行以及结果的获取

class stmt{
public:
    stmt(const sqlite* db, const char *sql):st(NULL){
        int rc = sqlite3_prepare(db->db, sql, -1, &st, 0);
        if( rc ){
           //fprintf(stderr, "sqlite3_prepare: %s\n", sqlite3_errmsg(db->db));
           return;
        }else{
           //fprintf(stdout, "sqlite3_prepare successfully\n");
        }
    }
    ~stmt(){
        if(st)
            sqlite3_finalize(st);
    }
    //int 和 text 可满足大部分需求
    //绑定数据
    int bind_int(int id, int value){
        return sqlite3_bind_int(st, id ,value);
    }
    int bind_text(int id,const char* value){
        return sqlite3_bind_text(st, id, value, -1, NULL);
    }
    //读取数据
    int column_int(int id){
        return sqlite3_column_int(st, id);
    }
    const char * column_text(int id){
        return (const char *)sqlite3_column_text(st, id);
    }
    //执行SQL语句
    int step(){
        return sqlite3_step(st);
    }

private:
    sqlite3_stmt *st;
};

 

本文地址:https://blog.csdn.net/u011208918/article/details/108574588

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐