打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQLite数据库使用总结
分类: C++ 2010-06-23 20:47 1255人阅读 评论(2) 收藏 举报

SQLite 是一个小巧的开源数据库,主要应用于嵌入式移动设备。

一、 下载 SQLite3 包


     大家可以到SQLite的官方网站去下载,使用各种系统的SQLite的版本,下载地址为:http://www.sqlite.org/

二、 编译生成 Lib 文件


     启动一个命令行,进入 VC 的安装目录,如 C:/Microsoft Visual Studio/VC98/Bin 在这个目录下面 有一个 LIB.exe 文件,我们就是利用本文件生成所需要的 SQLite3.lib 文件,将在 SQLite 官方下载的 sqlite-source-3_3_7.zip 包中的 SQLite3.def 文件放到相同目录,或者绝对路径,然后在命令行输入如下命令: D:/Microsoft Visual Studio/VC98/Bin>LIB /MACHINE:IX86 /DEF:sqlite.def 。 如果命令成功执行的话我们可以看到 LIB.exe 文件已经帮我们生成好了 SQLite3.lib 文件。当然我已经编译好了一个,大家可以去这里下载:http://download.csdn.net/source/2480804

三、 使用C++封装类


 由于SQLite是用C语言写的,为了让其更符合面向对象的思想,我在SQLite提供的C的API上,用C++在进行了封装,使操作起来更方便,本类优点在于:简洁明了,操作简单,缺点是:不支持UTF-8.代码如果有什么问题,或者有什么好的建议,可以提出来,也可以发邮件给我:sgc0710@gmail.com.源码如下:

 

Sqlite.h

  1. #ifndef SQLITE_H  
  2. #define SQLITE_H  
  3. // Standard constants  
  4. #undef NULL  
  5. #define NULL    0  
  6. #include "sqlite3.h"  
  7. #include <stdio.h>  
  8. #include <iostream>  
  9. #include <string>  
  10. #include <windows.h>  
  11. #include <tchar.h>  
  12. using namespace std;    // 定义命名空间  
  13. #pragma comment(lib,"sqlite3.lib")  // 加载 sqlite3.DLL  
  14. //////////////////////////////////////////////////////////////////////////  
  15. //  类功能: 操作SQLITE数据库时的出错处理  
  16. //  作者: 孙高朝  
  17. //  日期: 2010.06.14  
  18. //////////////////////////////////////////////////////////////////////  
  19. class CMyError:public std::runtime_error        // 继承与 experience类  
  20. {  
  21. public:  
  22.     CMyError(const char* strErrMsg);  
  23. };  
  24. //////////////////////////////////////////////////////////////////////////  
  25. //  类功能: 数据库记录集类  
  26. //  作者: 孙高朝  
  27. //  日期: 2010.06.14  
  28. //////////////////////////////////////////////////////////////////////    
  29. class CSqliteRecordset  
  30. {  
  31. public:  
  32.     void finalize();        // 释放记录集函数  
  33.     void NextRow();         // 记录指针移动函数  
  34.     LPCTSTR GetFieldValue(LPCTSTR strField);    // 获取字段值  
  35.     bool RsEOF();           // 记录集指针末尾函数  
  36.     CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEof,bool bFinalize=true);  
  37.     CSqliteRecordset();  
  38.     ~CSqliteRecordset();  
  39. public:  
  40.     void MoveFrist();  
  41. private:  
  42.     int iCols;          // 列数  
  43.     sqlite3* m_pDB;     // 定义数据库对象  
  44.     sqlite3_stmt* m_pVM;    // 记录集指针 An instance of the following opaque structure is used to represent a compiled SQL statment.  
  45.     bool IsEOF;         // 末尾标志位  
  46.     bool IsFinalize;    // 释放标志位  
  47. };  
  48. //////////////////////////////////////////////////////////////////////////  
  49. //  类功能: 操作SQLITE数据库 打开数据库 执行操作数据库 读数据库表  
  50. //  作者: 孙高朝  
  51. //  日期: 2010.06.14  
  52. //////////////////////////////////////////////////////////////////////  
  53. class CSqlite    
  54. {  
  55. public:  
  56.     void CloseDB();  
  57.     bool ExecuteSQL(const char* strSQL);            // 执行SQL语句函数  
  58.     bool OpenSqliteDB(const char* strNameDB);       // 连接数据库操作  
  59.     bool funCheckTable(string strTableName);    // 检查数据表是否存在 存在 TRUE 不存在 FALSE  
  60.     CSqliteRecordset ExecQuery(LPCTSTR strSQL);     // 读取特定字段的值  
  61.     CSqlite();  
  62.     virtual ~CSqlite();  
  63. private:  
  64.     sqlite3* SqliteDB;      // 定义数据库对象  
  65. };  
  66. #endif   

