欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sqlite3简洁的C++类封装

程序员文章站 2022-03-02 22:13:44
sqlite3使用非常广泛,但是使用C语言接口比较麻烦,以下为C++类的简单封装,代码量少,使用简洁方便。先看下如何使用,后面再介绍实现过程。1.执行SELECT语句int main(){ const char *sql; sql = R"( SELECT COUNT(*) FROM PrintJob )"; sqlite db("my.db"); stmt st(&db, sql); if(st.s...

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