SQLite C++操作类

为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码。代码如下:


头文件(SQLite.h)

  1. /********************************************************************
  2. filename:SQLite.h
  3. created:2012-11-05
  4. author:firehood
  5. purpose:SQLite数据库操作类
  6. *********************************************************************/
  7. #pragmaonce
  8. #include<windows.h>
  9. #include"..\SQLite\sqlite3.h"
  10. #pragmacomment(lib,"SQLite.lib")
  11. typedefBOOL(WINAPI*QueryCallback)(void*para,intn_column,char**column_value,char**column_name);
  12. typedefenum_SQLITE_DATATYPE
  13. {
  14. SQLITE_DATATYPE_INTEGER=SQLITE_INTEGER,
  15. SQLITE_DATATYPE_FLOAT=SQLITE_FLOAT,
  16. SQLITE_DATATYPE_TEXT=SQLITE_TEXT,
  17. SQLITE_DATATYPE_BLOB=SQLITE_BLOB,
  18. SQLITE_DATATYPE_NULL=SQLITE_NULL,
  19. }SQLITE_DATATYPE;
  20. classSQLite;
  21. classSQLiteDataReader
  22. {
  23. public:
  24. SQLiteDataReader(sqlite3_stmt*pStmt);
  25. ~SQLiteDataReader();
  26. public:
  27. //读取一行数据
  28. BOOLRead();
  29. //关闭Reader,读取结束后调用
  30. voidClose();
  31. //总的列数
  32. intColumnCount(void);
  33. //获取某列的名称
  34. LPCTSTRGetName(intnCol);
  35. //获取某列的数据类型
  36. SQLITE_DATATYPEGetDataType(intnCol);
  37. //获取某列的值(字符串)
  38. LPCTSTRGetStringValue(intnCol);
  39. //获取某列的值(整形)
  40. intGetIntValue(intnCol);
  41. //获取某列的值(长整形)
  42. longGetInt64Value(intnCol);
  43. //获取某列的值(浮点形)
  44. doubleGetFloatValue(intnCol);
  45. //获取某列的值(二进制数据)
  46. constBYTE*GetBlobValue(intnCol,int&nLen);
  47. private:
  48. sqlite3_stmt*m_pStmt;
  49. };
  50. classSQLiteCommand
  51. {
  52. public:
  53. SQLiteCommand(SQLite*pSqlite);
  54. SQLiteCommand(SQLite*pSqlite,LPCTSTRlpSql);
  55. ~SQLiteCommand();
  56. public:
  57. //设置命令
  58. BOOLSetCommandText(LPCTSTRlpSql);
  59. //绑定参数(index为要绑定参数的序号,从1开始)
  60. BOOLBindParam(intindex,LPCTSTRszValue);
  61. BOOLBindParam(intindex,constintnValue);
  62. BOOLBindParam(intindex,constdoubledValue);
  63. BOOLBindParam(intindex,constunsignedchar*blobValue,intnLen);
  64. //执行命令
  65. BOOLExcute();
  66. //清除命令(命令不再使用时需调用该接口清除)
  67. voidClear();
  68. private:
  69. SQLite*m_pSqlite;
  70. sqlite3_stmt*m_pStmt;
  71. };
  72. classSQLite
  73. {
  74. public:
  75. SQLite(void);
  76. ~SQLite(void);
  77. public:
  78. //打开数据库
  79. BOOLOpen(LPCTSTRlpDbFlie);
  80. //关闭数据库
  81. voidClose();
  82. //执行非查询操作(更新或删除)
  83. BOOLExcuteNonQuery(LPCTSTRlpSql);
  84. BOOLExcuteNonQuery(SQLiteCommand*pCmd);
  85. //查询
  86. SQLiteDataReaderExcuteQuery(LPCTSTRlpSql);
  87. //查询(回调方式)
  88. BOOLExcuteQuery(LPCTSTRlpSql,QueryCallbackpCallBack);
  89. //开始事务
  90. BOOLBeginTransaction();
  91. //提交事务
  92. BOOLCommitTransaction();
  93. //回滚事务
  94. BOOLRollbackTransaction();
  95. //获取上一条错误信息
  96. LPCTSTRGetLastErrorMsg();
  97. public:
  98. friendclassSQLiteCommand;
  99. private:
  100. sqlite3*m_db;
  101. };
/********************************************************************
filename: 	SQLite.h
created:	2012-11-05
author:		firehood

purpose:	SQLite数据库操作类
*********************************************************************/
#pragma once
#include <windows.h>
#include "..\SQLite\sqlite3.h" 
#pragma comment(lib,"SQLite.lib") 

typedef BOOL (WINAPI *QueryCallback) (void *para, int n_column, char **column_value, char **column_name);

typedef enum _SQLITE_DATATYPE
{
	SQLITE_DATATYPE_INTEGER = SQLITE_INTEGER,
	SQLITE_DATATYPE_FLOAT  = SQLITE_FLOAT,
	SQLITE_DATATYPE_TEXT  = SQLITE_TEXT,
	SQLITE_DATATYPE_BLOB = SQLITE_BLOB,
	SQLITE_DATATYPE_NULL= SQLITE_NULL,
}SQLITE_DATATYPE;

class SQLite;

