⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlitedb.cpp

📁 这是一个文件型数据库的学习资料
💻 CPP
字号:
/*
* Copyright (c) 2007,10#507
* All rights reserved.
* 
* 文件名称:sqliteDB.c
* 摘    要:sqlite3数据库操作封装类
* 
* 当前版本:1.0
* 完成日期:2007年11月26日
*/

#include "SQLiteDB.h"
//把数组的长度设为2048,使sql语句的长度有更大的灵活性
char tmp[2048];  //因为sqlite3的参数为char*型所以我们需要一个数组来存放string型的数据
ResultInfo* former_r;

//是否打印调试信息 调试的时候可以把ON置为1
#define ON 0
#define PRINTMSG if(ON){
#define PRINTED  }


ResultInfo::ResultInfo()
{
	PRINTMSG 
	cout<<"construct azResult"<<this->azResult<<endl;
	PRINTED
}

ResultInfo::~ResultInfo()
{
	PRINTMSG
	cout<<"executing 析构 for Result release "<<azResult<<endl;
	PRINTED
	sqlite3_free_table( azResult );//释放掉在sqlite3_get_table函数中分配的空间
	//azResult = NULL;
}

//功能说明  :连接数据库。如果数据库已经存在,则打开现有数据库,如果不存在,则新创建一个数据库
//参数说明  :string DBName 数据库名称
//返回值说明:bool类型  true 数据库打开成功
//                     false 数据库打开失败
bool SQLiteDB::openDB(string DBName)
{
	flag=0;
	memset(tmp,0,sizeof(tmp));
	strcpy(tmp,DBName.c_str());
    
	return ::sqlite3_open(tmp,&pDB)==SQLITE_OK;
}

//功能说明  :在指定的数据库中执行文件中的sql语句(文件中不能含有select语句!)
//参数说明  :string sql 执行的sql语句
//返回值说明:int类型 	-1 sql语句执行失败,同时输出错误信息
//                      0 sql语句执行成功,返回结果

int SQLiteDB::execute(string sql)
{
		char errMsg[100]("");
		memset(tmp,0,sizeof(tmp));
		strcpy(tmp,sql.c_str());
		::sqlite3_exec(pDB,tmp,0,0,(char **)&errMsg);
		if(strlen(errMsg)!=0)
		{
			PRINTMSG
			cout<<errMsg<<endl;
			PRINTED
			return -1;
		}
		else 
			return 0;
}

//功能说明  :在指定的数据库中执行select的sql语句
//参数说明  :string sql 执行的sql语句
//返回值说明:Result类型 NULL sql语句执行失败,同时输出错误信息
//                      rs   sql语句执行成功,返回Result类对象rs
/*
int sqlite3_get_table(
  sqlite3*,               An open database 
  const char *sql,        SQL to be executed 
  char ***resultp,        Result written to a char *[]  that this points to 
  int *nrow,              Number of result rows written here 
  int *ncolumn,           Number of result columns written here 
  char **errmsg           Error msg written here 
);
*/
ResultInfo* SQLiteDB::executeSelect(string sql)
{
	char errMsg[128]("");
	memset(tmp,0,sizeof(tmp));
	strcpy(tmp,sql.c_str());//把 string转化为char*
	delete former_r;
	ResultInfo *rs = new ResultInfo();
	::sqlite3_get_table(pDB,tmp,&rs->azResult,&rs->row,&rs->col,(char **)&errMsg);
	former_r = rs;
	if(strlen(errMsg)!=0)
	{
		PRINTMSG
		cout<<errMsg<<endl;
		PRINTED
		return NULL;
	}

	else
		return rs;
}

//功能说明   :关闭数据库。
//参数说明   :void 无
//返回值说明 :bool类型 true 数据库关闭成功
//                     false 数据库关闭失败
bool SQLiteDB::closeDB()
{
	flag=1;
	delete former_r;
	return sqlite3_close(pDB)!=SQLITE_BUSY;
}
//功能说明   :取得结果行数。
//参数说明   :void 无
//返回值说明 :int类型 
int ResultInfo::getResultNum()
{
	return row;
}

//功能说明   :取得指定的行列值。
//参数说明   :int型
//返回值说明 :char类型
char *ResultInfo::getAt(int arow,int acol)
{
	if(arow<=row+1&&acol<=col)
	return azResult[arow*col+acol];
	else return NULL;
}

int ResultInfo::getRowNum()
{
	return row+1;
}

int ResultInfo::getColNum()
{
	return col;
}


//功能说明  :在指定的数据库中执行文件中的sql语句(文件中不能含有select语句!)
//参数说明  :string sql 执行的sql语句
//返回值说明:int类型 	-1 sql语句执行失败,同时输出错误信息
//                      0 sql语句执行成功,返回结果
int SQLiteDB::executeSQLFromFile(string fileName)
{
	ifstream f;
	memset(tmp,0,sizeof(tmp));
	strcpy(tmp,fileName.c_str());
	f.open(tmp);
	string sql("");
	//打开的SQL脚本文件最大不超过65536个字符
	char temp[65536]("");
	while(!f.eof())
	{	
		sql+=temp;
		f.getline(temp,10000);
		
	}
	char errMsg[100];
	::sqlite3_exec(pDB,sql.c_str(),0,0,(char **)&errMsg);
	if(strlen(errMsg)!=0)
	{
		cout<<errMsg<<endl;
		return -1;
	}
	else 
		return 0;
}

SQLiteDB::~SQLiteDB()
{
	//如果数据库没有关闭,就将其关闭
	if(flag==0)
		this->closeDB();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -