SQLite C++操作类

前端之家收集整理的这篇文章主要介绍了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. };


文件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,pwStr,-1,NULL,NULL);
  15. if(len<=0)
  16. {
  17. returnNULL;
  18. }
  19. char*pStr=newchar[len];
  20. WideCharToMultiByte(CP_UTF8,pStr,len,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);
  30. if(len<=0)
  31. {
  32. returnNULL;
  33. }
  34. wchar_t*pwStr=newwchar_t[len];
  35. MultiByteToWideChar(CP_UTF8,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,&stmt,NULL)!=sqlITE_OK)
  79. #else
  80. if(sqlite3_prepare_v2(m_db,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,&errmsg)!=sqlITE_OK)
  107. {
  108. delete[]szsql;
  109. returnFALSE;
  110. }
  111. delete[]szsql;
  112. #else
  113. if(sqlite3_exec(m_db,&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,NULL)!=sqlITE_OK)
  130. #else
  131. if(sqlite3_prepare_v2(m_db,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;",&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;;",&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;",&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,&m_pStmt,NULL)!=sqlITE_OK)
  274. #else
  275. if(sqlite3_prepare_v2(m_psqlite->m_db,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,sqlITE_TRANSIENT)!=sqlITE_OK)
  286. #else
  287. if(sqlite3_bind_text(m_pStmt,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,nValue)!=sqlITE_OK)
  297. {
  298. returnFALSE;
  299. }
  300. returnTRUE;
  301. }
  302. BOOLsqliteCommand::BindParam(intindex,constdoubledValue)
  303. {
  304. if(sqlite3_bind_double(m_pStmt,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,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. }


使用方法

通过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,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,sizeof(sql));
  59. _stprintf(sql,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};
  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,_T("select*fromBookwherename='他的国345'"));
  89. sqliteDataReaderReader=sqlite.ExcuteQuery(sql);
  90. intindex=0;
  91. intlen=0;
  92. while(Reader.Read())
  93. {
  94. _tprintf(_T("***************【第%d条记录】***************\n"),++index);
  95. _tprintf(_T("字段名:%s字段值:%d\n"),Reader.GetName(0),Reader.GetIntValue(0));
  96. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(1),Reader.GetStringValue(1));
  97. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(2),Reader.GetStringValue(2));
  98. _tprintf(_T("字段名:%s字段值:%d\n"),Reader.GetName(3),Reader.GetIntValue(3));
  99. _tprintf(_T("字段名:%s字段值:%s\n"),Reader.GetName(4),Reader.GetStringValue(4));
  100. //读取图片二进制文件
  101. constBYTE*ImageBuf=Reader.GetBlobValue(6,len);
  102. _tprintf(_T("*******************************************\n"));
  103. }
  104. Reader.Close();
  105. printf("QueryTake%dMS...\n",GetTickCount()-dwBeginTick);
  106. //******************************************************
  107. //关闭数据库
  108. sqlite.Close();
  109. }

运行结果

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

猜你在找的Sqlite相关文章