首页 > 代码库 > 一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

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

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

ADOOperate.H

 

[cpp] view plaincopy
 
  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

 

[cpp] view plaincopy
 
  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.       
  55.     CoInitialize(NULL); // 初始化COM库  
  56.       
  57.     try  
  58.     {  
  59.         m_pConn.CreateInstance(__uuidof(Connection));   // 连接指针  
  60.         m_pConn->ConnectionString = (_bstr_t)strSQL;  
  61.         m_pConn->Open("","","",NULL);  
  62.     }  
  63.     catch (_com_error)  // 连接出错处理  
  64.     {     
  65.         MessageBox(0,strDBType + "连接数据库错误","提示",MB_OK|MB_ICONINFORMATION);  
  66.         return false;  
  67.     }  
  68.     catch (...)  
  69.     {  
  70.         AfxMessageBox("SYS Error");  
  71.         return false;  
  72.     }  
  73.     return true;  
  74. }  
  75. //*********************************************  
  76. //  
  77. // 函数功能:    读取数据库表  
  78. // 参数:      CString     字符串  
  79. // 返回值:     返回记录集数  
  80. // 作者:      孙高朝     2010.03.24  
  81. //  
  82. //*********************************************  
  83. _RecordsetPtr&  CADOOperate::ReadTable(LPCSTR strSQL1,LPCSTR strDBType)  
  84. {  
  85.     CString strSQL;  
  86.     CString strSQL2;  
  87.     CFileLog myFile;  
  88.     strSQL2 = strSQL1;  
  89.     strSQL = "SELECT * FROM " + strTableName ;  
  90.       
  91.     if(strSQL2.GetLength() > 0)  
  92.     {  
  93.         strSQL = "SELECT * FROM " + strTableName + " WHERE " + strSQL1;   
  94.     }  
  95.       
  96.     try  
  97.     {  
  98.         if(m_pConn==NULL)       // 判断连接是否断开  
  99.            OpenDataBase(strDBType);     // 重新连接  
  100.         m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针  
  101.         m_pRst->raw_Close(); // 关闭记录集  
  102.         m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);  
  103.     }  
  104.     catch(_com_error e)  
  105.     {  
  106.         myFile.WriteToLog(ErrorFileName,"CADOOperate ReadTable()",(LPCSTR)e.Description());  
  107.     }  
  108.     return m_pRst;  // 返回记录集  
  109. }  
  110. //*********************************************  
  111. //  
  112. // 函数功能:    ADO释放函数  
  113. // 参数:        
  114. // 返回值:       
  115. // 作者:      孙高朝     2010.03.29  
  116. //  
  117. //*********************************************  
  118. void CADOOperate::ExitADO()  
  119. {  
  120.     if(m_pRst->State)  
  121.     {  
  122.         m_pRst->Close();  
  123.     }  
  124.     m_pRst = NULL;  
  125.     if (m_pConn->State)  
  126.     {  
  127.         m_pConn->Close();  
  128.     }  
  129.     m_pConn = NULL;  
  130.     //  错误说明:智能指针_RecordsetPtr和_ConnectionPtr在超出作用域是会自动释放的,  
  131.     //  也就是说指针在CreateInstance()的时候分配内存,在作用域外释放,  
  132.     //  所以自己调用Release()并不是必需的,不过调用有可能出错,而设为NULL是完全可以不用的。   
  133.     //  m_pConn->Release();  
  134.     CoUninitialize();   // 卸载COM库  
  135. }  
  136. //*********************************************  
  137. //  
  138. // 函数功能:    执行数据库操作  
  139. // 参数:      LPCSTR      字符串指针  
  140. // 返回值:     返回记录集数  
  141. // 作者:      孙高朝     2010.03.29  
  142. //  
  143. //*********************************************  
  144. BOOL CADOOperate::ExecuteSQL(CString strSQL,LPCSTR strDBType)  
  145. {     
  146.     try  
  147.     {  
  148.         if(m_pConn==NULL)       // 判断连接是否断开  
  149.             OpenDataBase(strDBType);        // 重新连接  
  150.           
  151.         m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针  
  152.         m_pRst->raw_Close(); // 关闭记录集  
  153.         m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);  
  154.     }  
  155.     catch(_com_error e)  
  156.     {  
  157.         e.Description();  
  158.         return FALSE;  
  159.     }  
  160.       
  161.     return TRUE;    // 返回记录集  
  162. }  
  163. //*********************************************  
  164. //  
  165. // 函数功能:    检查数据库是否存在该表  
  166. // 参数:      LPCSTR      字符串指针  
  167. // 返回值:     返回TRUE OR FALSE  
  168. // 作者:      孙高朝     2010.03.29  
  169. //  
  170. //*********************************************  
  171. BOOL CADOOperate::funCheckTable(CString strName,CString strDBType)  
  172. {  
  173.     CString strSQL;  
  174.     // 选择数据库连接语句  
  175.     if (strDBType == ACCESS)    // ACCESS  
  176.     {  
  177.         strSQL = "SELECT * FROM MSysObjects WHERE Name = ‘" + strName + "‘";    // 表名强制为大写, 判断是否存在    
  178.     }   
  179.     else if (strDBType == SQLSERVER)    // SQL SERVER  
  180.     {  
  181.         strSQL = " " ;  
  182.     }   
  183.     else if (strDBType == ORACLE)   // ORACLE  
  184.     {  
  185.         strSQL = "SELECT Table_Name FROM Tabs WHERE Table_Name=‘" + strName + "‘";  // 表名强制为大写, 判断是否存在  
  186.     }  
  187.     try  
  188.     {  
  189.         if(m_pConn==NULL)       // 判断连接是否断开  
  190.             OpenDataBase(ORACLE);       // 重新连接  
  191.           
  192.         m_pRst.CreateInstance(__uuidof(Recordset));     // 数据集指针  
  193.         m_pRst->raw_Close(); // 关闭记录集  
  194.         m_pRst->Open((_bstr_t)strSQL,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);  
  195.     }  
  196.     catch(_com_error e)  
  197.     {  
  198.         e.Description();  
  199.         return FALSE;  
  200.     }  
  201.     // 存在表否  
  202.     if (m_pRst->adoEOF)  
  203.     {  
  204.         return FALSE;  
  205.     }  
  206.     return TRUE;  
  207. }