class SQLiteDataReader
{
public:
	SQLiteDataReader(sqlite3_stmt *pStmt);
	~SQLiteDataReader();
public:
	// 读取一行数据
	BOOL Read();
	// 关闭Reader,读取结束后调用
	void Close();
	// 总的列数
    int ColumnCount(void);
	// 获取某列的名称 
	LPCTSTR GetName(int nCol);
	// 获取某列的数据类型
	SQLITE_DATATYPE GetDataType(int nCol);
	// 获取某列的值(字符串)
	LPCTSTR GetStringValue(int nCol);
	// 获取某列的值(整形)
	int GetIntValue(int nCol);
	// 获取某列的值(长整形)
	long GetInt64Value(int nCol);
	// 获取某列的值(浮点形)
	double GetFloatValue(int nCol);
	// 获取某列的值(二进制数据)
	const BYTE* GetBlobValue(int nCol, int &nLen);
private:
	sqlite3_stmt *m_pStmt;
};

class SQLiteCommand
{
public:
	SQLiteCommand(SQLite* pSqlite);
	SQLiteCommand(SQLite* pSqlite,LPCTSTR lpSql);
	~SQLiteCommand();
public:
	// 设置命令
	BOOL SetCommandText(LPCTSTR lpSql);
	// 绑定参数(index为要绑定参数的序号,从1开始)
	BOOL BindParam(int index, LPCTSTR szValue);
	BOOL BindParam(int index, const int nValue);
	BOOL BindParam(int index, const double dValue);
	BOOL BindParam(int index, const unsigned char* blobValue, int nLen);
	// 执行命令
	BOOL Excute();
	// 清除命令(命令不再使用时需调用该接口清除)
	void Clear();
private:
	SQLite *m_pSqlite;
	sqlite3_stmt *m_pStmt;
};

class SQLite
{
public:
	SQLite(void);
	~SQLite(void);
public:
	// 打开数据库
    BOOL Open(LPCTSTR lpDbFlie);
	// 关闭数据库
	void Close();

    // 执行非查询操作(更新或删除)
	BOOL ExcuteNonQuery(LPCTSTR lpSql);
	BOOL ExcuteNonQuery(SQLiteCommand* pCmd);

    // 查询
	SQLiteDataReader ExcuteQuery(LPCTSTR lpSql);
	// 查询(回调方式)
	BOOL ExcuteQuery(LPCTSTR lpSql,QueryCallback pCallBack);

	// 开始事务
	BOOL BeginTransaction();
	// 提交事务
	BOOL CommitTransaction();
	// 回滚事务
	BOOL RollbackTransaction();

	// 获取上一条错误信息
	LPCTSTR GetLastErrorMsg();
public:
	friend class SQLiteCommand;
private:
	sqlite3 *m_db;
};


