加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite C++操作类

发布时间:2020-12-12 20:09:37 所属栏目:百科 来源:网络整理
导读:为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码。代码如下: 头文件(SQLite.h) [cpp] view plain copy print ? /******************************************************************** filename:SQLite.h created:2012-11-
为了方便SQLite的使用,封装了一个SQLite的C++类,同时支持ANSI 和UNICODE编码。代码如下:


头文件(SQLite.h)

[cpp] view plain copy print ?
  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"..SQLitesqlite3.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)

[cpp] view plain copy print ?
  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类操作数据库的基本代码如下: [cpp] view plain copy print ?
  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("%sn"),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("%sn"),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("%sn"),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字段值:%dn"),Reader.GetName(0),Reader.GetIntValue(0));
  96. _tprintf(_T("字段名:%s字段值:%sn"),Reader.GetName(1),Reader.GetStringValue(1));
  97. _tprintf(_T("字段名:%s字段值:%sn"),Reader.GetName(2),Reader.GetStringValue(2));
  98. _tprintf(_T("字段名:%s字段值:%dn"),Reader.GetName(3),Reader.GetIntValue(3));
  99. _tprintf(_T("字段名:%s字段值:%sn"),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...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读