一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库、读数据表、执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢。

ADOOperate.H

  1. //////////////////////////////////////////////////////////////////////
  2. // 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句
  3. //
  4. // 孙高朝  2010.03.25
  5. //////////////////////////////////////////////////////////////////////
  6. #if !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)
  7. #define AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_
  8. #if _MSC_VER > 1000
  9. #pragma once
  10. #endif // _MSC_VER > 1000
  11. #include "stdafx.h"
  12. class CADOOperate
  13. {
  14. public:
  15. CString m_DataSource;   // 数据源
  16. CString m_PassWord;     // 密码
  17. CString m_UserName;     // 数据库名
  18. _ConnectionPtr  m_pConn;    // ADO连接
  19. CString strTableName;       // 表名 外边传入
  20. _RecordsetPtr   m_pRst;     // 记录集
  21. public:
  22. BOOL funCheckTable(CString strName,CString strDBType);
  23. BOOL ExecuteSQL(CString strSQL,LPCSTR strDBType = ORACLE);
  24. _RecordsetPtr& ReadTable(LPCSTR strSQL1 = NULL,LPCSTR strDBType = ORACLE);  // 读表 返回记录集
  25. BOOL OpenDataBase(CString lpDBType);        // 连接数据库
  26. void ExitADO();
  27. CADOOperate();
  28. virtual ~CADOOperate();
  29. };
  30. #endif // !defined(AFX_ADOOPERATE_H__EB4AC016_15D4_46E9_A754_E1C1A036DAAE__INCLUDED_)