源文件(SQLite.cpp)

  1. /********************************************************************
  2. filename:SQLite.cpp
  3. created:2012-11-05
  4. author:firehood
  5. purpose:SQLite数据库操作类
  6. *********************************************************************/
  7. #include"SQLite.h"
  8. constchar*WcharToUtf8(constwchar_t*pwStr)
  9. {
  10. if(pwStr==NULL)
  11. {
  12. returnNULL;
  13. }
  14. intlen=WideCharToMultiByte(CP_UTF8,0,pwStr,-1,NULL,0,NULL,NULL);
  15. if(len<=0)
  16. {
  17. returnNULL;
  18. }
  19. char*pStr=newchar[len];
  20. WideCharToMultiByte(CP_UTF8,0,pwStr,-1,pStr,len,NULL,NULL);
  21. returnpStr;
  22. }
  23. constwchar_t*Utf8ToWchar(constchar*pStr)
  24. {
  25. if(pStr==NULL)
  26. {
  27. returnNULL;
  28. }
  29. intlen=MultiByteToWideChar(CP_UTF8,0,pStr,-1,NULL,0);
  30. if(len<=0)
  31. {
  32. returnNULL;
  33. }
  34. wchar_t*pwStr=newwchar_t[len];
  35. MultiByteToWideChar(CP_UTF8,0,pStr,-1,pwStr,len);
  36. returnpwStr;
  37. }
  38. SQLite::SQLite(void):
  39. m_db(NULL)
  40. {
  41. }
  42. SQLite::~SQLite(void)
  43. {
  44. Close();
  45. }
  46. BOOLSQLite::Open(LPCTSTRlpDbFlie)
  47. {
  48. if(lpDbFlie==NULL)
  49. {
  50. returnFALSE;
  51. }
  52. #ifdefUNICODE
  53. if(sqlite3_open16(lpDbFlie,&m_db)!=SQLITE_OK)
  54. #else
  55. if(sqlite3_open(lpDbFlie,&m_db)!=SQLITE_OK)
  56. #endif
  57. {
  58. returnFALSE;
  59. }
  60. returnTRUE;
  61. }
  62. voidSQLite::Close()
  63. {
  64. if(m_db)
  65. {
  66. sqlite3_close(m_db);
  67. m_db=NULL;
  68. }
  69. }
  70. BOOLSQLite::ExcuteNonQuery(LPCTSTRlpSql)
  71. {
  72. if(lpSql==NULL)
  73. {
  74. returnFALSE;
  75. }
  76. sqlite3_stmt*stmt;
  77. #ifdefUNICODE
  78. if(sqlite3_prepare16_v2(m_db,lpSql,-1,&stmt,NULL)!=SQLITE_OK)
  79. #else
  80. if(sqlite3_prepare_v2(m_db,lpSql,-1,&stmt,NULL)!=SQLITE_OK)
  81. #endif
  82. {
  83. returnFALSE;
  84. }
  85. sqlite3_step(stmt);
  86. return(sqlite3_finalize(stmt)==SQLITE_OK)?TRUE:FALSE;
  87. }
  88. BOOLSQLite::ExcuteNonQuery(SQLiteCommand*pCmd)
  89. {
  90. if(pCmd==NULL)
  91. {
  92. returnFALSE;
  93. }
  94. returnpCmd->Excute();
  95. }
  96. //查询(回调方式)
  97. BOOLSQLite::ExcuteQuery(LPCTSTRlpSql,QueryCallbackpCallBack)
  98. {
  99. if(lpSql==NULL||pCallBack==NULL)
  100. {
  101. returnFALSE;
  102. }
  103. char*errmsg=NULL;
  104. #ifdefUNICODE
  105. constchar*szSql=WcharToUtf8(lpSql);
  106. if(sqlite3_exec(m_db,szSql,pCallBack,NULL,&errmsg)!=SQLITE_OK)
  107. {
  108. delete[]szSql;
  109. returnFALSE;
  110. }
  111. delete[]szSql;
  112. #else
  113. if(sqlite3_exec(m_db,lpSql,pCallBack,NULL,&errmsg)!=SQLITE_OK)
  114. {
  115. returnFALSE;
  116. }
  117. #endif
  118. returnTRUE;
  119. }
  120. //查询
  121. SQLiteDataReaderSQLite::ExcuteQuery(LPCTSTRlpSql)
  122. {
  123. if(lpSql==NULL)
  124. {
  125. returnFALSE;
  126. }
  127. sqlite3_stmt*stmt;
  128. #ifdefUNICODE
  129. if(sqlite3_prepare16_v2(m_db,lpSql,-1,&stmt,NULL)!=SQLITE_OK)
  130. #else
  131. if(sqlite3_prepare_v2(m_db,lpSql,-1,&stmt,NULL)!=SQLITE_OK)
  132. #endif
  133. {
  134. returnFALSE;
  135. }
  136. returnSQLiteDataReader(stmt);
  137. }
  138. //开始事务
  139. BOOLSQLite::BeginTransaction()
  140. {
  141. char*errmsg=NULL;
  142. if(sqlite3_exec(m_db,"BEGINTRANSACTION;",NULL,NULL,&errmsg)!=SQLITE_OK)
  143. {
  144. returnFALSE;
  145. }
  146. returnTRUE;
  147. }
  148. //提交事务
  149. BOOLSQLite::CommitTransaction()
  150. {
  151. char*errmsg=NULL;
  152. if(sqlite3_exec(m_db,"COMMITTRANSACTION;;",NULL,NULL,&errmsg)!=SQLITE_OK)
  153. {
  154. returnFALSE;
  155. }
  156. returnTRUE;
  157. }
  158. //回滚事务
  159. BOOLSQLite::RollbackTransaction()
  160. {
  161. char*errmsg=NULL;
  162. if(sqlite3_exec(m_db,"ROLLBACKTRANSACTION;",NULL,NULL,&errmsg)!=SQLITE_OK)
  163. {
  164. returnFALSE;
  165. }
  166. returnTRUE;
  167. }
  168. //获取上一条错误信息
  169. LPCTSTRSQLite::GetLastErrorMsg()
  170. {
  171. #ifdefUNICODE
  172. return(LPCTSTR)sqlite3_errmsg16(m_db);
  173. #else
  174. returnsqlite3_errmsg(m_db);
  175. #endif
  176. }
  177. SQLiteDataReader::SQLiteDataReader(sqlite3_stmt*pStmt):
  178. m_pStmt(pStmt)
  179. {
  180. }
  181. SQLiteDataReader::~SQLiteDataReader()
  182. {
  183. Close();
  184. }
  185. //读取一行数据
  186. BOOLSQLiteDataReader::Read()
  187. {
  188. if(m_pStmt==NULL)
  189. {
  190. returnFALSE;
  191. }
  192. if(sqlite3_step(m_pStmt)!=SQLITE_ROW)
  193. {
  194. returnFALSE;
  195. }
  196. returnTRUE;
  197. }
  198. //关闭Reader,读取结束后调用
  199. voidSQLiteDataReader::Close()
  200. {
  201. if(m_pStmt)
  202. {
  203. sqlite3_finalize(m_pStmt);
  204. m_pStmt=NULL;
  205. }
  206. }
  207. //总的列数
  208. intSQLiteDataReader::ColumnCount(void)
  209. {
  210. returnsqlite3_column_count(m_pStmt);
  211. }
  212. //获取某列的名称
  213. LPCTSTRSQLiteDataReader::GetName(intnCol)
  214. {
  215. #ifdefUNICODE
  216. return(LPCTSTR)sqlite3_column_name16(m_pStmt,nCol);
  217. #else
  218. return(LPCTSTR)sqlite3_column_name(m_pStmt,nCol);
  219. #endif
  220. }
  221. //获取某列的数据类型
  222. SQLITE_DATATYPESQLiteDataReader::GetDataType(intnCol)
  223. {
  224. return(SQLITE_DATATYPE)sqlite3_column_type(m_pStmt,nCol);
  225. }
  226. //获取某列的值(字符串)
  227. LPCTSTRSQLiteDataReader::GetStringValue(intnCol)
  228. {
  229. #ifdefUNICODE
  230. return(LPCTSTR)sqlite3_column_text16(m_pStmt,nCol);
  231. #else
  232. return(LPCTSTR)sqlite3_column_text(m_pStmt,nCol);
  233. #endif
  234. }
  235. //获取某列的值(整形)
  236. intSQLiteDataReader::GetIntValue(intnCol)
  237. {
  238. returnsqlite3_column_int(m_pStmt,nCol);
  239. }
  240. //获取某列的值(长整形)
  241. longSQLiteDataReader::GetInt64Value(intnCol)
  242. {
  243. return(long)sqlite3_column_int64(m_pStmt,nCol);
  244. }
  245. //获取某列的值(浮点形)
  246. doubleSQLiteDataReader::GetFloatValue(intnCol)
  247. {
  248. returnsqlite3_column_double(m_pStmt,nCol);
  249. }
  250. //获取某列的值(二进制数据)
  251. constBYTE*SQLiteDataReader::GetBlobValue(intnCol,int&nLen)
  252. {
  253. nLen=sqlite3_column_bytes(m_pStmt,nCol);
  254. return(constBYTE*)sqlite3_column_blob(m_pStmt,nCol);
  255. }
  256. SQLiteCommand::SQLiteCommand(SQLite*pSqlite):
  257. m_pSqlite(pSqlite),
  258. m_pStmt(NULL)
  259. {
  260. }
  261. SQLiteCommand::SQLiteCommand(SQLite*pSqlite,LPCTSTRlpSql):
  262. m_pSqlite(pSqlite),
  263. m_pStmt(NULL)
  264. {
  265. SetCommandText(lpSql);
  266. }
  267. SQLiteCommand::~SQLiteCommand()
  268. {
  269. }
  270. BOOLSQLiteCommand::SetCommandText(LPCTSTRlpSql)
  271. {
  272. #ifdefUNICODE
  273. if(sqlite3_prepare16_v2(m_pSqlite->m_db,lpSql,-1,&m_pStmt,NULL)!=SQLITE_OK)
  274. #else
  275. if(sqlite3_prepare_v2(m_pSqlite->m_db,lpSql,-1,&m_pStmt,NULL)!=SQLITE_OK)
  276. #endif
  277. {
  278. returnFALSE;
  279. }
  280. returnTRUE;
  281. }
  282. BOOLSQLiteCommand::BindParam(intindex,LPCTSTRszValue)
  283. {
  284. #ifdefUNICODE
  285. if(sqlite3_bind_text16(m_pStmt,index,szValue,-1,SQLITE_TRANSIENT)!=SQLITE_OK)
  286. #else
  287. if(sqlite3_bind_text(m_pStmt,index,szValue,-1,SQLITE_TRANSIENT)!=SQLITE_OK)
  288. #endif
  289. {
  290. returnFALSE;
  291. }
  292. returnTRUE;
  293. }
  294. BOOLSQLiteCommand::BindParam(intindex,constintnValue)
  295. {
  296. if(sqlite3_bind_int(m_pStmt,index,nValue)!=SQLITE_OK)
  297. {
  298. returnFALSE;
  299. }
  300. returnTRUE;
  301. }
  302. BOOLSQLiteCommand::BindParam(intindex,constdoubledValue)
  303. {
  304. if(sqlite3_bind_double(m_pStmt,index,dValue)!=SQLITE_OK)
  305. {
  306. returnFALSE;
  307. }
  308. returnTRUE;
  309. }
  310. BOOLSQLiteCommand::BindParam(intindex,constunsignedchar*blobBuf,intnLen)
  311. {
  312. if(sqlite3_bind_blob(m_pStmt,index,blobBuf,nLen,NULL)!=SQLITE_OK)
  313. {
  314. returnFALSE;
  315. }
  316. returnTRUE;
  317. }
  318. BOOLSQLiteCommand::Excute()
  319. {
  320. sqlite3_step(m_pStmt);
  321. return(sqlite3_reset(m_pStmt)==SQLITE_OK)?TRUE:FALSE;
  322. }
  323. voidSQLiteCommand::Clear()
  324. {
  325. if(m_pStmt)
  326. {
  327. sqlite3_finalize(m_pStmt);
  328. }
  329. }
