sqlite3 批量插入数据库总结

原创 2011年12月15日 02:47:53
#ifndef _DATABASEWRITER_H_
#define _DATABASEWRITER_H_
#include "sqlite3.h"
#include <string>
#include <vector>

#define __is_exists(filename) (_access(filename, 0) != -1)

struct userdata_t
{
    int type; /// integer, string
    int length;
    void* value;
};
struct database_init_t
{
    std::string _sql_ctb;
    std::string _sql_ctbi;
    std::string _sql_insrt;
};
// 特殊数据库, 所有表相同, 对象状态不轻易发生变化
class DatabaseWriter
{
public:
    DatabaseWriter(void);
    ~DatabaseWriter(void);
    /**
    * returns: 0:succeed.
    *          1.a new DatabaseWriter file was request to open.
    *         -1.unsolved error!
    */
    int init(const char* filename, const std::vector<database_init_t>& initinfo);
    void uninit(void);

    int start(void);
    int complete(void);

    void prepare(const std::vector<database_init_t>& initinfo);
    void finalize(void);

    void step(int tabloc);
    void fillData(int tabloc, int col, const userdata_t& dat);

private:
    std::string          filename;
    sqlite3*             db;
    sqlite3_stmt**       stmts;
    unsigned int         stmt_count;
};

#endif



#include <io.h>
#include <direct.h>
#include <stdlib.h>
#include "DatabaseWriter.h"


DatabaseWriter::DatabaseWriter(void) : filename(), db(), stmts(), stmt_count()
{
}

DatabaseWriter::~DatabaseWriter(void)
{
}

int DatabaseWriter::init(const char* filename, const std::vector<database_init_t>& initinfo)
{
    if(NULL == this->db)
    {
        if(SQLITE_OK == sqlite3_open(filename, &this->db))
        {
            this->stmt_count = initinfo.size();
            this->stmts = (sqlite3_stmt**)::malloc(sizeof(sqlite3_stmt**) * this->stmt_count);
            ::memset(this->stmts, 0x0, sizeof(sqlite3_stmt**) * this->stmt_count);
            
            if(!__is_exists(filename))
            {
                for(std::vector<database_init_t>::const_iterator i = initinfo.begin(); i != initinfo.end(); ++i)
                {
                    // create table
                    sqlite3_exec(this->db, i->_sql_ctb.c_str(), NULL, NULL, NULL); 

                    // create index
                    sqlite3_exec(this->db, i->_sql_ctbi.c_str(), NULL, NULL, NULL); 
                }
            }

            this->filename = filename;
            return 0;
        }
        else { // unsolved error
            return -1;
        }
    }
    return filename == this->filename ? 0 : 1;
}

void DatabaseWriter::uninit(void)
{
    if(this->db != NULL)
    {
        ::free(this->stmts);
        this->stmts = NULL;
        sqlite3_close(this->db);
        this->db = NULL;
    }
}

int DatabaseWriter::start(void)
{
    return sqlite3_exec(this->db, "begin;", NULL, NULL, NULL);
}

int DatabaseWriter::complete(void)
{
    return sqlite3_exec(this->db, "commit;", NULL, NULL, NULL);
}

void DatabaseWriter::prepare(const std::vector<database_init_t>& initinfo)
{
    for(size_t i = 0; i < this->stmt_count; ++i)
    {
        sqlite3_prepare_v2(this->db, initinfo[i]._sql_insrt.c_str(), -1, &this->stmts[i], NULL);
    }
}

void DatabaseWriter::finalize(void)
{
    for(size_t i = 0; i < this->stmt_count; ++i)
    {
        sqlite3_finalize(this->stmts[i]);
        this->stmts[i] = 0;
    }
}

void DatabaseWriter::step(int loc)
{
    sqlite3_step(this->stmts[loc]);
    sqlite3_reset(this->stmts[loc]);
}

