SQLite在VC环境下的使用

        SQLite在VC环境下的使用涉及到单例模式SQLite的C++接口编码转换等,这里提供一个自以为比较完善的解决方案以供参考,欢迎拍砖指导。

        注:编程环境VS2012,以动态链接方式使用SQLite(参考20110512 SQLite下载与SQLite.lib生成),本文也没有考虑多线程的问题。

1、SQLite操作类

SQLiteHelper.h

/*
** FileName     : SQLiteHelper.h
** Author       : pigautumn
** Date         : 2016/8/22
** Description  : SQLite操作单例类
*/

#pragma once

#include "sqlite3.h"

#include <string>
#include <vector>

using std::string;
using std::vector;

class SQLiteHelper
{
public:
	static SQLiteHelper& GetInstance();
	~SQLiteHelper(void);

public:
	bool IsTableExisted(const string& table_name);						//表是否存在
	bool CreateTable(const string& sql, const string& table_name);		//创建表
	bool DropTable(const string& table_name);							//删除表

	bool InsertData(const string& sql);		//插入数据
	bool UpdateData(const string& sql);		//更新数据
	bool DeleteData(const string& sql);		//删除数据

	bool GetDataCount(const string& sql, int& count);					//获取记录个数
	bool GetDataInfo(const string& sql, vector<vector<string>>& data);	//获取记录
	bool GetMaxId(const string& table_name, int& row_id);				//获取最新插入数据的ID

	const string& GetLastError() const { return m_ssErrMsg; }			//获取错误信息

public:
	void SetDBFileName(const string& file_name);	//设置数据库文件名
	void SetDBFileFolder(const string& file_path);	//设置数据库路径

private:
	SQLiteHelper(void);
	SQLiteHelper(const SQLiteHelper&);				//拷贝构造函数只声明不实现
	SQLiteHelper& operator=(const SQLiteHelper&);	//赋值函数只声明不实现

	bool OpenDB();									//打开数据库
	void CloseDB();									//关闭数据库
	bool ExcuteSQL(const string& sql);				//执行SQL语句

	static int IsTableExisted(void* para, int n_column, char** column_value, char** column_name);	//判断表是否存在

private:
	static string	m_ssErrMsg;			//错误信息
	static int		m_snResult;			//错误码
	string			m_sDBFileName;		//数据库文件名
	string			m_sDBFilePath;		//数据库文件路径
	sqlite3*		m_pDB;				//数据库指针

	string			m_sDBFileNameUtf8;	//UTF8编码数据库文件名
	string			m_sDBFilePathUtf8;	//UTF8编码数据库文件路径
	bool			m_bConvertDBFile;	//是否转换数据库名称编码
};

SQLiteHelper.cpp

#include "stdafx.h"
#include "SQLiteHelper.h"
#include "CodeConverter.h"
#include <windows.h>

#include <sstream>
using std::stringstream;

//Init static class member
string SQLiteHelper::m_ssErrMsg = "";
int SQLiteHelper::m_snResult = 0;

SQLiteHelper::SQLiteHelper(void)
	: m_pDB(NULL)
	, m_sDBFileName("data.db")
	, m_sDBFilePath(".")
	, m_bConvertDBFile(true)
{
	m_sDBFilePath = string("./") + m_sDBFileName;
}

SQLiteHelper::~SQLiteHelper(void)
{

}

SQLiteHelper& SQLiteHelper::GetInstance()
{
	static SQLiteHelper s_manager;
	return s_manager;
}

//设置数据库文件名
void SQLiteHelper::SetDBFileName(const string& file_name)
{
	m_sDBFileName = file_name;
	m_sDBFilePath = string("./") + m_sDBFileName;
	m_bConvertDBFile = true;
}

//设置数据库路径
void SQLiteHelper::SetDBFileFolder(const string& folder)
{
	if (folder.length() <= 0)
	{
		return;
	}

	if ('\\' == folder[folder.length() - 1] || '/' == folder[folder.length() - 1])
	{
		m_sDBFilePath = folder + m_sDBFileName;
	}
	else
	{
		m_sDBFilePath = folder + string("/") + m_sDBFileName;
	}

	m_bConvertDBFile = true;
}

//打开数据库,如果该数据库不存在,就创建一个数据库
bool SQLiteHelper::OpenDB()
{
	if (m_bConvertDBFile)
	{
		//将ASCII转换为UTF8(由于经常要打开数据库,因此将数据库文件名称转换为UTF8编码后保存)
		m_sDBFilePathUtf8 = CodeConverter::AsciiToUtf8(m_sDBFilePath);
		m_bConvertDBFile = false;
	}

	m_snResult = sqlite3_open(m_sDBFilePathUtf8.c_str(), &m_pDB);
	if (m_snResult != SQLITE_OK)
	{
		stringstream ss;
		ss << "Open database " << m_sDBFilePath << " failed.";
		m_ssErrMsg = ss.str();
		return false;
	}
	return true;
}

//关闭数据库
void SQLiteHelper::CloseDB()
{
	sqlite3_close(m_pDB);
}

//判断表是否存在
//para:传进回调函数的参数,n_column:字段个数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值