/********************************************************************
filename: 	SQLite.cpp
created:	2012-11-05
author:		firehood

purpose:	SQLite数据库操作类
*********************************************************************/
#include "SQLite.h"

const char* WcharToUtf8(const wchar_t *pwStr)
{
	if (pwStr == NULL)
	{
		return NULL;
	}

	int len = WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, NULL, 0, NULL, NULL);
	if (len <= 0)
	{
		return NULL;
	}
	char *pStr = new char[len];
	WideCharToMultiByte(CP_UTF8, 0, pwStr, -1, pStr, len, NULL, NULL);
	return pStr;
}

const wchar_t* Utf8ToWchar(const char *pStr)
{
	if (pStr == NULL)
	{
		return NULL;
	}

	int len = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0);
	if (len <= 0)
	{
		return NULL;
	}
	wchar_t *pwStr = new wchar_t[len];
	MultiByteToWideChar(CP_UTF8, 0, pStr, -1, pwStr, len);
	return pwStr;
}

SQLite::SQLite(void):
m_db(NULL)
{
}

SQLite::~SQLite(void)
{
	Close();
}

BOOL SQLite::Open(LPCTSTR lpDbFlie)
{
	if(lpDbFlie == NULL)
	{
		return FALSE;
	}
#ifdef  UNICODE 
	if(sqlite3_open16(lpDbFlie,&m_db) != SQLITE_OK)
#else
    if(sqlite3_open(lpDbFlie,&m_db) != SQLITE_OK)
#endif
	{
		return FALSE;
	}
	return TRUE;
}

void SQLite::Close()
{
	if(m_db)
	{
		sqlite3_close(m_db);
		m_db = NULL;
	}
}

