中间件底层,websocket

OtlConnHost.cpp 28KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049
  1. #include "StdAfx.h"
  2. #include "OtlConnHost.h"
  3. #include "OtlDB.h"
  4. #include <iostream>
  5. IMPLEMENT_DYNAMIC( COtlConnHost, CWnd )
  6. COtlConnHost::COtlConnHost( void )
  7. {
  8. CreateEx( 0, AfxRegisterWndClass( CS_GLOBALCLASS ), "", 0, 0, 0, 0, 0, 0, 0 );
  9. ZeroMemory( m_szConnStr, OTL_MAX_BUFF_SIZE );
  10. ZeroMemory( m_szLastError, OTL_MAX_BUFF_SIZE );
  11. SetConnStatus( OTL_CONN_DISCONNECTED );
  12. // 初始化SQL缓冲区
  13. m_pListSQL = new CList<CString, CString>;
  14. // m_DbType = DB_SQLServer;//初始化数据类型为SQLServer
  15. // 初始化为多线程环境
  16. otl_connect::otl_initialize( 1 );
  17. }
  18. COtlConnHost::~COtlConnHost( void )throw()
  19. {
  20. DestroyWindow();
  21. }
  22. BEGIN_MESSAGE_MAP( COtlConnHost, CWnd )
  23. ON_MESSAGE( WM_OTL_CONN_ESTABLISHED, OnConnEstablished )
  24. END_MESSAGE_MAP()
  25. /*****************************************************************
  26. **【函数名称】 ProcConnDetected
  27. **【函数功能】 数据库连接检测线程函数
  28. **【参数】 pParam COtlConnHost类指针
  29. **【返回值】
  30. *****************************************************************/
  31. UINT ProcConnDetected( LPVOID pParam )
  32. {
  33. COtlConnHost* pHost = ( COtlConnHost* )pParam;
  34. pHost->Disconnect();
  35. pHost->SetConnStatus( OTL_CONN_CONNECTING );
  36. // 连接信息
  37. CString strConnString = pHost->GetConnString();
  38. // 开始自动重连
  39. while( TRUE )
  40. {
  41. CHAR szErrMsg[OTL_MAX_BUFF_SIZE] = { 0 };
  42. if( pHost->TestConnect( strConnString, szErrMsg ) ) // 连接可用
  43. {
  44. break;
  45. } // end if
  46. } // end while
  47. // 发送连接可用事件
  48. pHost->PostMessage( WM_OTL_CONN_ESTABLISHED, 0, 0 );
  49. return 0;
  50. }
  51. /*****************************************************************
  52. **【函数名称】 Connect
  53. **【函数功能】 连接数据库(连接注册表中默配置数据库)
  54. **【参数】
  55. **【返回值】
  56. *****************************************************************/
  57. BOOL COtlConnHost::Connect()
  58. {
  59. BOOL bIsConnect = TRUE;
  60. // 获取可用的连接字符串
  61. if( GetRegDbInfo( m_szConnStr ) )
  62. {
  63. try
  64. {
  65. m_OtlConn.rlogon( m_szConnStr, 1 ); // 默认为自动commit
  66. SetConnStatus( OTL_CONN_CONNECTED );
  67. DB_TYPE DbType = GetDSNInfo( m_DSN );
  68. if( DB_Error == DbType )
  69. {
  70. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "数据源:%s查找失败,请确认数据源是否正常!", m_DSN.GetBuffer(0) );
  71. m_DSN.ReleaseBuffer();
  72. return FALSE;
  73. }
  74. m_DbType = DbType;
  75. return TRUE;
  76. }
  77. catch( otl_exception& e )
  78. {
  79. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  80. bIsConnect = FALSE;
  81. }
  82. }
  83. else
  84. {
  85. bIsConnect = FALSE;
  86. }
  87. if( !bIsConnect )
  88. {
  89. MessageBox( _T( "连接数据库失败,请检测并确认数据源是否正常!" ), _T( "连接数据库失败" ), MB_ICONWARNING );
  90. }
  91. return FALSE;
  92. }
  93. /*****************************************************************
  94. **【函数名称】 Connect
  95. **【函数功能】 连接数据库(连接连接字符串指定的数据库)
  96. **【参数】
  97. **【返回值】
  98. *****************************************************************/
  99. BOOL COtlConnHost::Connect( LPCTSTR lpszConnString )
  100. {
  101. try
  102. {
  103. m_OtlConn.rlogon( lpszConnString, 1 );
  104. SetConnStatus( OTL_CONN_CONNECTED );
  105. strcpy_s( m_szConnStr, OTL_MAX_BUFF_SIZE, lpszConnString );
  106. }
  107. catch( otl_exception& e )
  108. {
  109. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  110. return FALSE;
  111. }
  112. return TRUE;
  113. }
  114. /*****************************************************************
  115. **【函数名称】 Disconnect
  116. **【函数功能】 断开数据库连接
  117. **【参数】
  118. **【返回值】
  119. *****************************************************************/
  120. void COtlConnHost::Disconnect()
  121. {
  122. CSingleLock lock( &m_LockSection, TRUE );
  123. // 数据库连接断开成功,设置连接状态
  124. m_nConnStatus = OTL_CONN_DISCONNECTED;
  125. m_OtlConn.logoff(); // 断开数据库连接
  126. }
  127. /*****************************************************************
  128. **【函数名称】 InsertConstant
  129. **【函数功能】 恒量插入(单数据)
  130. **【参数】 lpszSQL Insert语句
  131. **【返回值】
  132. *****************************************************************/
  133. BOOL COtlConnHost::InsertConstant( LPCTSTR lpszSQL )
  134. {
  135. DB_TYPE type = GetDBType();
  136. CString strSQL = lpszSQL;
  137. if( DB_MySQL == type )
  138. strSQL = GetStringForMySQL( lpszSQL );
  139. try
  140. {
  141. CSingleLock lock( &m_LockSection, TRUE );
  142. otl_stream o( 1, strSQL, m_OtlConn );
  143. }
  144. catch( otl_exception& e )
  145. {
  146. if( m_pListSQL->GetCount() < 3000 )
  147. m_pListSQL->AddTail( lpszSQL ); // 缓存3000条
  148. this->ProcException( e );
  149. return FALSE;
  150. } // end try
  151. return TRUE;
  152. }
  153. /*****************************************************************
  154. **【函数名称】 InsertConstantForMySQL
  155. **【函数功能】 恒量插入(单数据)
  156. 注:该函数在使用MYSQL数据库时,执行插入操作使用。
  157. 因为其传入字符串中的转义字符‘\’必须写成‘\\’,所以与InsertConstant区分开来使用
  158. **【参数】 lpszSQL SQL执行语句
  159. **【返回值】
  160. *****************************************************************/
  161. BOOL COtlConnHost::InsertConstantForMySQL( LPCTSTR lpszSQL )
  162. {
  163. CString strQuery = lpszSQL;
  164. int len = strQuery.GetLength();
  165. CString str = "";
  166. char ch;
  167. for( int i = 0; i < len; i++ )
  168. {
  169. ch = ( char )strQuery.GetAt( i );
  170. if( ch == '\\' )
  171. str += "\\\\";
  172. else
  173. str += strQuery.GetAt( i );
  174. }
  175. //otl_cursor::direct_exec(m_OtlConn, "SET NAMES 'GB2312'", otl_exception::enabled);
  176. return InsertConstant( str );
  177. }
  178. /*****************************************************************
  179. **【函数名称】 ExecCommand
  180. **【函数功能】 直接命令执行
  181. 注:在执行删除表命令时,请使用函数ExecComForDropTable
  182. 否则会出现命令执行失败问题。
  183. **【参数】 lpszSQL SQL执行语句
  184. **【返回值】
  185. *****************************************************************/
  186. BOOL COtlConnHost::ExecCommand( LPCTSTR lpszSQL )
  187. {
  188. DB_TYPE type = GetDBType();
  189. CString strSQL = lpszSQL;
  190. CSingleLock lock(&m_LockSection);
  191. if (DB_MySQL == type) {
  192. strSQL = GetStringForMySQL(lpszSQL);
  193. }
  194. try
  195. {
  196. // 判断连接是否正常,不正常重新连接
  197. if (!m_OtlConn.connected) {
  198. m_OtlConn.rlogon(m_szConnStr, 1);
  199. }
  200. //CSingleLock lock( &m_LockSection, TRUE );
  201. lock.Lock();
  202. long nResult = otl_cursor::direct_exec(m_OtlConn, strSQL, otl_exception::enabled);
  203. lock.Unlock();
  204. return true;
  205. }
  206. catch( otl_exception& e )
  207. {
  208. this->ProcException( e );
  209. lock.Unlock();
  210. return FALSE;
  211. }
  212. }
  213. /*****************************************************************
  214. **【函数名称】 ExecComForDropTable
  215. **【函数功能】 删除表命令执行
  216. 注释:函数direct_exec的第三个参数为enabled时,可获取异常信息,
  217. 但在删除表时该参数需设置为disabled,否则会出现命令执行失败。 [4/2/2013 zst]
  218. **【参数】 lpszSQL SQL执行语句
  219. **【返回值】
  220. *****************************************************************/
  221. void COtlConnHost::ExecComForDropTable( LPCTSTR lpszSQL )
  222. {
  223. CSingleLock lock( &m_LockSection, TRUE );
  224. otl_cursor::direct_exec( m_OtlConn, lpszSQL, otl_exception::disabled );
  225. }
  226. /*****************************************************************
  227. **【函数名称】 GetSingleDataString
  228. **【函数功能】 获取字符串单值
  229. **【参数】 IN lpszSQL SQL查询语句
  230. OUT lpValue 返回值
  231. **【返回值】
  232. *****************************************************************/
  233. BOOL COtlConnHost::GetSingleDataString( LPCTSTR lpszSQL, CHAR* lpValue )
  234. {
  235. // char szTmp[OTL_MAX_BUFF_SIZE] = { 0 };
  236. // memset(lpValue, 0, nLen);
  237. try
  238. {
  239. CSingleLock lock( &m_LockSection, TRUE );
  240. otl_stream o( 1, lpszSQL, m_OtlConn );
  241. if( !o.eof() )
  242. {
  243. o >> lpValue; // Unicode// [1/23/2013 zst]
  244. // WideCharToMultiByte(0, 0, szTmp, wcslen(szTmp), lpValue, nLen, 0, 0);
  245. return TRUE;
  246. }
  247. }
  248. catch( otl_exception& e )
  249. {
  250. this->ProcException( e );
  251. }
  252. return FALSE;
  253. }
  254. /*****************************************************************
  255. **【函数名称】 GetSingleDataText
  256. **【函数功能】 获取Text串单值
  257. **【参数】 IN lpszSQL SQL查询语句
  258. OUT lpValue 返回值
  259. **【返回值】
  260. *****************************************************************/
  261. BOOL COtlConnHost::GetSingleDataText( LPCTSTR lpszSQL, CHAR* lpValue )
  262. {
  263. otl_long_string strOut;
  264. // SQLWCHAR szTmp[OTL_MAX_TEXT_SIZE] = { 0 };
  265. try
  266. {
  267. CSingleLock lock( &m_LockSection, TRUE );
  268. otl_stream o( 1, lpszSQL, m_OtlConn );
  269. if( !o.eof() )
  270. {
  271. o >> strOut;
  272. for( int i = 0; i < strOut.len() && i < OTL_MAX_TEXT_SIZE; i++ )
  273. {
  274. lpValue[i] = strOut[i];
  275. // WideCharToMultiByte(0, 0, szTmp, wcslen(szTmp), lpValue, nLen, 0, 0);
  276. }
  277. }
  278. return TRUE;
  279. }
  280. catch( otl_exception& e )
  281. {
  282. this->ProcException( e );
  283. }
  284. return FALSE;
  285. }
  286. /*****************************************************************
  287. **【函数名称】 GetSingleDataInt
  288. **【函数功能】 获取整型单值
  289. **【参数】 IN lpszSQL SQL查询语句
  290. OUT nValue 返回值
  291. **【返回值】
  292. *****************************************************************/
  293. BOOL COtlConnHost::GetSingleDataInt( LPCTSTR lpszSQL, LONG& nValue )
  294. {
  295. try
  296. {
  297. CSingleLock lock( &m_LockSection, TRUE );
  298. otl_stream o( 1, lpszSQL, m_OtlConn );
  299. if( !o.eof() )
  300. {
  301. o >> nValue;
  302. return TRUE;
  303. }
  304. }
  305. catch( otl_exception& e )
  306. {
  307. this->ProcException( e );
  308. }
  309. return FALSE;
  310. }
  311. /*****************************************************************
  312. **【函数名称】 InitOtlStream
  313. **【函数功能】 初始化记录集数据流
  314. **【参数】 lpszSQL SQL查询语句
  315. **【返回值】
  316. *****************************************************************/
  317. BOOL COtlConnHost::InitOtlStream( LPCTSTR lpszSQL, otl_stream** pOtlStream, OtlIterator *pIterator )
  318. {
  319. try
  320. {
  321. CSingleLock lock( &m_LockSection, TRUE );
  322. otl_stream* pStream = new otl_stream( 200, lpszSQL, m_OtlConn );
  323. pIterator->attach( *pStream );
  324. *pOtlStream = pStream;
  325. return TRUE;
  326. }
  327. catch( otl_exception& e )
  328. {
  329. this->ProcException( e );
  330. }
  331. return FALSE;
  332. }
  333. /*****************************************************************
  334. **【函数名称】 InitOtlStream
  335. **【函数功能】 是否已遍历到记录保结尾
  336. **【参数】 lpszSQL SQL查询语句
  337. **【返回值】
  338. *****************************************************************/
  339. BOOL COtlConnHost::IsEOF( otl_stream* pOtlStream )
  340. {
  341. CSingleLock lock( &m_LockSection, TRUE );
  342. return pOtlStream->eof() ? TRUE : FALSE;
  343. }
  344. /*****************************************************************
  345. **【函数名称】 GetNextDataInt
  346. **【函数功能】 获取当前记录的下一个数据(INT)
  347. **【参数】 nValue 要获取的数据内容
  348. **【返回值】
  349. *****************************************************************/
  350. BOOL COtlConnHost::GetNextDataInt( otl_stream* pOtlStream, LONG& nValue )
  351. {
  352. try
  353. {
  354. CSingleLock lock( &m_LockSection, TRUE );
  355. *pOtlStream >> nValue;
  356. }
  357. catch( otl_exception& e )
  358. {
  359. this->ProcException( e );
  360. return FALSE;
  361. }
  362. return TRUE;
  363. }
  364. /*****************************************************************
  365. **【函数名称】 GetNextDataString
  366. **【函数功能】 获取当前记录的下一个数据(String)
  367. **【参数】 lpValue 要获取的数据内容
  368. nLen 字符串缓冲区长度
  369. **【返回值】
  370. *****************************************************************/
  371. BOOL COtlConnHost::GetNextDataString( otl_stream* pOtlStream, CHAR* lpValue, UINT nLen )
  372. {
  373. SQLWCHAR szTmp[OTL_MAX_BUFF_SIZE] = { 0 };
  374. memset( lpValue, 0, nLen );
  375. try
  376. {
  377. CSingleLock lock( &m_LockSection, TRUE );
  378. WideCharToMultiByte( 0, 0, szTmp, wcslen( szTmp ), lpValue, nLen, 0, 0 );
  379. }
  380. catch( otl_exception& e )
  381. {
  382. this->ProcException( e );
  383. return FALSE;
  384. }
  385. return TRUE;
  386. }
  387. /*****************************************************************
  388. **【函数名称】 __DetectConn
  389. **【函数功能】 启动连接检测
  390. **【参数】
  391. **【返回值】
  392. *****************************************************************/
  393. void COtlConnHost::__DetectConn()
  394. {
  395. switch( m_nConnStatus )
  396. {
  397. case OTL_CONN_CONNECTED: // 已连接
  398. {
  399. AfxBeginThread( ProcConnDetected, ( LPVOID )this );
  400. }
  401. break;
  402. case OTL_CONN_DISCONNECTED: // 未连接
  403. case OTL_CONN_CONNECTING: // 正在连接
  404. {
  405. // 不处理
  406. }
  407. break;
  408. } // end switch
  409. }
  410. /*****************************************************************
  411. **【函数名称】 GetRegDbInfo
  412. **【函数功能】 从注册表读取数据库信息
  413. **【参数】
  414. **【返回值】
  415. *****************************************************************/
  416. BOOL COtlConnHost::GetRegDbInfo( LPSTR lpConnStr )
  417. {
  418. CRegKey key;
  419. CString strDsn, strUer, strPass;
  420. // 打开键值失败
  421. if( key.Open( HKEY_CURRENT_USER, "Software\\FirstStep\\Database", KEY_READ ) != ERROR_SUCCESS )
  422. {
  423. key.Create( HKEY_CURRENT_USER, "Software\\FirstStep\\Database" );
  424. return FALSE;
  425. } // end if
  426. // DSN名称
  427. ULONG nSize = OTL_REG_KEY_SIZE;
  428. CHAR szTmp[OTL_REG_KEY_SIZE] = { 0 };
  429. key.QueryStringValue( "DSN", szTmp, &nSize );
  430. strDsn = szTmp;
  431. m_DSN = strDsn;//保存数据源名称,作为判断数据源类型使用
  432. // 用户名
  433. nSize = OTL_REG_KEY_SIZE;
  434. memset( szTmp, 0, OTL_REG_KEY_SIZE );
  435. key.QueryStringValue( "USER", szTmp, &nSize );
  436. strUer = szTmp;
  437. // 口令
  438. nSize = OTL_REG_KEY_SIZE;
  439. memset( szTmp, 0, OTL_REG_KEY_SIZE );
  440. key.QueryStringValue( "PASS", szTmp, &nSize );
  441. strPass = szTmp;
  442. // 生成连接字符串
  443. sprintf_s( lpConnStr, OTL_MAX_BUFF_SIZE, "DSN=%s; UID=%s; PWD=%s;", strDsn.GetBuffer(0), strUer.GetBuffer(0), strPass.GetBuffer(0));
  444. strDsn.ReleaseBuffer();
  445. strUer.ReleaseBuffer();
  446. strPass.ReleaseBuffer();
  447. return TRUE;
  448. }
  449. /*****************************************************************
  450. **【函数名称】 GetDSNInfo
  451. **【函数功能】 从注册表获取数据源所属数据库
  452. **【参数】 LPstrDSN 数据源名称
  453. **【返回值】 数据库类型
  454. *****************************************************************/
  455. DB_TYPE COtlConnHost::GetDSNInfo( LPCTSTR LPstrDSN )
  456. {
  457. CRegKey key;
  458. CString strPath;
  459. strPath.Format( _T( "Software\\ODBC\\ODBC.INI\\%s" ), LPstrDSN );
  460. if( key.Open( HKEY_LOCAL_MACHINE, strPath, KEY_READ ) == ERROR_SUCCESS )
  461. {
  462. // DSN名称
  463. ULONG nSize = OTL_REG_KEY_SIZE;
  464. CHAR szTmp[OTL_REG_KEY_SIZE] = { 0 };
  465. key.QueryStringValue( "Driver", szTmp, &nSize );
  466. CString strDriver = szTmp;
  467. std::cout << szTmp << std::endl;
  468. if( ( -1 != strDriver.MakeUpper().Find( _T( "SQLSRV" ) ) ) || ( -1 != strDriver.MakeUpper().Find( _T( "SQLNCLI" ) ) ) )
  469. {
  470. return DB_SQLServer;
  471. }
  472. else if( -1 != strDriver.MakeLower().Find( _T( "myodbc" ) ) )
  473. {
  474. return DB_MySQL;
  475. }
  476. else if ((-1 != strDriver.MakeLower().Find(_T("sqora32")))|| (-1 != strDriver.MakeLower().Find(_T("sqoras32"))))
  477. {
  478. return DB_Oracle;
  479. }
  480. else
  481. {
  482. return DB_Error;
  483. }
  484. }
  485. return DB_Error;
  486. }
  487. /*****************************************************************
  488. **【函数名称】 TestConnect
  489. **【函数功能】 测试连接
  490. **【参数】 lpszConnString 要测试的连接字符串
  491. lpErrInfo 如果测试失败,返回错误信息
  492. **【返回值】
  493. *****************************************************************/
  494. BOOL COtlConnHost::TestConnect( LPCTSTR lpszConnString, LPSTR lpErrInfo )
  495. {
  496. try
  497. {
  498. otl_connect conn;
  499. conn.rlogon( lpszConnString, 0 ); // 连接测试
  500. conn.logoff();
  501. }
  502. catch( otl_exception& e )
  503. {
  504. sprintf_s( lpErrInfo, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  505. return FALSE;
  506. }
  507. return TRUE;
  508. }
  509. /*****************************************************************
  510. **【函数名称】 OnConnEstablished
  511. **【函数功能】 连接可用事件响应
  512. **【参数】
  513. **【返回值】
  514. *****************************************************************/
  515. LRESULT COtlConnHost::OnConnEstablished( WPARAM wParam, LPARAM lParam )
  516. {
  517. try
  518. {
  519. CSingleLock lock( &m_LockSection, TRUE );
  520. m_OtlConn.rlogon( m_szConnStr, 1 ); // 重新连接
  521. // 将缓冲区插入数据入库
  522. while( !m_pListSQL->IsEmpty() )
  523. {
  524. try
  525. {
  526. otl_stream o( 1, m_pListSQL->GetHead(), m_OtlConn );
  527. }
  528. catch( ... )
  529. {
  530. }
  531. m_pListSQL->RemoveHead();
  532. }
  533. }
  534. catch( otl_exception& e )
  535. {
  536. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  537. return S_FALSE;
  538. }
  539. SetConnStatus( OTL_CONN_CONNECTED );
  540. return S_OK;
  541. }
  542. /*****************************************************************
  543. **【函数名称】 ProcException
  544. **【函数功能】 数据库操作异常处理
  545. **【参数】
  546. **【返回值】
  547. *****************************************************************/
  548. void COtlConnHost::ProcException( otl_exception& e )
  549. {
  550. // 获取错误信息
  551. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  552. // 断开数据库连接,并重连
  553. __DetectConn();
  554. }
  555. /*****************************************************************
  556. **【函数名称】 MoveNextRow
  557. **【函数功能】 把指定迭代器移动到下一行
  558. **【参数】 迭代器指针
  559. **【返回值】 成功返回TURE 失败返回FALSE
  560. *****************************************************************/
  561. BOOL COtlConnHost::MoveNextRow( OtlIterator * pIterator )
  562. {
  563. BOOL bResult = FALSE;
  564. try
  565. {
  566. bResult = pIterator->next_row();
  567. }
  568. catch( otl_exception& e )
  569. {
  570. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  571. return FALSE;
  572. }
  573. return bResult;
  574. }
  575. /*****************************************************************
  576. **【函数名称】 GetValueInt
  577. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  578. **【参数】 OtlIterator * pIterator 迭代器指针
  579. char *pColName 字段名
  580. int &nValue 返回整形字段值
  581. **【返回值】 成功返回TURE 失败返回FALSE
  582. *****************************************************************/
  583. BOOL COtlConnHost::GetValueInt( OtlIterator * pIterator, char *pColName, int &nValue )
  584. {
  585. try
  586. {
  587. pIterator->get( pColName, nValue );
  588. }
  589. catch( otl_exception& e )
  590. {
  591. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  592. return FALSE;
  593. }
  594. return TRUE;
  595. }
  596. /*****************************************************************
  597. **【函数名称】 GetValueString
  598. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  599. **【参数】 OtlIterator * pIterator 迭代器指针
  600. char *pColName 字段名
  601. pValue 返回字符型数据
  602. **【返回值】 成功返回TURE 失败返回FALSE
  603. *****************************************************************/
  604. BOOL COtlConnHost::GetValueString( OtlIterator * pIterator, char *pColName, char *pValue )
  605. {
  606. try
  607. {
  608. pIterator->get( pColName, pValue );
  609. }
  610. catch( otl_exception& e )
  611. {
  612. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  613. return FALSE;
  614. }
  615. return TRUE;
  616. }
  617. /*****************************************************************
  618. **【函数名称】 GetValueText
  619. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  620. **【参数】 OtlIterator * pIterator 迭代器指针
  621. char *pColName 字段名
  622. pValue 返回字符型数据
  623. **【返回值】 成功返回TURE 失败返回FALSE
  624. *****************************************************************/
  625. BOOL COtlConnHost::GetValueText( OtlIterator * pIterator, char *pColName, char *pValue ) //获取指定字段值 较大文本值
  626. {
  627. try
  628. {
  629. pIterator->get( pColName, pValue );
  630. }
  631. catch( otl_exception& e )
  632. {
  633. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  634. return FALSE;
  635. }
  636. return TRUE;
  637. }
  638. /*****************************************************************
  639. **【函数名称】 GetValueFloat
  640. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  641. **【参数】 OtlIterator * pIterator 迭代器指针
  642. char *pColName 字段名
  643. Value 返回浮点型数据
  644. **【返回值】 成功返回TURE 失败返回FALSE
  645. *****************************************************************/
  646. BOOL COtlConnHost::GetValueFloat( OtlIterator * pIterator, char *pColName, float& Value )
  647. {
  648. try
  649. {
  650. pIterator->get( pColName, Value );
  651. }
  652. catch( otl_exception& e )
  653. {
  654. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  655. return FALSE;
  656. }
  657. return TRUE;
  658. }
  659. /*****************************************************************
  660. **【函数名称】 GetValueIntByIndex
  661. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  662. **【参数】 OtlIterator * pIterator 迭代器指针
  663. const int pos 列索引
  664. int &nValue 返回整形字段值
  665. **【返回值】 成功返回TURE 失败返回FALSE
  666. *****************************************************************/
  667. BOOL COtlConnHost::GetValueIntByIndex( OtlIterator * pIterator, const int pos, int &nValue )
  668. {
  669. try
  670. {
  671. pIterator->get( pos, nValue );
  672. }
  673. catch( otl_exception& e )
  674. {
  675. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  676. return FALSE;
  677. }
  678. return TRUE;
  679. }
  680. /*****************************************************************
  681. **【函数名称】 GetValueStrByIndex
  682. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  683. **【参数】 OtlIterator * pIterator 迭代器指针
  684. const int pos 列索引
  685. pValue 返回字符型数据
  686. **【返回值】 成功返回TURE 失败返回FALSE
  687. *****************************************************************/
  688. BOOL COtlConnHost::GetValueStrByIndex( OtlIterator * pIterator, const int pos, char *pValue )
  689. {
  690. try
  691. {
  692. pIterator->get( pos, pValue );
  693. }
  694. catch( otl_exception& e )
  695. {
  696. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  697. return FALSE;
  698. }
  699. return TRUE;
  700. }
  701. /*****************************************************************
  702. **【函数名称】 GetValueTextByIndex
  703. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  704. **【参数】 OtlIterator * pIterator 迭代器指针
  705. const int pos 字段索引
  706. pValue 返回字符型数据
  707. **【返回值】 成功返回TURE 失败返回FALSE
  708. *****************************************************************/
  709. BOOL COtlConnHost::GetValueTextByIndex( OtlIterator * pIterator, const int pos, char *pValue )
  710. {
  711. try
  712. {
  713. pIterator->get( pos, pValue );
  714. }
  715. catch( otl_exception& e )
  716. {
  717. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  718. return FALSE;
  719. }
  720. return TRUE;
  721. }
  722. /*****************************************************************
  723. **【函数名称】 GetValueFloatByIndex
  724. **【函数功能】 指定迭代器的当前行 获取指定字段的数据
  725. **【参数】 OtlIterator * pIterator 迭代器指针
  726. const int pos 字段索引
  727. Value 返回浮点型数据
  728. **【返回值】 成功返回TURE 失败返回FALSE
  729. *****************************************************************/
  730. BOOL COtlConnHost::GetValueFloatByIndex( OtlIterator * pIterator, const int pos, float& Value )
  731. {
  732. try
  733. {
  734. pIterator->get( pos, Value );
  735. }
  736. catch( otl_exception& e )
  737. {
  738. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  739. return FALSE;
  740. }
  741. return TRUE;
  742. }
  743. /*****************************************************************
  744. **【函数名称】 GetStringForMySQL
  745. **【函数功能】 转换字符串为MYsql数据库可以正常使用字符串,主要针对符号‘/’
  746. **【参数】 LPCTSTR LPstr 被转字符串指针
  747. **【返回值】 返回被转后的字符串
  748. *****************************************************************/
  749. CString COtlConnHost::GetStringForMySQL( LPCTSTR LPstr )
  750. {
  751. CString strQuery = LPstr;
  752. int len = strQuery.GetLength();
  753. CString str = "";
  754. char ch;
  755. for( int i = 0; i < len; i++ )
  756. {
  757. ch = ( char )strQuery.GetAt( i );
  758. if( ch == '\\' )
  759. str += "\\\\";
  760. else
  761. str += strQuery.GetAt( i );
  762. }
  763. return str;
  764. }
  765. /*****************************************************************
  766. **【函数名称】 CallStoredProc
  767. **【函数功能】 调用存储过程
  768. **【参数】 a_DeclareWord:存储过程声明语句
  769. **【返回值】
  770. *****************************************************************/
  771. COtlStoredProc* COtlConnHost::CallStoredProc( const CString& a_DeclareWord )
  772. {
  773. COtlStoredProc* pProc = NULL;
  774. try
  775. {
  776. CSingleLock lock( &m_LockSection, TRUE );
  777. pProc = new COtlStoredProc( this, a_DeclareWord );
  778. }
  779. catch( otl_exception& e )
  780. {
  781. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  782. }
  783. return pProc;
  784. }
  785. /*****************************************************************
  786. **【函数名称】 Input
  787. **【函数功能】 调用存储过程输入参数
  788. **【参数】 a_Stream:OTL流
  789. a_StrParam:输入字符型参数
  790. **【返回值】
  791. *****************************************************************/
  792. BOOL COtlConnHost::Input( otl_stream& a_Stream, LPCTSTR a_StrParam )
  793. {
  794. try
  795. {
  796. CSingleLock lock( &m_LockSection, TRUE );
  797. a_Stream << a_StrParam;
  798. }
  799. catch( otl_exception& e )
  800. {
  801. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  802. return FALSE;
  803. }
  804. return TRUE;
  805. }
  806. /*****************************************************************
  807. **【函数名称】 CallStoredProc
  808. **【函数功能】 调用存储过程输入参数
  809. **【参数】 a_Stream:OTL流
  810. a_UintParam:输入UINT型参数
  811. **【返回值】
  812. *****************************************************************/
  813. BOOL COtlConnHost::Input( otl_stream& a_Stream, UINT a_UintParam )
  814. {
  815. try
  816. {
  817. CSingleLock lock( &m_LockSection, TRUE );
  818. a_Stream << a_UintParam;
  819. }
  820. catch( otl_exception& e )
  821. {
  822. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  823. return FALSE;
  824. }
  825. return TRUE;
  826. }
  827. /*****************************************************************
  828. **【函数名称】 CallStoredProc
  829. **【函数功能】 调用存储过程输入参数
  830. **【参数】 a_Stream:OTL流
  831. a_IntParam:输入INT型参数
  832. **【返回值】
  833. *****************************************************************/
  834. BOOL COtlConnHost::Input( otl_stream& a_Stream, int a_IntParam )
  835. {
  836. try
  837. {
  838. CSingleLock lock( &m_LockSection, TRUE );
  839. a_Stream << a_IntParam;
  840. }
  841. catch( otl_exception& e )
  842. {
  843. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  844. return FALSE;
  845. }
  846. return TRUE;
  847. }
  848. /*****************************************************************
  849. **【函数名称】 CallStoredProc
  850. **【函数功能】 调用存储过程返回值
  851. **【参数】 a_Stream:OTL流
  852. a_UintReturn:返回值
  853. **【返回值】
  854. *****************************************************************/
  855. BOOL COtlConnHost::Output( otl_stream& a_Stream, UINT& a_UintReturn )
  856. {
  857. try
  858. {
  859. CSingleLock lock( &m_LockSection, TRUE );
  860. a_Stream >> a_UintReturn;
  861. }
  862. catch( otl_exception& e )
  863. {
  864. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  865. return FALSE;
  866. }
  867. return TRUE;
  868. }
  869. /*****************************************************************
  870. **【函数名称】 CallStoredProc
  871. **【函数功能】 调用存储过程返回值
  872. **【参数】 a_Stream:OTL流
  873. a_IntParam:返回值
  874. **【返回值】
  875. *****************************************************************/
  876. BOOL COtlConnHost::Output( otl_stream& a_Stream, int& a_IntParam )
  877. {
  878. try
  879. {
  880. CSingleLock lock( &m_LockSection, TRUE );
  881. a_Stream >> a_IntParam;
  882. }
  883. catch( otl_exception& e )
  884. {
  885. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  886. return FALSE;
  887. }
  888. return TRUE;
  889. }
  890. /*****************************************************************
  891. **【函数名称】 CallStoredProc
  892. **【函数功能】 调用存储过程返回值
  893. **【参数】 a_Stream:OTL流
  894. a_StrParam:返回值
  895. **【返回值】
  896. *****************************************************************/
  897. BOOL COtlConnHost::Output( otl_stream& a_Stream, LPTSTR a_StrParam )
  898. {
  899. try
  900. {
  901. CSingleLock lock( &m_LockSection, TRUE );
  902. a_Stream >> a_StrParam;
  903. }
  904. catch( otl_exception& e )
  905. {
  906. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  907. return FALSE;
  908. }
  909. return TRUE;
  910. }
  911. /*****************************************************************
  912. **【函数名称】 CallStoredProc
  913. **【函数功能】 调用存储过程返回值
  914. **【参数】 a_Stream:OTL流
  915. a_floatParam:返回值
  916. **【返回值】
  917. *****************************************************************/
  918. BOOL COtlConnHost::Output( otl_stream& a_Stream, float a_floatParam )
  919. {
  920. try
  921. {
  922. CSingleLock lock( &m_LockSection, TRUE );
  923. a_Stream >> a_floatParam;
  924. }
  925. catch( otl_exception& e )
  926. {
  927. sprintf_s( m_szLastError, OTL_MAX_BUFF_SIZE, "Code = %d, Error = %s", e.code, e.msg );
  928. return FALSE;
  929. }
  930. return TRUE;
  931. }