多数据源中间件标准版1.0

DBInterface.cpp 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. #include "StdAfx.h"
  2. #include "DBInterface.h"
  3. CDBInterface::CDBInterface( void )
  4. {
  5. this->m_PConnection = NULL;
  6. this->m_PCommand = NULL;
  7. this->m_pDBSemaphore = new CSemaphore( 1, 1 );
  8. m_bIsStarted = FALSE;
  9. }
  10. CDBInterface::~CDBInterface(void)
  11. {
  12. if( m_pDBSemaphore!=NULL )
  13. {
  14. delete( m_pDBSemaphore );
  15. m_pDBSemaphore = NULL;
  16. }
  17. if( m_PConnection )
  18. {
  19. if( m_PConnection->State )
  20. m_PConnection->Close();
  21. m_PConnection.Release();
  22. m_PConnection = NULL;
  23. }
  24. if( m_PCommand )
  25. m_PCommand.Release();
  26. //::CoUninitialize();
  27. }
  28. /*****************************************************************
  29. **【函数名称】 ConnectDataBase
  30. **【函数功能】 重连时调用
  31. **【参数】 ErrMassege :返回的错误信息
  32. **【返回值】 TRUE:连接创建成功 FALSE:连接创建失败
  33. **【调用模块】 (根据实际情况)
  34. ****************************************************************/
  35. bool CDBInterface::ConnectDataBase(const CString& connStr, CString &ErrMessage )
  36. {
  37. _bstr_t varSRC(connStr);
  38. m_ConnectStr = connStr;//连接字符串的值保存
  39. bool bRet = true;
  40. try
  41. {
  42. if (FAILED(m_PConnection->Open(varSRC,"","",adModeUnknown)))
  43. {
  44. ErrMessage = "执行Open操作失败, ConnectString = " + connStr;
  45. bRet = false;
  46. }
  47. else
  48. {
  49. m_PCommand->ActiveConnection=m_PConnection;
  50. }
  51. }
  52. catch (_com_error e)
  53. {
  54. bRet = false;
  55. ErrMessage = (LPCSTR)e.Description();
  56. ErrMessage = ErrMessage + _T(", ConnectString = ") + connStr;
  57. } // end catch
  58. return bRet;
  59. }
  60. /*****************************************************************
  61. **【函数名称】 CloseConn
  62. **【函数功能】 执行不返回记录集的SQL语句
  63. **【参数】 无
  64. **【返回值】 true执行成功,false执行失败
  65. **【调用模块】 (根据实际情况)
  66. **【修改】 (根据实际情况)
  67. ****************************************************************/
  68. bool CDBInterface::CloseConn()
  69. {
  70. bool bRet = true;
  71. if( m_PConnection )
  72. {
  73. if( m_PConnection->State )
  74. m_PConnection->Close();
  75. }
  76. else
  77. bRet = false;
  78. return bRet;
  79. }
  80. /*****************************************************************
  81. **【函数名称】 Init
  82. **【函数功能】 初始化数据库
  83. **【参数】 ErrMessage错误返回值
  84. **【返回值】 ture执行成功,反之-失败
  85. **【调用模块】 (根据实际情况)
  86. **【修改】 (根据实际情况)
  87. ****************************************************************/
  88. bool CDBInterface::Init( CString &ErrMessage )
  89. {
  90. //CoInitialize(NULL);
  91. bool bRet = true;
  92. try
  93. {
  94. if ( bRet)
  95. {
  96. if(FAILED(m_PConnection.CreateInstance("ADODB.Connection")))
  97. {
  98. ErrMessage = "ADO创建Connection失败!";
  99. bRet = false;
  100. }
  101. }
  102. if ( bRet)
  103. {
  104. m_PConnection->ConnectionTimeout =2;
  105. if(FAILED(m_PCommand.CreateInstance(__uuidof(Command))))
  106. {
  107. ErrMessage = "ADO创建Command失败";
  108. bRet = false;
  109. }
  110. }
  111. }
  112. catch (_com_error)
  113. {
  114. bRet = false;
  115. ErrMessage = "连接数据库失败!";
  116. }
  117. return bRet;
  118. }
  119. /*****************************************************************
  120. **【函数名称】 SqlCommand
  121. **【函数功能】 执行不返回记录集的SQL语句
  122. **【参数】 SQL:要执行的SQL语句,ErrMassege :返回的错误信息
  123. **【返回值】 TRUE:执行成功 FALSE:执行失败
  124. **【调用模块】 (根据实际情况)
  125. **【修改】 (根据实际情况)
  126. ****************************************************************/
  127. bool CDBInterface::SqlCommand(const CString& SQL, CString &ErrMessage )
  128. {
  129. _bstr_t sql( SQL );
  130. bool bRet = true;
  131. if (NULL == m_pDBSemaphore)
  132. {
  133. ErrMessage = "数据库初始化失败!";
  134. bRet = false;
  135. }
  136. if ( bRet )
  137. {
  138. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 )
  139. {
  140. try
  141. {
  142. m_PCommand->CommandText=sql;
  143. m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  144. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  145. }
  146. catch(_com_error &e)
  147. {
  148. ErrMessage=(LPCSTR)e.Description();
  149. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  150. || ErrMessage.Find("gone") != -1)
  151. {
  152. m_bIsStarted=FALSE;
  153. }
  154. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量
  155. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  156. || ErrMessage.Find("gone") != -1)
  157. {
  158. ReConnectStart(ErrMessage);
  159. }
  160. ErrMessage+="SqlCommand:";
  161. bRet = false;
  162. }
  163. }
  164. else
  165. {
  166. bRet = false;
  167. ErrMessage="sqlcommandWAIT";
  168. }
  169. }
  170. return bRet;
  171. }
  172. /*****************************************************************
  173. **【函数名称】 SqlRecordset
  174. **【函数功能】 执行返回记录集的SQL语句
  175. **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败
  176. ErrMassege :返回的错误信息
  177. **【返回值】 返回的ADO记录集
  178. **【调用模块】 (根据实际情况)
  179. ****************************************************************/
  180. _RecordsetPtr CDBInterface::SqlRecordset(const CString& SQL, bool &State, CString &ErrMessage )
  181. {
  182. _bstr_t sql( SQL );
  183. _RecordsetPtr TmpRecordset;
  184. State = true;
  185. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 )
  186. {
  187. try
  188. {
  189. m_PCommand->ActiveConnection=m_PConnection;
  190. m_PCommand->CommandText=sql;
  191. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  192. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  193. }
  194. catch(_com_error e)
  195. {
  196. ErrMessage=(LPCSTR)e.Description();
  197. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  198. || ErrMessage.Find("gone") != -1)
  199. {
  200. m_bIsStarted=FALSE;
  201. }
  202. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量
  203. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  204. || ErrMessage.Find("gone") != -1)
  205. {
  206. ReConnectStart(ErrMessage);
  207. }
  208. ErrMessage+="SqlRecordset:";
  209. State = false;
  210. }
  211. }
  212. else
  213. {
  214. State = false;
  215. ErrMessage="wait Error";
  216. if(NULL != TmpRecordset)
  217. {
  218. TmpRecordset.Release();
  219. TmpRecordset = NULL;
  220. }
  221. }
  222. return TmpRecordset;
  223. }
  224. /*****************************************************************
  225. **【函数名称】 SqlRecordsetNocritical
  226. **【函数功能】 执行返回记录集的SQL语句,不带临界区
  227. **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败
  228. ErrMassege :返回的错误信息
  229. **【返回值】 返回的ADO记录集
  230. **【调用模块】 (根据实际情况)
  231. ****************************************************************/
  232. _RecordsetPtr CDBInterface::SqlRecordsetNocritical(const CString& SQL, bool &State, CString &ErrMessage )
  233. {
  234. _bstr_t sql( SQL );
  235. _RecordsetPtr TmpRecordset;
  236. State = true;
  237. try
  238. {
  239. m_PCommand->ActiveConnection=m_PConnection;
  240. m_PCommand->CommandText=sql;
  241. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  242. }
  243. catch(_com_error e)
  244. {
  245. ErrMessage=(LPCSTR)e.Description();
  246. ErrMessage+="SqlRecordset:";
  247. State = false;
  248. }
  249. return TmpRecordset;
  250. }
  251. /*****************************************************************
  252. **【函数名称】 GetSingleData
  253. **【函数功能】 执行返回记录集的SQL语句中一个字段值
  254. **【参数】 SQL:要执行的SQL语句
  255. nFieldIndx:指定取返回的字段
  256. sValue:返回字段值
  257. ErrMassege :返回的错误信息
  258. **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录
  259. **【调用模块】 (根据实际情况)
  260. ****************************************************************/
  261. int CDBInterface::GetSingleData(const CString& SQL, const unsigned int nFieldIndx,
  262. CString &sValue, CString &ErrMessage)
  263. {
  264. _RecordsetPtr TmpRecordset = NULL;
  265. _variant_t VarValue;
  266. bool State;
  267. const int EXEC_ERROR = -1; // 执行失败
  268. const int EXEC_OK = 0; // 正常
  269. const int EXEC_NOVALUE = 1; // 未找到记录
  270. int nRet = EXEC_OK;
  271. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 )
  272. {
  273. // 取指定值
  274. try
  275. {
  276. TmpRecordset = SqlRecordsetNocritical( SQL, State, ErrMessage );
  277. if ((TmpRecordset != NULL)&&(State))
  278. {
  279. if ((!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) )
  280. {
  281. TmpRecordset->MoveFirst();
  282. VarValue = TmpRecordset->GetCollect((_variant_t)(long)nFieldIndx);
  283. sValue.Format("%s", (char *)_bstr_t( VarValue ));
  284. nRet = EXEC_OK;
  285. }
  286. else
  287. {
  288. nRet = EXEC_NOVALUE;
  289. }
  290. }
  291. else
  292. {
  293. ErrMessage = "未找到记录";
  294. nRet = EXEC_ERROR;
  295. }
  296. }
  297. catch(_com_error e)
  298. {
  299. ErrMessage =(LPCSTR) e.Description();
  300. ErrMessage+= "GetDataIn";
  301. nRet = EXEC_ERROR;
  302. }
  303. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  304. }
  305. if(NULL != TmpRecordset)
  306. {
  307. TmpRecordset.Release();
  308. TmpRecordset = NULL;
  309. }
  310. return nRet;
  311. }
  312. /*****************************************************************
  313. **【函数名称】 GetSingleData
  314. **【函数功能】 执行返回记录集的SQL语句中一个字段值
  315. **【参数】 SQL:要执行的SQL语句
  316. strField:指定取返回的字段
  317. sValue:返回字段值
  318. ErrMassege :返回的错误信息
  319. **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录
  320. **【调用模块】 (根据实际情况)
  321. ****************************************************************/
  322. int CDBInterface::GetSingleData(const CString& SQL, const CString strField,
  323. CString &sValue, CString &ErrMessage)
  324. {
  325. _RecordsetPtr TmpRecordset = NULL;
  326. _variant_t VarValue;
  327. bool State;
  328. const int EXEC_ERROR = -1; // 执行失败
  329. const int EXEC_OK = 0; // 正常
  330. const int EXEC_NOVALUE = 1; // 未找到记录
  331. int nRet = EXEC_OK;
  332. _bstr_t sql( SQL );
  333. State = true;
  334. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 )
  335. {
  336. try
  337. {
  338. m_PCommand->CommandText=sql;
  339. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  340. }
  341. catch(_com_error e)
  342. {
  343. ErrMessage+= (LPCSTR)e.Description();
  344. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  345. ||(ErrMessage.Find("gone") != -1))
  346. {
  347. m_bIsStarted=FALSE;
  348. }
  349. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  350. if(NULL != TmpRecordset )
  351. {
  352. TmpRecordset.Release();
  353. TmpRecordset = NULL;
  354. }
  355. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  356. ||(ErrMessage.Find("gone") != -1))
  357. {
  358. TRACE0("FAILE GetRecord*");
  359. ReConnectStart(ErrMessage);
  360. }
  361. ErrMessage+= "GetRecordset";
  362. State = false;
  363. return -1;
  364. }
  365. // 取指定值
  366. try
  367. {
  368. if (TmpRecordset != NULL)
  369. {
  370. if ( (!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) )
  371. {
  372. TmpRecordset->MoveFirst();
  373. VarValue = TmpRecordset->GetCollect((_variant_t)strField);
  374. sValue.Format("%s", (char *)_bstr_t( VarValue ));
  375. nRet = EXEC_OK;
  376. }
  377. else
  378. {
  379. nRet = EXEC_NOVALUE;
  380. ErrMessage ="GetCollectError*";
  381. }
  382. }
  383. else
  384. {
  385. ErrMessage = "GetRecordNull*";
  386. nRet = EXEC_ERROR;
  387. }
  388. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  389. }
  390. catch(_com_error e)
  391. {
  392. if(NULL != TmpRecordset)
  393. {
  394. TmpRecordset.Release();
  395. TmpRecordset = NULL;
  396. }
  397. ErrMessage+= (LPCSTR)e.Description();
  398. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  399. ||(ErrMessage.Find("gone") != -1))
  400. {
  401. m_bIsStarted=FALSE;
  402. }
  403. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  404. if((ErrMessage.Find("链接失败") != -1 )|| (ErrMessage.Find("被关闭或无效") != -1)
  405. ||(ErrMessage.Find("gone") != -1))
  406. {
  407. TRACE0("FAILE GetFiled*");
  408. ReConnectStart(ErrMessage);
  409. }
  410. ErrMessage+="RecordsetGetfiled";
  411. nRet = EXEC_ERROR;
  412. }
  413. }
  414. else
  415. {
  416. State = false;
  417. ErrMessage="wait Error";
  418. if(NULL != TmpRecordset)
  419. {
  420. TmpRecordset.Release();
  421. TmpRecordset = NULL;
  422. }
  423. }
  424. if(NULL != TmpRecordset)
  425. {
  426. TmpRecordset.Release();
  427. TmpRecordset = NULL;
  428. }
  429. return nRet;
  430. }
  431. /*****************************************************************
  432. **【函数名称】 ReConnectStart
  433. **【函数功能】 构造函数
  434. **【参数】 pParam传入使用主体对象,ErrMessage错误返回值
  435. **【返回值】 ture执行成功,反之-失败
  436. **【调用模块】 (根据实际情况)
  437. **【修改】 (根据实际情况)
  438. ****************************************************************/
  439. bool CDBInterface::ReConnectStart(CString &ErrMessage )
  440. {
  441. try
  442. {
  443. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 10 ) == WAIT_OBJECT_0 )
  444. {
  445. if(!m_bIsStarted )
  446. {
  447. if( m_PConnection->State )
  448. m_PConnection->Close();
  449. if(ConnectDataBase(m_ConnectStr,ErrMessage))
  450. {
  451. m_bIsStarted = TRUE;
  452. }
  453. }
  454. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  455. }
  456. }
  457. catch(_com_error e)
  458. {
  459. ErrMessage = "数据库重新连接线程启动失败!";
  460. m_bIsStarted = FALSE;
  461. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  462. }
  463. return true;
  464. }
  465. /*****************************************************************
  466. **【函数名称】 ReLease
  467. **【函数功能】 释放资源
  468. **【参数】 无
  469. **【返回值】
  470. ****************************************************************/
  471. void CDBInterface::ReLease()
  472. {
  473. if( m_pDBSemaphore!=NULL )
  474. {
  475. delete( m_pDBSemaphore );
  476. m_pDBSemaphore = NULL;
  477. }
  478. if( m_PConnection )
  479. {
  480. if( m_PConnection->State )
  481. m_PConnection->Close();
  482. m_PConnection.Release();
  483. m_PConnection = NULL;
  484. }
  485. if( m_PCommand )
  486. m_PCommand.Release();
  487. ::CoUninitialize();
  488. }