BOOL SQLite::ExcuteNonQuery(LPCTSTR lpSql)
{
	if(lpSql == NULL)
	{
		return FALSE;
	}
    sqlite3_stmt* stmt;  
#ifdef  UNICODE 
	if(sqlite3_prepare16_v2(m_db, lpSql, -1, &stmt, NULL) != SQLITE_OK)
#else
    if(sqlite3_prepare_v2(m_db, lpSql, -1, &stmt, NULL) != SQLITE_OK)
#endif
	{ 
		return FALSE;  
	}  
	sqlite3_step(stmt);
	
	return (sqlite3_finalize(stmt) == SQLITE_OK) ? TRUE : FALSE ;
}

BOOL SQLite::ExcuteNonQuery(SQLiteCommand* pCmd)
{
	if(pCmd == NULL)
	{
		return FALSE;
	}
	return pCmd->Excute();
}

// 查询(回调方式)
BOOL SQLite::ExcuteQuery(LPCTSTR lpSql,QueryCallback pCallBack)
{
	if(lpSql == NULL || pCallBack == NULL)
	{
		return FALSE;
	}
	char *errmsg = NULL;
#ifdef  UNICODE 
	const char *szSql = WcharToUtf8(lpSql);
	if(sqlite3_exec(m_db, szSql, pCallBack, NULL, &errmsg) != SQLITE_OK)
	{
		delete[] szSql;
		return FALSE;
	} 
    delete[] szSql;
#else
	if(sqlite3_exec(m_db, lpSql, pCallBack, NULL, &errmsg) != SQLITE_OK)
	{
		return FALSE;
	} 
#endif
	return TRUE;
}

// 查询
SQLiteDataReader SQLite::ExcuteQuery(LPCTSTR lpSql)
{
	if(lpSql == NULL)
	{
		return FALSE;
	}
    sqlite3_stmt* stmt; 
#ifdef  UNICODE 
	if(sqlite3_prepare16_v2(m_db, lpSql, -1, &stmt, NULL) != SQLITE_OK)
#else
	if(sqlite3_prepare_v2(m_db, lpSql, -1, &stmt, NULL) != SQLITE_OK)
#endif
	{ 
		return FALSE;  
	}  
	return SQLiteDataReader(stmt);
}

// 开始事务
BOOL SQLite::BeginTransaction()
{
	char * errmsg = NULL;
    if(sqlite3_exec(m_db,"BEGIN TRANSACTION;",NULL,NULL,&errmsg) != SQLITE_OK)
	{
		return FALSE;
	} 
	return TRUE;
}

// 提交事务
BOOL SQLite::CommitTransaction()
{
	char * errmsg = NULL;
	if(sqlite3_exec(m_db,"COMMIT TRANSACTION;;",NULL,NULL,&errmsg) != SQLITE_OK)
	{
		return FALSE;
	} 
	return TRUE;
}

// 回滚事务
BOOL SQLite::RollbackTransaction()
{
	char * errmsg = NULL;
	if(sqlite3_exec(m_db,"ROLLBACK  TRANSACTION;",NULL,NULL,&errmsg) != SQLITE_OK)
	{
		return FALSE;
	} 
	return TRUE;
}

// 获取上一条错误信息
LPCTSTR SQLite::GetLastErrorMsg()
{
#ifdef UNICODE 
	return (LPCTSTR)sqlite3_errmsg16(m_db);
#else
    return sqlite3_errmsg(m_db);
#endif
}



SQLiteDataReader::SQLiteDataReader(sqlite3_stmt *pStmt):
m_pStmt(pStmt)
{

}

SQLiteDataReader::~SQLiteDataReader()
{
	Close();
}

// 读取一行数据
BOOL SQLiteDataReader::Read()
{
	if(m_pStmt == NULL)
	{
		return FALSE;
	}
	if(sqlite3_step(m_pStmt) != SQLITE_ROW)
	{
		return FALSE;
	}
	return TRUE;
}

// 关闭Reader,读取结束后调用
void SQLiteDataReader::Close()
{
	if(m_pStmt)
	{
		sqlite3_finalize(m_pStmt);
		m_pStmt = NULL;
	}
}

// 总的列数
int SQLiteDataReader::ColumnCount(void)
{
	return sqlite3_column_count(m_pStmt);
}

// 获取某列的名称 
LPCTSTR SQLiteDataReader::GetName(int nCol)
{
#ifdef  UNICODE 
	return (LPCTSTR)sqlite3_column_name16(m_pStmt, nCol);
#else
	return (LPCTSTR)sqlite3_column_name(m_pStmt, nCol);
#endif
}

// 获取某列的数据类型
SQLITE_DATATYPE SQLiteDataReader::GetDataType(int nCol)
{
	return (SQLITE_DATATYPE)sqlite3_column_type(m_pStmt, nCol);
}

// 获取某列的值(字符串)
LPCTSTR SQLiteDataReader::GetStringValue(int nCol)
{
#ifdef  UNICODE 
	return (LPCTSTR)sqlite3_column_text16(m_pStmt, nCol);
#else
    return (LPCTSTR)sqlite3_column_text(m_pStmt, nCol);
#endif
}

// 获取某列的值(整形)
int SQLiteDataReader::GetIntValue(int nCol)
{
	return sqlite3_column_int(m_pStmt, nCol);
}

// 获取某列的值(长整形)
long SQLiteDataReader::GetInt64Value(int nCol)
{
	return (long)sqlite3_column_int64(m_pStmt, nCol);
}

// 获取某列的值(浮点形)
double SQLiteDataReader::GetFloatValue(int nCol)
{
	return sqlite3_column_double(m_pStmt, nCol);
}

// 获取某列的值(二进制数据)
const BYTE* SQLiteDataReader::GetBlobValue(int nCol, int &nLen)
{
	nLen = sqlite3_column_bytes(m_pStmt, nCol);
	return (const BYTE*)sqlite3_column_blob(m_pStmt, nCol);
}