Sqlite.cpp

  1. // Sqlite.cpp: implementation of the CSqlite class.  
  2. //  
  3. //////////////////////////////////////////////////////////////////////  
  4. #include "Sqlite.h"  
  5. extern "C"  
  6. {  
  7.     #include "sqlite3.h"  
  8. };  
  9. //////////////////////////////////////////////////////////////////////  
  10. // CSqlite  Construction/Destruction  
  11. //////////////////////////////////////////////////////////////////////  
  12. //   
  13. CSqlite::CSqlite()  
  14. {  
  15.     SqliteDB = 0;   // 初始化  
  16. }  
  17. CSqlite::~CSqlite()  
  18. {  
  19.     CloseDB();      // 关闭数据库  
  20. }  
  21. //////////////////////////////////////////////////////////////////////  
  22. // CSqliteRecordest  Construction/Destruction  
  23. //////////////////////////////////////////////////////////////////////  
  24. CSqliteRecordset::CSqliteRecordset()  
  25. {  
  26.     // 初始化成员变量  
  27.     m_pVM = 0;  
  28.     IsEOF = true;  
  29.     iCols = 0;  
  30.     m_pDB = 0;  
  31. }  
  32. CSqliteRecordset::CSqliteRecordset(sqlite3* pDB,sqlite3_stmt* pVM,bool bEOF,bool bFinalize/*=true*/)  
  33. {  
  34.     // 成员变量赋值  
  35.     m_pDB = pDB;  
  36.     m_pVM = pVM;  
  37.     IsEOF = bEOF;  
  38.     iCols = sqlite3_column_count(m_pVM);  
  39. }  
  40. CSqliteRecordset::~CSqliteRecordset()  
  41. {  
  42.     // 释放记录集指针  
  43.     finalize();  
  44. }  
  45. //////////////////////////////////////////////////////////////////////  
  46. // CMyError  Construction/Destruction  
  47. //////////////////////////////////////////////////////////////////////  
  48. CMyError::CMyError(const char* strErrMsg):runtime_error(strErrMsg) {}  
  49. //*********************************************  
  50. //  
  51. // 函数功能:    连接SQLITE数据库  
  52. // 参数:      char*       字符串  
  53. // 返回值:     TRUE: 连接成功      FALSE:连接失败  
  54. // 作者:      孙高朝     2010.06.13  
  55. //  
  56. //*********************************************  
  57. bool CSqlite::OpenSqliteDB(const char *strNameDB)  
  58. {  
  59.     int iOpenResult;  
  60.     iOpenResult=0;  
  61.     // 打开SQLITE数据库  
  62.     iOpenResult = sqlite3_open(strNameDB,&SqliteDB);  
  63.       
  64.     if (iOpenResult != SQLITE_OK)  
  65.     {  
  66.         throw CMyError("数据库打不开!");  
  67.     }  
  68.     return true;  
  69. }  
  70. //*********************************************  
  71. //  
  72. // 函数功能:    执行数据库操作  
  73. // 参数:      TRUE: 连接成功      FALSE:连接失败  
  74. // 返回值:     返回记录集数  
  75. // 作者:      孙高朝     2010.06.13  
  76. //  
  77. //*********************************************  
  78. bool CSqlite::ExecuteSQL(const char *strSQL)  
  79. {  
  80.       
  81.     int iOpenResult;    // 存连接数据库的结果  
  82.     char* strErrMsg;    // 错误信息  
  83.     iOpenResult=0;  
  84.     // SQLITE数据库在操作库时,需要先执行BEGIN; 然后再以COMMIT;结束 才能生效  
  85.     if (sqlite3_exec(SqliteDB, "BEGIN;", 0, 0, &strErrMsg)) // 开始操作库  
  86.     {  
  87.         throw CMyError(strErrMsg);  
  88.     }  
  89.     iOpenResult = sqlite3_exec(SqliteDB,strSQL,0, 0, &strErrMsg);   // 执行SQL语句  
  90.     if (iOpenResult != SQLITE_OK)  
  91.     {  
  92.         throw CMyError(strErrMsg);          // 抓取错误信息  
  93.     }  
  94.     if (sqlite3_exec(SqliteDB, "COMMIT;", 0, 0, &strErrMsg))    // 数据库操作生效  
  95.     {  
  96.         throw CMyError(strErrMsg);  
  97.     }  
  98.     return true;  
  99. }  
  100. //*********************************************  
  101. //  
  102. // 函数功能:    读取SQLITE数据库表指定字段  
  103. // 参数:      const char *strTableName 表名  
  104. //              const char *strFactor 查询条件  
  105. //              cconst char *strFieldName   查询字段名  
  106. // 返回值:     返回记录集  
  107. // 作者:      孙高朝     2010.06.13  
  108. //  
  109. //*********************************************  
  110. CSqliteRecordset CSqlite::ExecQuery(LPCTSTR strSQL)  
  111. {  
  112.     int iResult;  
  113.     sqlite3_stmt* pVM;   
  114.       
  115.     do   
  116.     {  
  117.         iResult = sqlite3_prepare(SqliteDB,strSQL,-1,&pVM,NULL);    // 执行SQL语句查询    execute an SQL query   
  118.         if (iResult != SQLITE_OK)                       // 执行成功     SQLITE_OK      Successful result  
  119.         {  
  120.             pVM=NULL;  
  121.             throw CMyError(sqlite3_errmsg(SqliteDB));   // 执行失败 返回错误信息  
  122.         }  
  123.         iResult = sqlite3_step(pVM);        // 逐步查询记录 this function must be called one or more times to execute the statement.  
  124.         if (SQLITE_DONE == iResult)         // 完成查询     SQLITE_DONE  sqlite3_step() has finished executing   
  125.         {   // 已经到最后一行  
  126.             return CSqliteRecordset(SqliteDB, pVM, true/*EOF*/);  
  127.         }  
  128.         else if (SQLITE_ROW == iResult)     // SQLITE_ROW   sqlite3_step() has another row ready  
  129.         {   // 至少有一行  
  130.             return CSqliteRecordset(SqliteDB, pVM, false/*EOF*/);  
  131.         }  
  132.         iResult = sqlite3_finalize(pVM);  
  133.       
  134.     } while (SQLITE_SCHEMA == iResult);         // SQLITE_SCHEMA      The database schema changed   
  135.     throw CMyError(sqlite3_errmsg(SqliteDB));   // 抛出异常  
  136. }  
  137. //*********************************************  
  138. //  
  139. // 函数功能:    查询SQLITE数据库表是否存在  
  140. // 参数:      const char *strTableName 表名  
  141. // 返回值:     TRUE: 存在        FALSE:不存在  
  142. // 作者:      孙高朝     2010.06.17  
  143. //  
  144. //*********************************************  
  145. bool CSqlite::funCheckTable(string strTableName)  
  146. {  
  147.     string strSQL;  
  148.     const char* strTail;  
  149.     string strFieldValue;  
  150.     sqlite3_stmt* pStmt;  
  151.     int iResult;  
  152.     // sqlite_master 系统表 type 类型    name 表名 只能小写  
  153.     strSQL = "SELECT * FROM sqlite_master WHERE type = 'table' AND name = '" + strTableName + "';";  
  154.     if (sqlite3_prepare(SqliteDB,strSQL.c_str(),-1,&pStmt,&strTail))  
  155.     {  
  156.         throw CMyError(sqlite3_errmsg(SqliteDB));   // 执行失败 返回错误信息  
  157.     }  
  158.     iResult = sqlite3_step(pStmt);  // 执行SQL  
  159.       
  160.     sqlite3_finalize(pStmt);        // 释放stmt  
  161.     if (iResult != SQLITE_ROW)      // 无记录  
  162.     {     
  163.         return false;  
  164.     }  
  165.     return true;  
  166. }  
  167. //*********************************************  
  168. //  
  169. // 函数功能:    查是否到了记录集尾  
  170. // 参数:    
  171. // 返回值:     TRUE: 到了        FALSE:未到  
  172. // 作者:      孙高朝     2010.06.17  
  173. //  
  174. //*********************************************  
  175. bool CSqliteRecordset::RsEOF()  
  176. {  
  177.     if (m_pVM == 0) // 是否有记录指针  
  178.     {  
  179.         throw CMyError(_T("Null Virtual Machine pointer"));  
  180.     }  
  181.     return IsEOF;  
  182. }  
  183. //*********************************************  
  184. //  
  185. // 函数功能:    获取字段值  
  186. // 参数:      字段名  
  187. // 返回值:     指定字段值  
  188. // 作者:      孙高朝     2010.06.17  
  189. //  
  190. //*********************************************  
  191. LPCTSTR CSqliteRecordset::GetFieldValue(LPCTSTR strField)  
  192. {  
  193.     int nField;     // 获取该字段的列数  
  194.     if (strField)   // 字段名不为空  
  195.     {  
  196.         for (nField = 0;nField < iCols; nField++)          
  197.         {  
  198.             LPCTSTR szTemp = (LPCTSTR)sqlite3_column_name(m_pVM, nField);   // 获取对应列的字段名  
  199.             if (_tcscmp(strField, szTemp) == 0)     // 比较连字段名 相同 则获取字段值  
  200.             {  
  201.                 return (LPCTSTR)sqlite3_column_text(m_pVM, nField);  
  202.             }  
  203.         }  
  204.     }  
  205.     throw CMyError(_T("Invalid field name requested")); // 字段为空 抛出异常  
  206. }  
  207. //*********************************************  
  208. //  
  209. // 函数功能:    查记录集的下一行  
  210. // 参数:    
  211. // 返回值:     TRUE: 到了        FALSE:未到  
  212. // 作者:      孙高朝     2010.06.17  
  213. //  
  214. //*********************************************  
  215. void CSqliteRecordset::NextRow()  
  216. {  
  217.     int nRet = sqlite3_step(m_pVM);  
  218.     if (nRet == SQLITE_DONE)  
  219.     {  
  220.         // 已经到最后一行 行尾标志位置一  
  221.         IsEOF = true;  
  222.     }  
  223.     else if (nRet == SQLITE_ROW)  
  224.     {  
  225.         // 有行 行尾标志位置0  
  226.         IsEOF = false;  
  227.     }  
  228.     else  
  229.     {  
  230.         nRet = sqlite3_finalize(m_pVM);         // 执行出错 释放记录集指针  
  231.         m_pVM = 0;  
  232.         throw CMyError(sqlite3_errmsg(m_pDB));  // 抛出异常  
  233.     }  
  234. }  
  235. //*********************************************  
  236. //  
  237. // 函数功能:    释放记录集指针  
  238. // 参数:    
  239. // 返回值:       
  240. // 作者:      孙高朝     2010.06.17  
  241. //  
  242. //*********************************************  
  243. void CSqliteRecordset::finalize()  
  244. {  
  245.     if (m_pVM)                              // 有记录集指针  
  246.     {  
  247.         int nRet = sqlite3_finalize(m_pVM); // 释放  
  248.         m_pVM = 0;  
  249.         if (nRet != SQLITE_OK)              // 执行不成功    则抛出异常  
  250.         {     
  251.             throw CMyError(sqlite3_errmsg(m_pDB));  
  252.         }  
  253.     }  
  254. }  
  255. //*********************************************  
  256. //  
  257. // 函数功能:    关闭数据库  
  258. // 参数:    
  259. // 返回值:       
  260. // 作者:      孙高朝     2010.06.17  
  261. //  
  262. //*********************************************  
  263. void CSqlite::CloseDB()  
  264. {  
  265.     if (SqliteDB)   // 数据在打开状态  
  266.     {  
  267.         int nRet = sqlite3_close(SqliteDB); // 关闭数据库  
  268.           
  269.         if (nRet != SQLITE_OK)  
  270.         {  
  271.             throw CMyError(sqlite3_errmsg(SqliteDB));  
  272.         }  
  273.           
  274.         SqliteDB = 0;   // 置0  
  275.     }  
  276. }  
  277. //*********************************************  
  278. //  
  279. // 函数功能:    返回到记录集的首行  
  280. // 参数:    
  281. // 返回值:  
  282. // 作者:      孙高朝     2010.06.17  
  283. //  
  284. //*********************************************  
  285. void CSqliteRecordset::MoveFrist()  
  286. {  
  287.     if (m_pVM)  
  288.     {  
  289.         int nRet = sqlite3_reset(m_pVM);    // 复位记录集  
  290.         NextRow();      // 调用NextRow 执行一次sqlite3_step 产生记录  
  291.         IsEOF = false;  // 尾标志位清零  
  292.         if (nRet != SQLITE_OK)  
  293.         {     
  294.             throw CMyError(sqlite3_errmsg(m_pDB));  
  295.         }  
  296.     }  
  297. }  

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
delphi与sqlite3
Android
sqlite关闭数据库,清除连接池
有一个 SQLite 的增强神器
分享一段ios数据库代码,包括对表的创建、升级、增删查改
iphone开发我的新浪微博客户端-用户登录准备篇(1.1)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服