ODBCImpl.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #include "StdAfx.h"
  2. #include "ODBCImpl.h"
  3. CODBCImpl::CODBCImpl(void)
  4. {
  5. m_bOpen = FALSE;
  6. m_pdbInstance = NULL;
  7. m_hReConnectEvent = NULL;
  8. m_hReConnectThread = NULL;
  9. }
  10. CODBCImpl::~CODBCImpl(void)
  11. {
  12. DisConnectDataBase();
  13. }
  14. BOOL CODBCImpl::SolveDBError(CONST DWORD &dwError,LPCTSTR lpErrorString)
  15. {
  16. AutoThreadSection aSection(&s_critSection);
  17. if(m_bSolve) return TRUE;
  18. switch(dwError)
  19. {
  20. case ERROR_PIPE_NOT_CONNECTED:
  21. case WSAECONNRESET:
  22. case WSAECONNABORTED:
  23. {
  24. m_bSolve = TRUE;
  25. // 启用重连线程;
  26. DisConnectDataBase();
  27. //StartThread();
  28. //LOG4C_NO_FILENUM((LOG_NOTICE,"数据库连接失败,请检查配置信息或数据库服务是否启动!"));
  29. }
  30. break;
  31. default:
  32. // 其他错误,输出日志;
  33. //LOG4C_NO_FILENUM((LOG_NOTICE,"数据库错误信息:%s",CW2A(lpErrorString)));
  34. break;
  35. }
  36. return FALSE;
  37. }
  38. int CODBCImpl::StartThread()
  39. {
  40. if(m_hReConnectEvent == NULL)
  41. m_hReConnectEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 无信号事件;
  42. if (m_hReConnectEvent == NULL)
  43. {
  44. m_bSolve = FALSE;
  45. return -1;
  46. }
  47. if(m_hReConnectThread == NULL)
  48. m_hReConnectThread = CreateThread(NULL, 0, ReConnectDatabaseThread, this, 0, NULL);
  49. if (m_hReConnectThread == NULL)
  50. {
  51. m_bSolve = FALSE;
  52. return -1;
  53. }
  54. else
  55. {
  56. CloseHandle(m_hReConnectThread);
  57. m_hReConnectThread = NULL;
  58. }
  59. return 0;
  60. }
  61. int CODBCImpl::EndofThread()
  62. {
  63. if (m_hReConnectEvent)
  64. SetEvent(m_hReConnectEvent);
  65. if (m_hReConnectThread)
  66. {
  67. if (WaitForSingleObject(m_hReConnectThread, INFINITE) != WAIT_TIMEOUT)
  68. CloseHandle(m_hReConnectThread);
  69. m_hReConnectThread = NULL;
  70. }
  71. if (m_hReConnectEvent)
  72. CloseHandle(m_hReConnectEvent);
  73. m_hReConnectEvent = NULL;
  74. return 0L;
  75. }
  76. DWORD CODBCImpl::ReConnectDatabaseThread(LPVOID lpPara)
  77. {
  78. CODBCImpl *pInstance = (CODBCImpl*)lpPara;
  79. do
  80. {
  81. if( pInstance->ConnectToDataBase())
  82. {
  83. pInstance->m_bSolve = FALSE;
  84. break;
  85. }
  86. } while (WaitForSingleObject(pInstance->m_hReConnectEvent,5000L) == WAIT_TIMEOUT);
  87. if (pInstance->m_hReConnectEvent)
  88. CloseHandle(pInstance->m_hReConnectEvent);
  89. pInstance->m_hReConnectEvent = NULL;
  90. return 0L;
  91. }
  92. BOOL CODBCImpl::ConnectToDataBase( IN LPCTSTR lpConnString )
  93. {
  94. AutoThreadSection aSection(&s_critSection);
  95. if (m_pdbInstance == NULL)
  96. {
  97. m_pdbInstance = new CDatabase;
  98. TCHAR szConnString[MAX_PATH] = {0};
  99. if (lpConnString == NULL)
  100. {
  101. _stprintf_s(szConnString, _T("%s"), m_szConnectString);
  102. }
  103. else
  104. {
  105. _stprintf_s(m_szConnectString, _T("%s"), lpConnString);
  106. _stprintf_s(szConnString, _T("%s"), lpConnString);
  107. }
  108. try
  109. {
  110. m_pdbInstance->OpenEx(szConnString, CDatabase::noOdbcDialog);
  111. }
  112. catch (CDBException* e)
  113. {
  114. delete m_pdbInstance;
  115. m_pdbInstance = NULL;
  116. e->Delete();
  117. return FALSE;
  118. }
  119. m_bOpen = TRUE;
  120. }
  121. return m_bOpen;
  122. }
  123. void CODBCImpl::DisConnectDataBase()
  124. {
  125. m_bOpen = FALSE;
  126. if (m_pdbInstance)
  127. delete m_pdbInstance;
  128. m_pdbInstance = NULL;
  129. }
  130. BOOL CODBCImpl::ExecuteSQL( IN LPCTSTR lpSQL )
  131. {
  132. try
  133. {
  134. AutoThreadSection aSection(&s_critSection);
  135. if (!m_bOpen) return FALSE;
  136. //m_pdbInstance->BeginTrans();
  137. m_pdbInstance->ExecuteSQL(lpSQL);
  138. //m_pdbInstance->CommitTrans();
  139. }
  140. catch (CDBException* e)
  141. {
  142. //m_pdbInstance->Rollback();
  143. SolveDBError(GetLastError(),e->m_strError);
  144. e->Delete();
  145. return FALSE;
  146. }
  147. return TRUE;
  148. }
  149. INT CODBCImpl::GetTblRecordCount(IN LPCTSTR lpTblName, IN LPCTSTR lpFilters)
  150. {
  151. try
  152. {
  153. AutoThreadSection aSection(&s_critSection);
  154. if (!m_bOpen)
  155. return -1;
  156. CString strSQL;
  157. if (lpFilters && _tcsicmp(lpFilters, _T("")) != 0)
  158. strSQL.Format(_T("select count(*) as cot from %s where %s"), lpTblName, lpFilters);
  159. else
  160. strSQL.Format(_T("select count(*) as cot from %s"), lpTblName);
  161. CRecordset tagRecordset(m_pdbInstance);
  162. tagRecordset.Open(CRecordset::forwardOnly, strSQL);
  163. tagRecordset.GetFieldValue(_T("cot"), strSQL);
  164. tagRecordset.Close();
  165. return _ttoi(strSQL);
  166. }
  167. catch (CDBException* e)
  168. {
  169. SolveDBError(GetLastError(),e->m_strError);
  170. e->Delete();
  171. }
  172. return -1;
  173. }
  174. BOOL CODBCImpl::GetVersionInfo( OUT LPVOID lpVerInfo )
  175. {
  176. try{
  177. AutoThreadSection aSection(&s_critSection);
  178. if (!m_bOpen) return FALSE;
  179. TblVersion *pVerInfo = (TblVersion *)(lpVerInfo);
  180. CTblversion rsSt;
  181. rsSt.m_pDatabase = m_pdbInstance;
  182. rsSt.Open();
  183. INT_PTR nIndex = 0;
  184. while (!rsSt.IsEOF())
  185. {
  186. _stprintf_s(pVerInfo->szVersion, _T("%s"), rsSt.m_version);
  187. _stprintf_s(pVerInfo->szbakServer1, _T("%s"), rsSt.m_bakserver1);
  188. _stprintf_s(pVerInfo->szbakServer2, _T("%s"), rsSt.m_bakserver2);
  189. _stprintf_s(pVerInfo->szbakServer3, _T("%s"), rsSt.m_bakserver3);
  190. _stprintf_s(pVerInfo->szbakServer4, _T("%s"), rsSt.m_bakserver4);
  191. _stprintf_s(pVerInfo->szbakServer5, _T("%s"), rsSt.m_bakserver5);
  192. pVerInfo->bCheck1 = _ttoi(rsSt.m_check1);
  193. pVerInfo->bCheck2 = _ttoi(rsSt.m_check2);
  194. pVerInfo->bCheck3 = _ttoi(rsSt.m_check3);
  195. pVerInfo->bCheck4 = _ttoi(rsSt.m_check4);
  196. pVerInfo->bCheckbak1 = _ttoi(rsSt.m_bak1);
  197. pVerInfo->bCheckbak2 = _ttoi(rsSt.m_bak2);
  198. pVerInfo->bCheckbak3 = _ttoi(rsSt.m_bak3);
  199. pVerInfo->bCheckbak4 = _ttoi(rsSt.m_bak4);
  200. pVerInfo->bCheckbak5 = _ttoi(rsSt.m_bak5);
  201. pVerInfo->bCheckbak6 = _ttoi(rsSt.m_bak6);
  202. pVerInfo->bCheckbakdel1 = _ttoi(rsSt.m_delcheck1);
  203. pVerInfo->bCheckbakdel2 = _ttoi(rsSt.m_delcheck2);
  204. pVerInfo->bCheckbakdel3 = _ttoi(rsSt.m_delcheck3);
  205. pVerInfo->bCheckbakdel4 = _ttoi(rsSt.m_delcheck4);
  206. pVerInfo->bSubCheck1 = _ttoi(rsSt.m_bak11);
  207. pVerInfo->bSubCheck2 = _ttoi(rsSt.m_bak22);
  208. pVerInfo->bSubCheck3 = _ttoi(rsSt.m_bak33);
  209. pVerInfo->bSubCheck4 = _ttoi(rsSt.m_bak44);
  210. pVerInfo->nbakTime = _ttoi(rsSt.m_baktime);
  211. pVerInfo->nCheckMonth1 = _ttoi(rsSt.m_edit1);
  212. pVerInfo->nCheckMonth2 = _ttoi(rsSt.m_edit2);
  213. pVerInfo->nCheckMonth3 = _ttoi(rsSt.m_edit3);
  214. pVerInfo->nCheckMonth4 = _ttoi(rsSt.m_edit4);
  215. pVerInfo->nCheckbdMonth1 = _ttoi(rsSt.m_deledit1);
  216. pVerInfo->nCheckbdMonth2 = _ttoi(rsSt.m_deledit2);
  217. pVerInfo->nCheckbdMonth3 = _ttoi(rsSt.m_deledit3);
  218. pVerInfo->nCheckbdMonth4 = _ttoi(rsSt.m_deledit4);
  219. pVerInfo->bUpLoadCheck1 = _ttoi(rsSt.m_UploadCheck1);
  220. pVerInfo->bUpLoadCheck2 = _ttoi(rsSt.m_UploadCheck2);
  221. pVerInfo->bUpLoadCheck3 = _ttoi(rsSt.m_UploadCheck3);
  222. pVerInfo->bUpLoadCheck4 = _ttoi(rsSt.m_UploadCheck4);
  223. pVerInfo->strZiptype1 = rsSt.m_zipType1;
  224. pVerInfo->strZiptype1 = rsSt.m_zipType2;
  225. pVerInfo->strZiptype1 = rsSt.m_zipType3;
  226. pVerInfo->strZiptype1 = rsSt.m_zipType4;
  227. pVerInfo->strUploadRule = rsSt.m_strUpLoadRule;
  228. nIndex++;
  229. rsSt.MoveNext();
  230. }
  231. rsSt.Close();
  232. }
  233. catch (CDBException *e)
  234. {
  235. SolveDBError(GetLastError(),e->m_strError);
  236. e->Delete();
  237. return FALSE;
  238. }
  239. return TRUE;
  240. }
  241. BOOL CODBCImpl::GetNetShareInfo( OUT LPVOID lpNetShareInfo )
  242. {
  243. try{
  244. AutoThreadSection aSection(&s_critSection);
  245. if (!m_bOpen) return FALSE;
  246. vector<TblNetShareInfo> *pNetShareInfo = (vector<TblNetShareInfo> *)(lpNetShareInfo);
  247. CTblNetShareInfo rsSt;
  248. rsSt.m_pDatabase = m_pdbInstance;
  249. rsSt.Open();
  250. INT_PTR nIndex = 0;
  251. while (!rsSt.IsEOF())
  252. {
  253. TblNetShareInfo tagNetInfo;
  254. tagNetInfo.bEnable = rsSt.m_enable;
  255. _stprintf_s(tagNetInfo.szBranchId, _T("%s"), rsSt.m_branchid );
  256. _stprintf_s(tagNetInfo.szShareDirectory, _T("%s"), rsSt.m_sharepath );
  257. tagNetInfo.byMinCapacity = rsSt.m_mincapacity;
  258. tagNetInfo.byMaxCapacity = rsSt.m_maxcapacity;
  259. tagNetInfo.byImgType = rsSt.m_phototype;
  260. tagNetInfo.byPriority = rsSt.m_priority;
  261. pNetShareInfo->push_back(tagNetInfo);
  262. nIndex++;
  263. rsSt.MoveNext();
  264. }
  265. rsSt.Close();
  266. }
  267. catch (CDBException *e)
  268. {
  269. SolveDBError(GetLastError(),e->m_strError);
  270. e->Delete();
  271. return FALSE;
  272. }
  273. return TRUE;
  274. }