SQLiteCommand::SQLiteCommand(SQLite* pSqlite):
m_pSqlite(pSqlite),
m_pStmt(NULL)
{
}

SQLiteCommand::SQLiteCommand(SQLite* pSqlite,LPCTSTR lpSql):
m_pSqlite(pSqlite),
m_pStmt(NULL)
{
	SetCommandText(lpSql);
}

SQLiteCommand::~SQLiteCommand()
{

}

BOOL SQLiteCommand::SetCommandText(LPCTSTR lpSql)
{
#ifdef  UNICODE 
	if(sqlite3_prepare16_v2(m_pSqlite->m_db, lpSql, -1, &m_pStmt, NULL) != SQLITE_OK)
#else
	if(sqlite3_prepare_v2(m_pSqlite->m_db, lpSql, -1, &m_pStmt, NULL) != SQLITE_OK)
#endif
	{ 
		return FALSE;  
	}  
	return TRUE;
}

BOOL SQLiteCommand::BindParam(int index, LPCTSTR szValue)
{
#ifdef  UNICODE 
	if(sqlite3_bind_text16(m_pStmt, index, szValue, -1, SQLITE_TRANSIENT) != SQLITE_OK)
#else
    if(sqlite3_bind_text(m_pStmt, index, szValue,-1, SQLITE_TRANSIENT) != SQLITE_OK)
#endif
	{
		return FALSE;
	}
	return TRUE;
}

BOOL SQLiteCommand::BindParam(int index, const int nValue)
{
	if(sqlite3_bind_int(m_pStmt, index, nValue) != SQLITE_OK)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL SQLiteCommand::BindParam(int index, const double dValue)
{
	if(sqlite3_bind_double(m_pStmt, index, dValue) != SQLITE_OK)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL SQLiteCommand::BindParam(int index, const unsigned char* blobBuf, int nLen)
{
	if(sqlite3_bind_blob(m_pStmt, index, blobBuf,nLen,NULL) != SQLITE_OK)
	{
		return FALSE;
	}
	return TRUE;
}

BOOL SQLiteCommand::Excute()
{
	sqlite3_step(m_pStmt);

	return (sqlite3_reset(m_pStmt) == SQLITE_OK) ? TRUE : FALSE ;
}

void SQLiteCommand::Clear()
{
	if(m_pStmt)
	{
		sqlite3_finalize(m_pStmt);
	}
}


使用方法

通过SQLite类操作数据库的基本代码如下:

  1. voidSqliteOperate()
  2. {
  3. TCHAR*szDbPath=_T("Book.db");
  4. ::DeleteFile(szDbPath);
  5. SQLitesqlite;
  6. //打开或创建数据库
  7. //******************************************************
  8. if(!sqlite.Open(szDbPath))
  9. {
  10. _tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
  11. return;
  12. }
  13. //******************************************************
  14. //创建数据库表
  15. //******************************************************
  16. TCHARsql[512]={0};
  17. _stprintf(sql,_T("%s"),
  18. _T("CREATETABLE[Book](")
  19. _T("[id]INTEGERNOTNULLPRIMARYKEY,")
  20. _T("[name]NVARCHAR(20),")
  21. _T("[author]NVARCHAR(20),")
  22. _T("[catagory_id]INTEGERREFERENCES[Category]([id]),")
  23. _T("[abstruct]NVARCHAR(100),")
  24. _T("[path]NVARCHAR(50),")
  25. _T("[image]BLOB);")
  26. _T("CREATEINDEX[Book_id]ON[Book]([id]);")
  27. );
  28. if(!sqlite.ExcuteNonQuery(sql))
  29. {
  30. printf("Createdatabasetablefailed...\n");
  31. }
  32. //******************************************************
  33. //插入数据【普通方式】
  34. DWORDdwBeginTick=GetTickCount();
  35. //******************************************************
  36. //当一次性插入多条记录时候,采用事务的方式,提高效率
  37. sqlite.BeginTransaction();
  38. //批量插入数据
  39. for(inti=0;i<1000;i++)
  40. {
  41. memset(sql,0,sizeof(sql));
  42. _stprintf(sql,_T("insertintoBook(name,author,catagory_id)values('红高粱%d','莫言',1)"),i);
  43. if(!sqlite.ExcuteNonQuery(sql))
  44. {
  45. _tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
  46. break;
  47. }
  48. }
  49. //提交事务
  50. sqlite.CommitTransaction();
  51. printf("InsertDataTake%dMS...\n",GetTickCount()-dwBeginTick);
  52. //******************************************************
  53. //插入数据【通过参数绑定的方式,提交批量数据时,比上面的普通模式效率更高(提高约45%),同时可支持插入二进制数据】
  54. dwBeginTick=GetTickCount();
  55. //******************************************************
  56. //当一次性插入多条记录时候,采用事务的方式,提高效率
  57. sqlite.BeginTransaction();
  58. memset(sql,0,sizeof(sql));
  59. _stprintf(sql,_T("insertintoBook(name,author,catagory_id,image)values(?,'韩寒',?,?)"));
  60. SQLiteCommandcmd(&sqlite,sql);
  61. //批量插入数据
  62. for(inti=0;i<1000;i++)
  63. {
  64. TCHARstrValue[16]={0};
  65. _stprintf(strValue,_T("他的国%d"),i);
  66. //绑定第一个参数(name字段值)
  67. cmd.BindParam(1,strValue);
  68. //绑定第二个参数(catagory_id字段值)
  69. cmd.BindParam(2,20);
  70. BYTEimageBuf[]={0xff,0xff,0xff,0xff};
  71. //绑定第三个参数(image字段值,二进制数据)
  72. cmd.BindParam(3,imageBuf,sizeof(imageBuf));
  73. if(!sqlite.ExcuteNonQuery(&cmd))
  74. {
  75. _tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
  76. break;
  77. }
  78. }
  79. //清空cmd
  80. cmd.Clear();
  81. //提交事务
  82. sqlite.CommitTransaction();
  83. printf("InsertDataTake%dMS...\n",GetTickCount()-dwBeginTick);
  84. //******************************************************
  85. //查询
  86. dwBeginTick=GetTickCount();
  87. //******************************************************
  88. memset(sql,0,sizeof(sql));
  89. _stprintf(sql,_T("%s"),_T("select*fromBookwherename='他的国345'"));
  90. SQLiteDataReaderReader=sqlite.ExcuteQuery(sql);
  91. intindex=0;
  92. intlen=0;
  93. while(Reader.Read())
  94. {
  95. _tprintf(_T("***************【第%d条记录】***************\n"),++index);
  96. _tprintf(_T("字段名:%s字段值:%d\n"),Reader.GetName(0),Reader.GetIntValue(0));
  97. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(1),Reader.GetStringValue(1));
  98. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(2),Reader.GetStringValue(2));
  99. _tprintf(_T("字段名:%s字段值:%d\n"),Reader.GetName(3),Reader.GetIntValue(3));
  100. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(4),Reader.GetStringValue(4));
  101. //读取图片二进制文件
  102. constBYTE*ImageBuf=Reader.GetBlobValue(6,len);
  103. _tprintf(_T("*******************************************\n"));
  104. }
  105. Reader.Close();
  106. printf("QueryTake%dMS...\n",GetTickCount()-dwBeginTick);
  107. //******************************************************
  108. //关闭数据库
  109. sqlite.Close();
  110. }