void DatabaseWriter::fillData(int loc, int col, const userdata_t& dat)
{
    if(dat.type == 0)
    {
        sqlite3_bind_int64(this->stmts[loc], col, *( (__int64*)dat.value ));
    }
    else {
        sqlite3_bind_blob(this->stmts[loc], col, dat.value, dat.length, NULL);
    }
}


 

#include <iostream>
#include <exception>
#include <nsconv>
#include "DatabaseWriter.h"
#pragma comment(lib, "c:\\sqlite\\sqlite3.lib")

/** 
* 一条数据插入时:
* 1.打开数据库:
*            (1)数据库文件不存在, 则打开, 并创建表
*            (2)数据库文件不存在, 则打开, 不创建表
*            (3)数据库句柄不为空, 直接返回
* 2.数据插入做准备:
*            
*/

int main(int, char**)
{
    DatabaseWriter writer;
    database_init_t initinfo;
    std::vector<database_init_t> initinfoList;
    for(int i = 0; i < 10; ++i)
    {
        initinfo._sql_ctb = "create table tb_" + std::nsc::to_string<char>(i) + "(account BIGINT)";
        initinfo._sql_insrt = "insert into tb_" + std::nsc::to_string<char>(i) + " values(?)";
        initinfoList.push_back(initinfo);
    }

    int stat = writer.init("test.db", initinfoList);
    userdata_t dat;
    dat.type = 0;
    dat.length = 8;

    /// 一次批量插入
    writer.prepare(initinfoList);
    writer.start();
    for(int i = 0; i < 20; ++i)
    {
        dat.value = new __int64(i);
        writer.fillData(i % 10, 1, dat);
        writer.step( i % 10 );
    }
    stat = writer.complete();
    writer.finalize();

    writer.uninit();

    return 0;
}


 


                    
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

sqlite高效的批量数据插入sqlite3_prepare_v2

来自http://www.cnblogs.com/stephen-liu74/archive/2012/03/07/2341480.html 在给出操作步骤之前先简单说明一下批量插入的概...

ios初学SQLite3(创建、插入、查询、更新数据库和表)

一、必备条件 在ios项目中使用sqlite需要添加  libsqlite3.dylib 库 二、简单介绍常用方法 sqlite3          *db, 数据库句柄,跟...

VC操作sqlite3数据库插入blob字段(记录)

int CVCFaceCaptureClientDlg::writeFile(SnapInfo & structSnap, char * szImagePath, int bufLen, in...

嵌入式 sqlite3数据库创建、插入、更新、查询、删除、多线程等C编程示例以及多并发完成

/* Author : kj Time : 2014-09-07 Function : josep cvr manage by sqlite3 db */ #include #...
  • skdkjxy
  • skdkjxy
  • 2014年09月12日 19:33
  • 1334

ios初学SQLite3(创建、插入、查询、更新数据库和表)

众所周知,sqlite3是ios数据存储其一,具体优点和缺点,我就不再赘述,请大家搜索之。 一、必备条件 在ios项目中使用sqlite需要添加  libsqlit...

MFC中使用sqlite3操作数据库 创建,插入数据,查询数据

需要用到的文件有sqlite3.h 、sqlite3.dll、sqlite3.lib。网上很多人分享下载地址这里不再赘述。 将这三个文件拷贝到自己新建MFC项目目录下,在解决方案窗口下 添加现有项...

基于python sqlite3将KDD-99数据集插入数据库中

转载记得标明出处 http://blog.csdn.net/isinstance/article/details/51328894今天来聊聊怎样使用python中的sqlite3模块将KDD-99数...

Sqlite3数据库用法总结:

primary key与unique的区别 : 简单的说,primary key = unique + not null primary key:不可空不可重复,在一个表里可以定义联合主键 ...

工作二总结——objective-C中sqlite3数据库的处理(其二)

#import #import "FMDB.h" const char *databasePath; const char *txtPath; int entityCount, tagCount...

工作二总结——objective-C中sqlite3数据库的处理(其一)

最近有一个小工作任务,根据一组特定格式的乱码,构造sqlite3数据库的
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sqlite3 批量插入数据库总结
举报原因:
原因补充:

(最多只允许输入30个字)