ADOOperate.C

  1. // ADOOperate.cpp: implementation of the CADOOperate class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ADOOperate.h"
  6. #include "h_Const.h"
  7. #include "ShareFun.h"
  8. #include "FileLog.h"
  9. //////////////////////////////////////////////////////////////////////
  10. // Construction/Destruction
  11. //////////////////////////////////////////////////////////////////////
  12. CADOOperate::CADOOperate()
  13. {
  14. strTableName = " "; // 初始化表名
  15. m_DataSource = " "; // 数据源
  16. m_PassWord = " ";   // 密码
  17. m_UserName = " ";   // 数据库名
  18. }
  19. CADOOperate::~CADOOperate()
  20. {
  21. }
  22. //*********************************************
  23. //
  24. // 函数功能:    连接数据库
  25. // 参数:      CString     字符串
  26. // 返回值:     TRUE: 连接成功      FALSE:连接失败
  27. // 作者:      孙高朝     2010.03.24
  28. //
  29. //*********************************************
  30. BOOL CADOOperate::OpenDataBase(CString strDBType)
  31. {
  32. CString strSQL;
  33. CShareFun myFun;
  34. // 选择数据库连接语句
  35. if (strDBType == ACCESS)    // ACCESS
  36. {
  37. CString strPath;
  38. strPath = myFun.funGetPath();
  39. strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath + "MobileDB.mdb;Persist Security Info=False";
  40. }
  41. else if (strDBType == SQLSERVER)    // SQL SERVER
  42. {
  43. strSQL = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BookManage" ;
  44. }
  45. else if (strDBType == ORACLE)   // 默认为ORACLE
  46. {
  47. // 读取ADO.INI的文件
  48. m_DataSource = myFun.funReadini(DATASOURCE);
  49. m_UserName = myFun.funReadini(USERNAME);
  50. m_PassWord = myFun.funReadini(PASSWORD);
  51. strSQL = "Provider=MSDAORA.1;Password=" + (CString)m_PassWord + ";User ID=" + (CString)m_UserName
  52. + ";Data Source=" + (CString)m_DataSource + ";Persist Security Info=True";     // 数据库连接语句
  53. }
  54. CoInitialize(NULL); // 初始化COM库
  55. try
  56. {
  57. m_pConn.CreateInstance(__uuidof(Connection));   // 连接指针
  58. m_pConn->ConnectionString = (_bstr_t)strSQL;
  59. m_pConn->Open("","","",NULL);
  60. }
  61. catch (_com_error)  // 连接出错处理
  62. {
  63. MessageBox(0,strDBType + "连接数据库错误","提示",MB_OK|MB_ICONINFORMATION);
  64. return false;
  65. }
  66. catch (...)
  67. {
  68. AfxMessageBox("SYS Error");
  69. return false;
  70. }
  71. return true;
  72. }
  73. //*********************************************
  74. //
  75. // 函数功能:    读取数据库表
  76. // 参数:      CString     字符串
  77. // 返回值:     返回记录集数
  78. // 作者:      孙高朝     2010.03.24
  79. //
  80. //*********************************************
  81. _RecordsetPtr&  CADOOperate::ReadTable(LPCSTR strSQL1,LPCSTR strDBType)
  82. {
  83. CString strSQL;
  84. CString strSQL2;
  85. CFileLog myFile;
  86. strSQL2 = strSQL1;
  87. strSQL = "SELECT * FROM " + strTableName ;
  88. if(strSQL2.GetLength() > 0)
  89. {
  90. strSQL = "SELECT * FROM " + strTableName + " WHERE " + strSQL1;
  91. }
  92. try
  93. {
  94. if(m_pConn==NULL)       // 判断连接是否断开
  95. OpenDataBase(strDBType);     // 重新连接
  96. m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针
  97. m_pRst->raw_Close(); // 关闭记录集
  98. m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  99. }
  100. catch(_com_error e)
  101. {
  102. myFile.WriteToLog(ErrorFileName,"CADOOperate ReadTable()",(LPCSTR)e.Description());
  103. }
  104. return m_pRst;  // 返回记录集
  105. }
  106. //*********************************************
  107. //
  108. // 函数功能:    ADO释放函数
  109. // 参数:
  110. // 返回值:
  111. // 作者:      孙高朝     2010.03.29
  112. //
  113. //*********************************************
  114. void CADOOperate::ExitADO()
  115. {
  116. if(m_pRst->State)
  117. {
  118. m_pRst->Close();
  119. }
  120. m_pRst = NULL;
  121. if (m_pConn->State)
  122. {
  123. m_pConn->Close();
  124. }
  125. m_pConn = NULL;
  126. //  错误说明:智能指针_RecordsetPtr和_ConnectionPtr在超出作用域是会自动释放的,
  127. //  也就是说指针在CreateInstance()的时候分配内存,在作用域外释放,
  128. //  所以自己调用Release()并不是必需的,不过调用有可能出错,而设为NULL是完全可以不用的。
  129. //  m_pConn->Release();
  130. CoUninitialize();   // 卸载COM库
  131. }
  132. //*********************************************
  133. //
  134. // 函数功能:    执行数据库操作
  135. // 参数:      LPCSTR      字符串指针
  136. // 返回值:     返回记录集数
  137. // 作者:      孙高朝     2010.03.29
  138. //
  139. //*********************************************
  140. BOOL CADOOperate::ExecuteSQL(CString strSQL,LPCSTR strDBType)
  141. {
  142. try
  143. {
  144. if(m_pConn==NULL)       // 判断连接是否断开
  145. OpenDataBase(strDBType);        // 重新连接
  146. m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针
  147. m_pRst->raw_Close(); // 关闭记录集
  148. m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  149. }
  150. catch(_com_error e)
  151. {
  152. e.Description();
  153. return FALSE;
  154. }
  155. return TRUE;    // 返回记录集
  156. }
  157. //*********************************************
  158. //
  159. // 函数功能:    检查数据库是否存在该表
  160. // 参数:      LPCSTR      字符串指针
  161. // 返回值:     返回TRUE OR FALSE
  162. // 作者:      孙高朝     2010.03.29
  163. //
  164. //*********************************************
  165. BOOL CADOOperate::funCheckTable(CString strName,CString strDBType)
  166. {
  167. CString strSQL;
  168. // 选择数据库连接语句
  169. if (strDBType == ACCESS)    // ACCESS
  170. {
  171. strSQL = "SELECT * FROM MSysObjects WHERE Name = '" + strName + "'";    // 表名强制为大写, 判断是否存在
  172. }
  173. else if (strDBType == SQLSERVER)    // SQL SERVER
  174. {
  175. strSQL = " " ;
  176. }
  177. else if (strDBType == ORACLE)   // ORACLE
  178. {
  179. strSQL = "SELECT Table_Name FROM Tabs WHERE Table_Name='" + strName + "'";  // 表名强制为大写, 判断是否存在
  180. }
  181. try
  182. {
  183. if(m_pConn==NULL)       // 判断连接是否断开
  184. OpenDataBase(ORACLE);       // 重新连接
  185. m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针
  186. m_pRst->raw_Close(); // 关闭记录集
  187. m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
  188. }
  189. catch(_com_error e)
  190. {
  191. e.Description();
  192. return FALSE;
  193. }
  194. // 存在表否
  195. if (m_pRst->adoEOF)
  196. {
  197. return FALSE;
  198. }
  199. return TRUE;
  200. }
上一篇:内置函数zip()


下一篇:C语言实现Printf函数功能,并输出字符串至char数组