void SqliteOperate()
{
	TCHAR *szDbPath = _T("Book.db");

	::DeleteFile(szDbPath);

	SQLite sqlite;

	// 打开或创建数据库
	//******************************************************
	if(!sqlite.Open(szDbPath))
	{
		_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
		return;
	}
    //******************************************************

	// 创建数据库表
    //******************************************************
	TCHAR sql[512] = {0};
	_stprintf(sql,_T("%s"),
		_T("CREATE TABLE [Book] (")
		_T("[id] INTEGER NOT NULL PRIMARY KEY, ")
		_T("[name] NVARCHAR(20), ")
		_T("[author] NVARCHAR(20), ")
		_T("[catagory_id] INTEGER REFERENCES [Category]([id]), ")
		_T("[abstruct] NVARCHAR(100) ,")
		_T("[path] NVARCHAR(50), ")
		_T("[image] BLOB);")
		_T("CREATE INDEX [Book_id] ON [Book] ([id]);")
		);
	if(!sqlite.ExcuteNonQuery(sql))
	{
		printf("Create database table failed...\n");
	}
	//******************************************************

	// 插入数据【普通方式】
	DWORD dwBeginTick = GetTickCount();
	//******************************************************
	// 当一次性插入多条记录时候,采用事务的方式,提高效率
	sqlite.BeginTransaction();
	// 批量插入数据
	for(int i=0;i<1000;i++)
	{
		memset(sql,0,sizeof(sql));
		_stprintf(sql,_T("insert into Book(name,author,catagory_id) values('红高粱%d','莫言',1)"),i);
		if(!sqlite.ExcuteNonQuery(sql))
		{
			_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
			break;
		}
	}
	// 提交事务
	sqlite.CommitTransaction();
	printf("Insert Data Take %dMS...\n",GetTickCount()-dwBeginTick);
    //******************************************************


	// 插入数据【通过参数绑定的方式,提交批量数据时,比上面的普通模式效率更高(提高约45%),同时可支持插入二进制数据】
	dwBeginTick = GetTickCount();
    //******************************************************
	// 当一次性插入多条记录时候,采用事务的方式,提高效率
	sqlite.BeginTransaction();
	memset(sql,0,sizeof(sql));
	_stprintf(sql,_T("insert into Book(name,author,catagory_id,image) values(?,'韩寒',?,?)"));
	SQLiteCommand cmd(&sqlite,sql);
	// 批量插入数据
	for(int i=0;i<1000;i++)
	{
		TCHAR strValue[16] = {0};
		_stprintf(strValue,_T("他的国%d"),i);
		// 绑定第一个参数(name字段值)
		cmd.BindParam(1,strValue);
		// 绑定第二个参数(catagory_id字段值)
		cmd.BindParam(2,20);
		BYTE imageBuf[] = {0xff,0xff,0xff,0xff};
		// 绑定第三个参数(image字段值,二进制数据)
		cmd.BindParam(3,imageBuf,sizeof(imageBuf));
		if(!sqlite.ExcuteNonQuery(&cmd))
		{
			_tprintf(_T("%s\n"),sqlite.GetLastErrorMsg());
			break;
		}
	}
	// 清空cmd
	cmd.Clear();
	// 提交事务
	sqlite.CommitTransaction();
	printf("Insert Data Take %dMS...\n",GetTickCount()-dwBeginTick);
    //******************************************************

	// 查询
	dwBeginTick = GetTickCount();
	//******************************************************
	memset(sql,0,sizeof(sql));
	_stprintf(sql,_T("%s"),_T("select * from Book where name = '他的国345'"));

	SQLiteDataReader Reader = sqlite.ExcuteQuery(sql);

	int index = 0;
	int len = 0;
	while(Reader.Read())
	{
		_tprintf( _T("***************【第%d条记录】***************\n"),++index);
		_tprintf( _T("字段名:%s 字段值:%d\n"),Reader.GetName(0),Reader.GetIntValue(0));
		_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(1),Reader.GetStringValue(1));
		_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(2),Reader.GetStringValue(2));
		_tprintf( _T("字段名:%s 字段值:%d\n"),Reader.GetName(3),Reader.GetIntValue(3));
		_tprintf( _T("字段名:%s 字段值:%s\n"),Reader.GetName(4),Reader.GetStringValue(4));
		// 读取图片二进制文件
		const BYTE *ImageBuf = Reader.GetBlobValue(6,len);
		_tprintf( _T("*******************************************\n"));
	}
	Reader.Close();
	printf("Query Take %dMS...\n",GetTickCount()-dwBeginTick);
    //******************************************************

	// 关闭数据库
	sqlite.Close();
}

