多数据源中间件标准版1.0

OtlConnHost.cpp 28KB

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