ado2.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:49k
源码类别:

CA认证

开发平台:

Visual C++

  1. //
  2. // MODULE: Ado2.cpp
  3. //
  4. // AUTHOR: Carlos Antollini <cantollini@hotmail.com>
  5. //
  6. // Copyright (c) 2001-2004. All Rights Reserved.
  7. //
  8. // Date: August 01, 2005
  9. //
  10. // Version 2.20
  11. //
  12. // This code may be used in compiled form in any way you desire. This
  13. // file may be redistributed unmodified by any means PROVIDING it is 
  14. // not sold for profit without the authors written consent, and 
  15. // providing that this notice and the authors name and all copyright 
  16. // notices remains intact. 
  17. //
  18. // An email letting me know how you are using it would be nice as well. 
  19. //
  20. // This file is provided "as is" with no expressed or implied warranty.
  21. // The author accepts no liability for any damage/loss of business that
  22. // this product may cause.
  23. //
  24. //
  25. //////////////////////////////////////////////////////////////////////
  26. #include "stdafx.h"
  27. #include "ado2.h"
  28. #define ChunkSize 100
  29. ///////////////////////////////////////////////////////
  30. //
  31. // CJetEngine Class
  32. //
  33. BOOL CJetEngine::CompactDatabase(CString strDatabaseSource, CString strDatabaseDestination)
  34. {
  35. try
  36. {
  37. ::CoInitialize(NULL);
  38. IJetEnginePtr jet(__uuidof(JetEngine));
  39. HRESULT hr = jet->CompactDatabase(_bstr_t(strDatabaseSource.GetBuffer(0)), _bstr_t(strDatabaseDestination.GetBuffer(0)));
  40. jet.Release();
  41. ::CoUninitialize();
  42. return hr == S_OK;
  43. }
  44. catch(_com_error) 
  45. {       
  46. ::CoUninitialize();
  47. return FALSE;
  48. }
  49. BOOL CJetEngine::RefreshCache(ADODB::_Connection *pconn)
  50. {
  51. //Added by doodle@email.it
  52. try
  53. {
  54. ::CoInitialize(NULL);
  55. IJetEnginePtr jet(__uuidof(JetEngine)); 
  56. HRESULT hr = jet->RefreshCache(pconn);
  57. ::CoUninitialize();
  58. return hr == S_OK;
  59. }
  60. catch(_com_error) 
  61. ::CoUninitialize();
  62. return FALSE;
  63. return FALSE;
  64. }
  65. ///////////////////////////////////////////////////////
  66. //
  67. // CADODatabase Class
  68. //
  69. DWORD CADODatabase::GetRecordCount(_RecordsetPtr m_pRs)
  70. {
  71. DWORD numRows = 0;
  72. numRows = m_pRs->GetRecordCount();
  73. if(numRows == -1)
  74. {
  75. if(m_pRs->EndOfFile != VARIANT_TRUE)
  76. m_pRs->MoveFirst();
  77. while(m_pRs->EndOfFile != VARIANT_TRUE)
  78. {
  79. numRows++;
  80. m_pRs->MoveNext();
  81. }
  82. if(numRows > 0)
  83. m_pRs->MoveFirst();
  84. }
  85. return numRows;
  86. }
  87. BOOL CADODatabase::Open(LPCTSTR lpstrConnection, LPCTSTR lpstrUserID, LPCTSTR lpstrPassword)
  88. {
  89. HRESULT hr = S_OK;
  90. if(IsOpen())
  91. Close();
  92. if(strcmp(lpstrConnection, _T("")) != 0)
  93. m_strConnection = lpstrConnection;
  94. ASSERT(!m_strConnection.IsEmpty());
  95. try
  96. {
  97. if(m_nConnectionTimeout != 0)
  98. m_pConnection->PutConnectionTimeout(m_nConnectionTimeout);
  99. hr = m_pConnection->Open(_bstr_t(m_strConnection), _bstr_t(lpstrUserID), _bstr_t(lpstrPassword), NULL);
  100. return hr == S_OK;
  101. }
  102. catch(_com_error &e)
  103. {
  104. dump_com_error(e);
  105. return FALSE;
  106. }
  107. }
  108. void CADODatabase::dump_com_error(_com_error &e)
  109. {
  110. CString ErrorStr,
  111.     DebugErr;
  112. _bstr_t bstrSource(e.Source());
  113. _bstr_t bstrDescription(e.Description());
  114. ErrorStr.Format( "CADODataBase ErrorntCode = %08lxntCode meaning = %sntSource = %sntDescription = %sn",
  115. e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription);
  116. m_strErrorDescription = (LPCSTR)bstrDescription ;
  117. DebugErr = _T("Connection String = " + GetConnectionString() + 'n' + ErrorStr);
  118. m_strLastError = _T(m_strErrorDescription);
  119. m_dwLastError = e.Error(); 
  120. #ifdef _DEBUG
  121. AfxMessageBox(DebugErr, MB_OK | MB_ICONERROR );
  122. #endif
  123. throw CADOException(e.Error(), m_strLastError);
  124. }
  125. BOOL CADODatabase::IsOpen()
  126. {
  127. if(m_pConnection )
  128. return m_pConnection->GetState() != adStateClosed;
  129. return FALSE;
  130. }
  131. void CADODatabase::Close()
  132. {
  133. if(IsOpen())
  134. m_pConnection->Close();
  135. }
  136. ///////////////////////////////////////////////////////
  137. //
  138. // CADORecordset Class
  139. //
  140. CADORecordset::CADORecordset()
  141. {
  142. m_pRecordset = NULL;
  143. m_pCmd = NULL;
  144. m_strQuery = _T("");
  145. m_strLastError = _T("");
  146. m_dwLastError = 0;
  147. m_pRecBinding = NULL;
  148. m_pRecordset.CreateInstance(__uuidof(Recordset));
  149. m_pCmd.CreateInstance(__uuidof(Command));
  150. m_nEditStatus = CADORecordset::dbEditNone;
  151. m_nSearchDirection = CADORecordset::searchForward;
  152. }
  153. CADORecordset::CADORecordset(CADODatabase* pAdoDatabase)
  154. {
  155. m_pRecordset = NULL;
  156. m_pCmd = NULL;
  157. m_strQuery = _T("");
  158. m_strLastError = _T("");
  159. m_dwLastError = 0;
  160. m_pRecBinding = NULL;
  161. m_pRecordset.CreateInstance(__uuidof(Recordset));
  162. m_pCmd.CreateInstance(__uuidof(Command));
  163. m_nEditStatus = CADORecordset::dbEditNone;
  164. m_nSearchDirection = CADORecordset::searchForward;
  165. m_pConnection = pAdoDatabase->GetActiveConnection();
  166. }
  167. BOOL CADORecordset::Open(_ConnectionPtr mpdb, LPCTSTR lpstrExec, int nOption)
  168. {
  169. Close();
  170. if(strcmp(lpstrExec, _T("")) != 0)
  171. m_strQuery = lpstrExec;
  172. ASSERT(!m_strQuery.IsEmpty());
  173. if(m_pConnection == NULL)
  174. m_pConnection = mpdb;
  175. m_strQuery.TrimLeft();
  176. BOOL bIsSelect = m_strQuery.Mid(0, strlen("Select ")).CompareNoCase("select ") == 0 && nOption == openUnknown;
  177. try
  178. {
  179. m_pRecordset->CursorType = adOpenStatic; //hpxs adOpenStatic adOpenDynamic
  180. m_pRecordset->CursorLocation = adUseClient;
  181. if(bIsSelect || nOption == openQuery || nOption == openUnknown)
  182. m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE), 
  183. adOpenStatic/*hpxs adOpenDynamic adOpenStatic*/, adLockOptimistic, adCmdUnknown);
  184. else if(nOption == openTable)
  185. m_pRecordset->Open((LPCSTR)m_strQuery, _variant_t((IDispatch*)mpdb, TRUE), 
  186. adOpenDynamic, adLockOptimistic, adCmdTable);
  187. else if(nOption == openStoredProc)
  188. {
  189. m_pCmd->ActiveConnection = mpdb;
  190. m_pCmd->CommandText = _bstr_t(m_strQuery);
  191. m_pCmd->CommandType = adCmdStoredProc;
  192. m_pConnection->CursorLocation = adUseClient;
  193. m_pRecordset = m_pCmd->Execute(NULL, NULL, adCmdText);
  194. }
  195. else
  196. {
  197. TRACE( "Unknown parameter. %d", nOption);
  198. return FALSE;
  199. }
  200. }
  201. catch(_com_error &e)
  202. {
  203. dump_com_error(e);
  204. return FALSE;
  205. }
  206. return m_pRecordset != NULL && m_pRecordset->GetState()!= adStateClosed;
  207. }
  208. BOOL CADORecordset::Open(LPCTSTR lpstrExec, int nOption)
  209. {
  210. ASSERT(m_pConnection != NULL);
  211. ASSERT(m_pConnection->GetState() != adStateClosed);
  212. return Open(m_pConnection, lpstrExec, nOption);
  213. }
  214. BOOL CADORecordset::OpenSchema(int nSchema, LPCTSTR SchemaID /*= _T("")*/)
  215. {
  216. try
  217. {
  218. _variant_t vtSchemaID = vtMissing;
  219. if(strlen(SchemaID) != 0)
  220. {
  221. vtSchemaID = SchemaID;
  222. nSchema = adSchemaProviderSpecific;
  223. }
  224. m_pRecordset = m_pConnection->OpenSchema((enum SchemaEnum)nSchema, vtMissing, vtSchemaID);
  225. return TRUE;
  226. }
  227. catch(_com_error &e)
  228. {
  229. dump_com_error(e);
  230. return FALSE;
  231. }
  232. }
  233. BOOL CADORecordset::Requery()
  234. {
  235. if(IsOpen())
  236. {
  237. try
  238. {
  239. m_pRecordset->Requery(adExecuteRecord);
  240. }
  241. catch(_com_error &e)
  242. {
  243. dump_com_error(e);
  244. return FALSE;
  245. }
  246. }
  247. return TRUE;
  248. }
  249. BOOL CADORecordset::GetFieldValue(LPCTSTR lpFieldName, double& dbValue)
  250. {
  251. double val = (double)NULL;
  252. _variant_t vtFld;
  253. try
  254. {
  255. vtFld = m_pRecordset->Fields->GetItem(lpFieldName)->Value;
  256. switch(vtFld.vt)
  257. {
  258. case VT_R4:
  259. val = vtFld.fltVal;
  260. break;
  261. case VT_R8:
  262. val = vtFld.dblVal;
  263. break;
  264. case VT_DECIMAL:
  265. //Corrected by Jos