运行结果

Insert Data Take 645MS...
Insert Data Take 229MS...
***************【第1条记录】***************
字段名:id 字段值:1346
字段名:name 字段值:他的国345
字段名:author 字段值:韩寒
字段名:catagory_id 字段值:20
字段名:abstruct 字段值:(null)
*******************************************
Query Take 63MS...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C和SQLite是两种完全不同的技术。C是一种通用的编程语言,而SQLite是一种嵌入式数据库引擎。 C语言是一种功能强大的编程语言,广泛用于开发各种应用程序。它提供了丰富的库和函数,使得开发人员能够灵活地控制计算机的底层资源。通过C语言,我们可以进行低级别的内存操作、文件操作、网络编程等。 SQLite是一种嵌入式数据库引擎,可以嵌入到应用程序中,提供数据库功能。它是一种轻量级的关系型数据库系统,具有快速、可靠、易于使用等特点。SQLite使用简单的SQL语句来管理和操作数据,可以方便地进行数据查询、插入、更新和删除操作。由于其小巧、高效的特性,它被广泛地应用于各种移动设备、嵌入式系统和桌面应用程序中。 Excel是一个常用的电子表格软件,用于处理和分析数据。它提供了丰富的功能,如数据计算、图表绘制、数据筛选和排序等。通过Excel,我们可以方便地进行数据的录入、整理和分析,对大量的数据进行统计和可视化展示。 虽然C和SQLite、Excel都与数据处理有关,但它们之间的关联性不大。C语言可以用于开发与数据库或电子表格软件相关的应用程序,在应用程序层面上与SQLite和Excel进行交互。例如,可以使用C语言编写程序从SQLite数据库读取数据并在Excel中进行分析和展示。但是,C语言本身并不包含与SQLite或Excel的具体操作有关的功能。要实现与SQLite或Excel的具体操作,我们需要使用特定的库或API来处理。 ### 回答2: C sqlite和Excel都是广泛使用的数据管理工具。 首先,C语言是一种广泛使用的编程语言,可以用于开发各种应用程序。C语言提供了SQLite库,这是一个轻量级的关系型数据库管理系统。SQLite使用单一的磁盘文件来存储整个数据库,不需要独立的服务器进程,因此非常适合在嵌入式设备或简单应用程序中使用。C语言与SQLite可实现高效的数据存储、查询、更新和删除。 另一方面,Excel是一种电子表格软件,主要用于数据分析和管理。它提供了一种直观的界面,用户可以通过单元格输入数据、进行公式计算和数据整理。Excel可以用于记录和分析大量数据,包括数值、文本、日期和图表等。它还提供了诸如筛选、排序、函数和宏等功能,使得对数据进行复杂的操作和分析变得更加简便。 相较而言,C sqlite和Excel具有许多不同之处。C sqlite是一种编程工具,可以通过编写代码来实现对数据库操作,而Excel则提供了一个图形化界面,无需编程即可进行数据处理和操作。C sqlite更适用于开发复杂的应用程序,而Excel更适合进行简单且快速的数据分析和管理。 总而言之,C sqlite和Excel都是为了帮助用户管理和处理数据而设计的工具。选择使用哪种工具应根据具体需求和要求来决定,是否需要进行编程,以及对数据处理的复杂度有何要求。 ### 回答3: c是一种编程语言,sqlite则是一种轻量级的嵌入式数据库管理系统,而excel是一种常用的电子表格软件。三者在数据库操作和数据存储方面有一些不同之处。 c作为一种编程语言,可以通过调用sqlite的API来实现与sqlite数据库的连接和操作。通过编写c程序,我们可以创建、读取、更新和删除sqlite数据库中的数据。同时,c也提供了一些库函数来处理excel文件,可以实现对excel文件的读写和操作sqlite是一种嵌入式数据库管理系统,与传统的客户端-服务器模式的数据库系统不同,它将数据库嵌入到应用程序中,不需要额外的服务器进程。使用sqlite,我们可以在本地存储和管理数据,非常适用于移动设备或桌面应用。在c程序中,我们可以使用sqlite的API来执行各种数据库操作,如创建表、插入数据、查询数据等。 excel是一种常用的电子表格软件,广泛应用于办公和数据分析领域。它提供了丰富的功能来处理和分析数据,如数据排序、筛选、图表制作等。通过c程序,我们可以使用一些库函数来读取和写入excel文件,实现对excel数据的读写和处理。 综上所述,c可以通过sqlite的API来实现与sqlite数据库的连接和操作,并且还提供了一些库函数来处理excel文件。这使得我们能够在c程序中完成数据库操作和excel数据的读写和处理,为数据管理和处理提供了便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值