诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1074 lines
24 KiB

  1. #include "StdAfx.h"
  2. #include "Math.h"
  3. #include "TraceService.h"
  4. #include "DataBase.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //宏定义
  7. _COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));
  8. //效验结果宏
  9. #define EfficacyResult(hResult) { if (FAILED(hResult)) _com_issue_error(hResult); }
  10. //////////////////////////////////////////////////////////////////////////
  11. //构造函数
  12. CADOError::CADOError()
  13. {
  14. m_enErrorType = SQLException_None;
  15. }
  16. //析构函数
  17. CADOError::~CADOError()
  18. {
  19. }
  20. //接口查询
  21. void * CADOError::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  22. {
  23. QUERYINTERFACE(IDataBaseException, Guid, dwQueryVer);
  24. QUERYINTERFACE_IUNKNOWNEX(IDataBaseException, Guid, dwQueryVer);
  25. return NULL;
  26. }
  27. //设置错误
  28. void CADOError::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe)
  29. {
  30. //设置错误
  31. m_enErrorType = enErrorType;
  32. m_strErrorDescribe = pszDescribe;
  33. //抛出错误
  34. throw QUERY_ME_INTERFACE(IDataBaseException);
  35. return;
  36. }
  37. //////////////////////////////////////////////////////////////////////////
  38. //构造函数
  39. CDataBase::CDataBase() : m_dwResumeConnectCount(30L), m_dwResumeConnectTime(30L)
  40. {
  41. //状态变量
  42. m_dwConnectCount = 0;
  43. m_dwConnectErrorTime = 0L;
  44. //创建对象
  45. m_DBCommand.CreateInstance(__uuidof(Command));
  46. m_DBRecordset.CreateInstance(__uuidof(Recordset));
  47. m_DBConnection.CreateInstance(__uuidof(Connection));
  48. //效验数据
  49. ASSERT(m_DBCommand != NULL);
  50. ASSERT(m_DBRecordset != NULL);
  51. ASSERT(m_DBConnection != NULL);
  52. if (m_DBCommand == NULL) throw TEXT("数据库命令对象创建失败");
  53. if (m_DBRecordset == NULL) throw TEXT("数据库记录集对象创建失败");
  54. if (m_DBConnection == NULL) throw TEXT("数据库连接对象创建失败");
  55. //设置变量
  56. m_DBCommand->CommandType = adCmdStoredProc;
  57. return;
  58. }
  59. //析构函数
  60. CDataBase::~CDataBase()
  61. {
  62. //关闭连接
  63. CloseConnection();
  64. //释放对象
  65. m_DBCommand.Release();
  66. m_DBRecordset.Release();
  67. m_DBConnection.Release();
  68. return;
  69. }
  70. //接口查询
  71. void * CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  72. {
  73. QUERYINTERFACE(IDataBase, Guid, dwQueryVer);
  74. QUERYINTERFACE_IUNKNOWNEX(IDataBase, Guid, dwQueryVer);
  75. return NULL;
  76. }
  77. //打开连接
  78. VOID CDataBase::OpenConnection()
  79. {
  80. //连接数据库
  81. try
  82. {
  83. //关闭连接
  84. CloseConnection();
  85. //连接数据库
  86. EfficacyResult(m_DBConnection->Open(_bstr_t(m_strConnect), L"", L"", adConnectUnspecified));
  87. m_DBConnection->CursorLocation = adUseClient;
  88. m_DBCommand->ActiveConnection = m_DBConnection;
  89. //设置变量
  90. m_dwConnectCount = 0L;
  91. m_dwConnectErrorTime = 0L;
  92. }
  93. catch (CComError & ComError)
  94. {
  95. CString csTest;
  96. csTest.Format(L"OpenConnection");
  97. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  98. }
  99. }
  100. //关闭记录
  101. VOID CDataBase::CloseRecordset()
  102. {
  103. try
  104. {
  105. if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close());
  106. }
  107. catch (CComError & ComError)
  108. {
  109. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  110. }
  111. }
  112. //关闭连接
  113. VOID CDataBase::CloseConnection()
  114. {
  115. try
  116. {
  117. CloseRecordset();
  118. if ((m_DBConnection != NULL) && (m_DBConnection->GetState() != adStateClosed))
  119. {
  120. EfficacyResult(m_DBConnection->Close());
  121. }
  122. }
  123. catch (CComError & ComError)
  124. {
  125. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  126. }
  127. }
  128. //重新连接
  129. bool CDataBase::TryConnectAgain(bool bFocusConnect, CComError * pComError)
  130. {
  131. try
  132. {
  133. //判断重连
  134. bool bReConnect = bFocusConnect;
  135. if (bReConnect == false)
  136. {
  137. DWORD dwNowTime = (DWORD)time(NULL);
  138. if ((m_dwConnectErrorTime + m_dwResumeConnectTime) > dwNowTime) bReConnect = true;
  139. }
  140. if ((bReConnect == false) && (m_dwConnectCount > m_dwResumeConnectCount)) bReConnect = true;
  141. //设置变量
  142. m_dwConnectCount++;
  143. m_dwConnectErrorTime = (DWORD)time(NULL);
  144. if (bReConnect == false)
  145. {
  146. if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError));
  147. return false;
  148. }
  149. //重新连接
  150. OpenConnection();
  151. return true;
  152. }
  153. catch (IDataBaseException * pIDataBaseException)
  154. {
  155. //重新连接错误
  156. if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError));
  157. else throw pIDataBaseException;
  158. }
  159. return false;
  160. }
  161. //连接信息
  162. bool CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
  163. {
  164. //效验参数
  165. ASSERT(dwDBAddr != 0);
  166. ASSERT(szDBName != NULL);
  167. ASSERT(szUser != NULL);
  168. ASSERT(szPassword != NULL);
  169. BYTE a = (BYTE)((dwDBAddr >> 24) & 0xFF);
  170. BYTE b = (BYTE)((dwDBAddr >> 16) & 0xFF);
  171. BYTE c = (BYTE)((dwDBAddr >> 8) & 0xFF);
  172. BYTE d = (BYTE)(dwDBAddr & 0xFF);
  173. try
  174. {
  175. //构造连接字符串
  176. m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%d.%d.%d.%d;Data Source=%s,%ld;"),
  177. szPassword, szUser, szDBName, a, b, c, d, wPort);
  178. }
  179. catch (CComError & ComError)
  180. {
  181. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  182. }
  183. return true;
  184. }
  185. //切换记录
  186. VOID CDataBase::NextRecordset()
  187. {
  188. try
  189. {
  190. VARIANT lngRec;
  191. m_DBRecordset->NextRecordset(&lngRec);
  192. return;
  193. }
  194. catch (CComError & ComError)
  195. {
  196. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  197. }
  198. }
  199. //设置信息
  200. bool CDataBase::SetConnectionInfo(LPCTSTR szDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
  201. {
  202. //效验参数
  203. ASSERT(szDBAddr != NULL);
  204. ASSERT(szDBName != NULL);
  205. ASSERT(szUser != NULL);
  206. ASSERT(szPassword != NULL);
  207. try
  208. {
  209. //构造连接字符串
  210. m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"),
  211. szPassword, szUser, szDBName, szDBAddr, wPort);
  212. }
  213. catch (CComError & ComError)
  214. {
  215. CString csTest;
  216. csTest.Format(L"SetConnectionInfo:szDBAddr=%s,wPort=%d,szDBName=%s,szUser=%s,szPassword=%s", szDBAddr, wPort, szDBName, szUser, szPassword);
  217. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  218. }
  219. return true;
  220. }
  221. //是否连接错误
  222. bool CDataBase::IsConnectError()
  223. {
  224. try
  225. {
  226. //状态判断
  227. if (m_DBConnection == NULL) return true;
  228. if (m_DBConnection->GetState() == adStateClosed) return true;
  229. //参数判断
  230. long lErrorCount = m_DBConnection->Errors->Count;
  231. if (lErrorCount > 0L)
  232. {
  233. ErrorPtr pError = NULL;
  234. for (long i = 0; i < lErrorCount; i++)
  235. {
  236. pError = m_DBConnection->Errors->GetItem(i);
  237. if (pError->Number == 0x80004005) return true;
  238. }
  239. }
  240. return false;
  241. }
  242. catch (CComError & ComError)
  243. {
  244. CString csTest;
  245. csTest.Format(L"IsConnectError");
  246. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  247. }
  248. return false;
  249. }
  250. //是否打开
  251. bool CDataBase::IsRecordsetOpened()
  252. {
  253. if (m_DBRecordset == NULL) return false;
  254. if (m_DBRecordset->GetState() == adStateClosed) return false;
  255. return true;
  256. }
  257. //往下移动
  258. void CDataBase::MoveToNext()
  259. {
  260. try
  261. {
  262. m_DBRecordset->MoveNext();
  263. }
  264. catch (CComError & ComError)
  265. {
  266. CString csTest;
  267. csTest.Format(L"MoveToNext");
  268. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  269. }
  270. return;
  271. }
  272. //移到开头
  273. void CDataBase::MoveToFirst()
  274. {
  275. try
  276. {
  277. m_DBRecordset->MoveFirst();
  278. }
  279. catch (CComError & ComError)
  280. {
  281. CString csTest;
  282. csTest.Format(L"MoveToFirst");
  283. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  284. }
  285. return;
  286. }
  287. //是否结束
  288. bool CDataBase::IsRecordsetEnd()
  289. {
  290. try
  291. {
  292. return (m_DBRecordset->EndOfFile == VARIANT_TRUE);
  293. }
  294. catch (CComError & ComError)
  295. {
  296. CString csTest;
  297. csTest.Format(L"IsRecordsetEnd");
  298. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  299. }
  300. return true;
  301. }
  302. //获取数目
  303. long CDataBase::GetRecordCount()
  304. {
  305. try
  306. {
  307. if (m_DBRecordset == NULL) return 0;
  308. return m_DBRecordset->GetRecordCount();
  309. }
  310. catch (CComError & ComError)
  311. {
  312. CString csTest;
  313. csTest.Format(L"GetRecordCount");
  314. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  315. }
  316. return 0;
  317. }
  318. //获取大小
  319. long CDataBase::GetActualSize(LPCTSTR pszParamName)
  320. {
  321. ASSERT(pszParamName != NULL);
  322. try
  323. {
  324. return m_DBRecordset->Fields->Item[pszParamName]->ActualSize;
  325. }
  326. catch (CComError & ComError)
  327. {
  328. CString csTest;
  329. csTest.Format(L"GetActualSize:%s", pszParamName);
  330. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  331. }
  332. return -1;
  333. }
  334. //绑定对象
  335. VOID CDataBase::BindToRecordset(CADORecordBinding * pBind)
  336. {
  337. ASSERT(pBind != NULL);
  338. try
  339. {
  340. IADORecordBindingPtr pIBind(m_DBRecordset);
  341. pIBind->BindToRecordset(pBind);
  342. }
  343. catch (CComError & ComError)
  344. {
  345. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  346. }
  347. }
  348. //获取数据
  349. VOID CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue)
  350. {
  351. ASSERT(pszItem != NULL);
  352. try
  353. {
  354. DBVarValue = m_DBRecordset->Fields->GetItem(pszItem)->Value;
  355. }
  356. catch (CComError & ComError)
  357. {
  358. CString csTest;
  359. csTest.Format(L"GetRecordsetValue:%s", pszItem);
  360. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  361. }
  362. }
  363. //获取参数
  364. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue)
  365. {
  366. bValue = 0;
  367. try
  368. {
  369. bValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  370. return true;
  371. }
  372. catch (CComError & ComError)
  373. {
  374. CString csTest;
  375. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  376. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  377. }
  378. return false;
  379. }
  380. //获取参数
  381. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue)
  382. {
  383. ulValue = 0;
  384. try
  385. {
  386. ulValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  387. return true;
  388. }
  389. catch (CComError & ComError)
  390. {
  391. CString csTest;
  392. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  393. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  394. }
  395. return false;
  396. }
  397. //获取参数
  398. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue)
  399. {
  400. dbValue = 0.0;
  401. try
  402. {
  403. dbValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  404. return true;
  405. }
  406. catch (CComError & ComError)
  407. {
  408. CString csTest;
  409. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  410. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  411. }
  412. return false;
  413. }
  414. //获取参数
  415. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, LONG & lValue)
  416. {
  417. lValue = 0L;
  418. try
  419. {
  420. lValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  421. return true;
  422. }
  423. catch (CComError & ComError)
  424. {
  425. CString csTest;
  426. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  427. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  428. }
  429. return false;
  430. }
  431. //获取参数
  432. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue)
  433. {
  434. ulValue = 0L;
  435. try
  436. {
  437. ulValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  438. return true;
  439. }
  440. catch (CComError & ComError)
  441. {
  442. CString csTest;
  443. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  444. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  445. }
  446. return false;
  447. }
  448. //获取参数
  449. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, INT & nValue)
  450. {
  451. nValue = 0L;
  452. try
  453. {
  454. nValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  455. return true;
  456. }
  457. catch (CComError & ComError)
  458. {
  459. CString csTest;
  460. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  461. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  462. }
  463. return false;
  464. }
  465. //获取参数
  466. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue)
  467. {
  468. llValue = 0;
  469. try
  470. {
  471. llValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  472. return true;
  473. }
  474. catch (CComError & ComError)
  475. {
  476. CString csTest;
  477. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  478. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  479. }
  480. return false;
  481. }
  482. //获取参数
  483. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize)
  484. {
  485. try
  486. {
  487. _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  488. if (vtFld.vt == VT_BSTR)
  489. {
  490. _sntprintf(szBuffer, uSize, TEXT("%s"), (TCHAR*)_bstr_t(vtFld));
  491. return true;
  492. }
  493. return false;
  494. }
  495. catch (CComError & ComError)
  496. {
  497. CString csTest;
  498. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  499. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  500. }
  501. ASSERT(0);
  502. return false;
  503. }
  504. //获取参数
  505. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, WORD & wValue)
  506. {
  507. wValue = 0L;
  508. try
  509. {
  510. wValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  511. return true;
  512. }
  513. catch (CComError & ComError)
  514. {
  515. CString csTest;
  516. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  517. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  518. }
  519. return false;
  520. }
  521. //获取参数
  522. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time)
  523. {
  524. try
  525. {
  526. _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  527. switch (vtFld.vt)
  528. {
  529. case VT_DATE:
  530. {
  531. COleDateTime TempTime(vtFld);
  532. Time = TempTime;
  533. break;
  534. }
  535. case VT_EMPTY:
  536. case VT_NULL:
  537. {
  538. Time.SetStatus(COleDateTime::null);
  539. break;
  540. }
  541. default:
  542. return false;
  543. }
  544. return true;
  545. }
  546. catch (CComError & ComError)
  547. {
  548. CString csTest;
  549. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  550. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  551. }
  552. return false;
  553. }
  554. //获取参数
  555. bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, bool & bValue)
  556. {
  557. bValue = false;
  558. try
  559. {
  560. bValue = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
  561. return true;
  562. }
  563. catch (CComError & ComError)
  564. {
  565. CString csTest;
  566. csTest.Format(L"GetFieldValue:%s", lpFieldName);
  567. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  568. }
  569. return false;
  570. }
  571. //获取返回数值
  572. long CDataBase::GetReturnValue()
  573. {
  574. try
  575. {
  576. _ParameterPtr Parameter;
  577. long lParameterCount = m_DBCommand->Parameters->Count;
  578. for (long i = 0; i < lParameterCount; i++)
  579. {
  580. Parameter = m_DBCommand->Parameters->Item[i];
  581. if (Parameter->Direction == adParamReturnValue) return Parameter->Value;
  582. }
  583. }
  584. catch (CComError & ComError)
  585. {
  586. CString csTest;
  587. csTest.Format(L"GetReturnValue");
  588. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  589. }
  590. return 0;
  591. }
  592. //删除参数
  593. void CDataBase::ClearParameters()
  594. {
  595. try
  596. {
  597. long lParameterCount = m_DBCommand->Parameters->Count;
  598. if (lParameterCount > 0L)
  599. {
  600. for (long i = lParameterCount; i > 0; i--)
  601. {
  602. m_DBCommand->Parameters->Delete(i - 1);
  603. }
  604. }
  605. }
  606. catch (CComError & ComError)
  607. {
  608. SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  609. }
  610. return;
  611. }
  612. //获得参数
  613. void CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue)
  614. {
  615. //效验参数
  616. ASSERT(pszParamName != NULL);
  617. //获取参数
  618. try
  619. {
  620. DBVarValue.Clear();
  621. DBVarValue = m_DBCommand->Parameters->Item[pszParamName]->Value;
  622. }
  623. catch (CComError & ComError)
  624. {
  625. CString csTest;
  626. csTest.Format(L"GetParameter:%s", pszParamName);
  627. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  628. }
  629. return;
  630. }
  631. //插入参数
  632. void CDataBase::AddParameter(LPCTSTR pszName, ADOCG::DataTypeEnum Type, ADOCG::ParameterDirectionEnum Direction, LONG lSize, CDBVarValue & DBVarValue)
  633. {
  634. ASSERT(pszName != NULL);
  635. if (pszName == NULL) return;
  636. try
  637. {
  638. _ParameterPtr Parameter = m_DBCommand->CreateParameter(pszName, Type, Direction, lSize, DBVarValue);
  639. m_DBCommand->Parameters->Append(Parameter);
  640. }
  641. catch (CComError & ComError)
  642. {
  643. CString csTest;
  644. csTest.Format(L"AddParameter:%s", pszName);
  645. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, csTest));
  646. }
  647. }
  648. //执行语句
  649. VOID CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset)
  650. {
  651. ASSERT(pszSPName != NULL);
  652. try
  653. {
  654. //关闭记录集
  655. CloseRecordset();
  656. m_DBCommand->CommandText = pszSPName;
  657. //执行命令
  658. if (bRecordset == true)
  659. {
  660. m_DBRecordset->PutRefSource(m_DBCommand);
  661. m_DBRecordset->CursorLocation = adUseClient;
  662. EfficacyResult(m_DBRecordset->Open((IDispatch *)m_DBCommand, vtMissing, adOpenForwardOnly, adLockReadOnly, adOptionUnspecified));
  663. }
  664. else
  665. {
  666. m_DBConnection->CursorLocation = adUseClient;
  667. EfficacyResult(m_DBCommand->Execute(NULL, NULL, adExecuteNoRecords));
  668. }
  669. }
  670. catch (CComError & ComError)
  671. {
  672. if (IsConnectError() == true) TryConnectAgain(false, &ComError);
  673. else
  674. {
  675. SetErrorInfo(SQLException_Syntax, GetComErrorDescribeEx(ComError, pszSPName));
  676. }
  677. }
  678. }
  679. //执行命令
  680. VOID CDataBase::ExecuteSentence(LPCTSTR pszCommand, bool bRecordset)
  681. {
  682. ASSERT(pszCommand != NULL);
  683. try
  684. {
  685. m_DBConnection->CursorLocation = adUseClient;
  686. m_DBConnection->Execute(pszCommand, NULL, adExecuteNoRecords);
  687. }
  688. catch (CComError & ComError)
  689. {
  690. if (IsConnectError() == true) TryConnectAgain(false, &ComError);
  691. else SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
  692. }
  693. }
  694. //获取错误
  695. LPCTSTR CDataBase::GetComErrorDescribe(CComError & ComError)
  696. {
  697. _bstr_t bstrDescribe(ComError.Description());
  698. m_strErrorDescribe.Format(TEXT("ADO 错误:0x%8x,%s"), ComError.Error(), (LPCTSTR)bstrDescribe);
  699. return m_strErrorDescribe;
  700. }
  701. //获取错误
  702. LPCTSTR CDataBase::GetComErrorDescribeEx(CComError & ComError, LPCTSTR pszSPName)
  703. {
  704. _bstr_t bstrDescribe(ComError.Description());
  705. m_strErrorDescribe.Format(TEXT("[%s]ADO 错误:0x%8x,%s"), pszSPName, ComError.Error(), (LPCTSTR)bstrDescribe);
  706. return m_strErrorDescribe;
  707. }
  708. //设置错误
  709. void CDataBase::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe)
  710. {
  711. m_ADOError.SetErrorInfo(enErrorType, pszDescribe);
  712. return;
  713. }
  714. //////////////////////////////////////////////////////////////////////////
  715. //构造函数
  716. CDataBaseEngine::CDataBaseEngine(void)
  717. {
  718. //设置变量
  719. m_bService = false;
  720. m_pIDataBaseEngineSink = NULL;
  721. return;
  722. }
  723. //析构函数
  724. CDataBaseEngine::~CDataBaseEngine(void)
  725. {
  726. }
  727. //接口查询
  728. void * CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  729. {
  730. QUERYINTERFACE(IDataBaseEngine, Guid, dwQueryVer);
  731. QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
  732. QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine, Guid, dwQueryVer);
  733. return NULL;
  734. }
  735. bool CDataBaseEngine::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
  736. {
  737. return false;
  738. }
  739. //注册接口
  740. bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx)
  741. {
  742. //效验参数
  743. ASSERT(pIUnknownEx != NULL);
  744. //ASSERT(m_pIDataBaseEngineSink == NULL);
  745. if (pIUnknownEx == NULL) return false;
  746. if (m_pIDataBaseEngineSink != NULL) return false;
  747. //查询接口
  748. m_pIDataBaseEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IDataBaseEngineSink);
  749. if (m_pIDataBaseEngineSink == NULL)
  750. {
  751. CTraceService::TraceString(TEXT("数据库引擎外挂服务接口获取失败,挂接操作失败"), TraceLevel_Exception);
  752. return false;
  753. }
  754. return true;
  755. }
  756. //注册接口
  757. bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx[], WORD wSinkCount)
  758. {
  759. for (WORD i = 0; i < wSinkCount; i++)
  760. {
  761. SetDataBaseEngineSink(pIUnknownEx[i]);
  762. }
  763. return true;
  764. }
  765. //启动服务
  766. bool CDataBaseEngine::StartService()
  767. {
  768. //判断状态
  769. if (m_bService == true)
  770. {
  771. CTraceService::TraceString(TEXT("数据库引擎重复启动,启动操作忽略"), TraceLevel_Warning);
  772. return true;
  773. }
  774. //外挂接口
  775. if (m_pIDataBaseEngineSink == NULL)
  776. {
  777. CTraceService::TraceString(TEXT("数据库引擎外挂服务不存在"), TraceLevel_Exception);
  778. return false;
  779. }
  780. //设置队列
  781. if (m_QueueServiceEvent.SetQueueServiceSink(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  782. {
  783. CTraceService::TraceString(TEXT("数据库引擎与队列服务绑定失败"), TraceLevel_Exception);
  784. return false;
  785. }
  786. //启动外挂
  787. if (m_pIDataBaseEngineSink->OnDataBaseEngineStart(QUERY_ME_INTERFACE(IUnknownEx)) == false)
  788. {
  789. CTraceService::TraceString(TEXT("数据库引擎外挂服务启动失败"), TraceLevel_Exception);
  790. return false;
  791. }
  792. //设置变量
  793. m_bService = true;
  794. return true;
  795. }
  796. //停止服务
  797. bool CDataBaseEngine::ConcludeService()
  798. {
  799. //设置变量
  800. m_bService = false;
  801. tagBurthenInfo BurthenInfo;
  802. int nTimeout = 1000;
  803. while (true)
  804. {
  805. m_QueueServiceEvent.m_pIQueueService.GetBurthenInfo(BurthenInfo);
  806. if (BurthenInfo.dwDataPacketCount <= 0 || nTimeout <= 0) //magiii 12/08/23/ 等待队列处理完成
  807. break;
  808. nTimeout--;
  809. ::Sleep(10);
  810. }
  811. //停止请求队列
  812. m_QueueServiceEvent.SetQueueServiceSink(NULL);
  813. //停止外挂
  814. if (m_pIDataBaseEngineSink != NULL)
  815. {
  816. m_pIDataBaseEngineSink->OnDataBaseEngineConclude(QUERY_ME_INTERFACE(IUnknownEx));
  817. m_pIDataBaseEngineSink = NULL;
  818. }
  819. return true;
  820. }
  821. //队列接口
  822. void CDataBaseEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
  823. {
  824. //判断状态
  825. if (m_bService == false) return;
  826. //请求处理
  827. switch (wIdentifier)
  828. {
  829. case EVENT_DATABASE:
  830. {
  831. //效验参数
  832. ASSERT(pBuffer != NULL);
  833. ASSERT(wDataSize >= sizeof(NTY_DataBaseEvent));
  834. if (wDataSize < sizeof(NTY_DataBaseEvent)) return;
  835. //变量定义
  836. NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)pBuffer;
  837. WORD wHandleBuffer = wDataSize - sizeof(NTY_DataBaseEvent);
  838. //处理数据
  839. ASSERT(m_pIDataBaseEngineSink != NULL);
  840. m_pIDataBaseEngineSink->OnDataBaseEngineRequest(pDataBaseEvent->wRequestID, pDataBaseEvent->dwContextID, pDataBaseEvent + 1, wHandleBuffer);
  841. return;
  842. }
  843. case EVENT_TIMER://时间事件
  844. {
  845. //效验参数
  846. ASSERT(pBuffer != NULL);
  847. ASSERT(wDataSize >= sizeof(NTY_TimerEvent));
  848. if (wDataSize < sizeof(NTY_TimerEvent)) return;
  849. //变量定义
  850. NTY_TimerEvent * pDataBaseEvent = (NTY_TimerEvent *)pBuffer;
  851. WORD wHandleBuffer = wDataSize - sizeof(NTY_TimerEvent);
  852. //处理数据
  853. ASSERT(m_pIDataBaseEngineSink != NULL);
  854. m_pIDataBaseEngineSink->OnDataBaseEngineTimer(pDataBaseEvent->dwTimerID, pDataBaseEvent->dwBindParameter);
  855. return;
  856. }
  857. case EVENT_CONTROL://控制事件
  858. {
  859. //效验参数
  860. ASSERT(pBuffer != NULL);
  861. ASSERT(wDataSize >= sizeof(NTY_ControlEvent));
  862. if (wDataSize < sizeof(NTY_ControlEvent)) return;
  863. //变量定义
  864. NTY_ControlEvent * pDataBaseEvent = (NTY_ControlEvent *)pBuffer;
  865. WORD wHandleBuffer = wDataSize - sizeof(NTY_ControlEvent);
  866. //处理数据
  867. ASSERT(m_pIDataBaseEngineSink != NULL);
  868. m_pIDataBaseEngineSink->OnDataBaseEngineControl(pDataBaseEvent->wControlID, pDataBaseEvent + 1, wHandleBuffer);
  869. return;
  870. }
  871. default:
  872. {
  873. ASSERT(false);
  874. }
  875. }
  876. return;
  877. }
  878. //控制事件
  879. //////////////////////////////////////////////////////////////////////////
  880. //控制事件
  881. bool CDataBaseEngine::PostDataBaseControl(WORD wControlID, VOID * pData, WORD wDataSize)
  882. {
  883. return m_QueueServiceEvent.PostControlEvent(wControlID, pData, wDataSize);
  884. }
  885. //请求事件
  886. bool CDataBaseEngine::PostDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  887. {
  888. return m_QueueServiceEvent.PostDataBaseEvent(wRequestID, dwContextID, pData, wDataSize);
  889. }
  890. //延期请求
  891. bool CDataBaseEngine::DeferDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  892. {
  893. return m_QueueServiceEvent.PostDataBaseEvent(wRequestID, dwContextID, pData, wDataSize);
  894. }
  895. //////////////////////////////////////////////////////////////////////////
  896. //建立对象函数
  897. extern "C" __declspec(dllexport) void * __cdecl CreateDataBaseEngine(const GUID & Guid, DWORD dwInterfaceVer)
  898. {
  899. //建立对象
  900. CDataBaseEngine * pDataBaseEngine = NULL;
  901. try
  902. {
  903. pDataBaseEngine = new CDataBaseEngine();
  904. if (pDataBaseEngine == NULL) throw TEXT("创建失败");
  905. void * pObject = pDataBaseEngine->QueryInterface(Guid, dwInterfaceVer);
  906. if (pObject == NULL) throw TEXT("接口查询失败");
  907. return pObject;
  908. }
  909. catch (...) {}
  910. //清理对象
  911. SafeDelete(pDataBaseEngine);
  912. return NULL;
  913. }
  914. //////////////////////////////////////////////////////////////////////////
  915. //建立对象函数
  916. extern "C" __declspec(dllexport) void * __cdecl CreateDataBase(const GUID & Guid, DWORD dwInterfaceVer)
  917. {
  918. //建立对象
  919. CDataBase * pDataBase = NULL;
  920. try
  921. {
  922. pDataBase = new CDataBase();
  923. if (pDataBase == NULL) throw TEXT("创建失败");
  924. void * pObject = pDataBase->QueryInterface(Guid, dwInterfaceVer);
  925. if (pObject == NULL) throw TEXT("接口查询失败");
  926. return pObject;
  927. }
  928. catch (...) {}
  929. //清理对象
  930. SafeDelete(pDataBase);
  931. return NULL;
  932. }
  933. //////////////////////////////////////////////////////////////////////////