收藏一个c++连接数据库的类
时间:2022-03-14 03:42
DataBaseEngine.cpp:
1 #include "StdAfx.h" 2 #include "Math.h" 3 #include "EventService.h" 4 #include "DataBaseEngine.h" 5 6 ////////////////////////////////////////////////////////////////////////// 7 8 //宏定义 9 _COM_SMARTPTR_TYPEDEF(IADORecordBinding,__uuidof(IADORecordBinding)); 10 11 //效验结果宏 12 #define EfficacyResult(hResult) { if (FAILED(hResult)) _com_issue_error(hResult); } 13 14 ////////////////////////////////////////////////////////////////////////// 15 16 //构造函数 17 CADOError::CADOError() 18 { 19 m_enErrorType=ErrorType_Nothing; 20 } 21 22 //析构函数 23 CADOError::~CADOError() 24 { 25 } 26 27 //接口查询 28 void * __cdecl CADOError::QueryInterface(const IID & Guid, DWORD dwQueryVer) 29 { 30 QUERYINTERFACE(IADOError,Guid,dwQueryVer); 31 QUERYINTERFACE_IUNKNOWNEX(IADOError,Guid,dwQueryVer); 32 return NULL; 33 } 34 35 //设置错误 36 void CADOError::SetErrorInfo(enADOErrorType enErrorType, LPCTSTR pszDescribe) 37 { 38 //设置错误 39 m_enErrorType=enErrorType; 40 m_strErrorDescribe=pszDescribe; 41 42 //抛出错误 43 throw GET_MYSELF_INTERFACE(IADOError); 44 45 return; 46 } 47 48 ////////////////////////////////////////////////////////////////////////// 49 50 //构造函数 51 CDataBase::CDataBase() : m_dwResumeConnectCount(30L),m_dwResumeConnectTime(30L) 52 { 53 //状态变量 54 m_dwConnectCount=0; 55 m_dwConnectErrorTime=0L; 56 57 //创建对象 58 m_DBCommand.CreateInstance(__uuidof(Command)); 59 m_DBRecordset.CreateInstance(__uuidof(Recordset)); 60 m_DBConnection.CreateInstance(__uuidof(Connection)); 61 62 //效验数据 63 ASSERT(m_DBCommand!=NULL); 64 ASSERT(m_DBRecordset!=NULL); 65 ASSERT(m_DBConnection!=NULL); 66 if (m_DBCommand==NULL) throw TEXT("数据库命令对象创建失败"); 67 if (m_DBRecordset==NULL) throw TEXT("数据库记录集对象创建失败"); 68 if (m_DBConnection==NULL) throw TEXT("数据库连接对象创建失败"); 69 70 //设置变量 71 m_DBCommand->CommandType=adCmdStoredProc; 72 73 return; 74 } 75 76 //析构函数 77 CDataBase::~CDataBase() 78 { 79 //关闭连接 80 CloseConnection(); 81 82 //释放对象 83 m_DBCommand.Release(); 84 m_DBRecordset.Release(); 85 m_DBConnection.Release(); 86 87 return; 88 } 89 90 //接口查询 91 void * __cdecl CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer) 92 { 93 QUERYINTERFACE(IDataBase,Guid,dwQueryVer); 94 QUERYINTERFACE_IUNKNOWNEX(IDataBase,Guid,dwQueryVer); 95 return NULL; 96 } 97 98 //打开连接 99 bool __cdecl CDataBase::OpenConnection() 100 { 101 //连接数据库 102 try 103 { 104 //关闭连接 105 CloseConnection(); 106 107 //连接数据库 108 EfficacyResult(m_DBConnection->Open(_bstr_t(m_strConnect),L"",L"",adConnectUnspecified)); 109 m_DBConnection->CursorLocation=adUseClient; 110 m_DBCommand->ActiveConnection=m_DBConnection; 111 112 //设置变量 113 m_dwConnectCount=0L; 114 m_dwConnectErrorTime=0L; 115 116 return true; 117 } 118 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 119 120 return false; 121 } 122 123 //关闭记录 124 bool __cdecl CDataBase::CloseRecordset() 125 { 126 try 127 { 128 if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close()); 129 return true; 130 } 131 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 132 133 return false; 134 } 135 136 //关闭连接 137 bool __cdecl CDataBase::CloseConnection() 138 { 139 try 140 { 141 CloseRecordset(); 142 if ((m_DBConnection!=NULL)&&(m_DBConnection->GetState()!=adStateClosed)) 143 { 144 EfficacyResult(m_DBConnection->Close()); 145 } 146 return true; 147 } 148 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 149 150 return false; 151 } 152 153 //重新连接 154 bool __cdecl CDataBase::TryConnectAgain(bool bFocusConnect, CComError * pComError) 155 { 156 try 157 { 158 //判断重连 159 bool bReConnect=bFocusConnect; 160 if (bReConnect==false) 161 { 162 DWORD dwNowTime=(DWORD)time(NULL); 163 if ((m_dwConnectErrorTime+m_dwResumeConnectTime)>dwNowTime) bReConnect=true; 164 } 165 if ((bReConnect==false)&&(m_dwConnectCount>m_dwResumeConnectCount)) bReConnect=true; 166 167 //设置变量 168 m_dwConnectCount++; 169 m_dwConnectErrorTime=(DWORD)time(NULL); 170 if (bReConnect==false) 171 { 172 if (pComError!=NULL) SetErrorInfo(ErrorType_Connect,GetComErrorDescribe(*pComError)); 173 return false; 174 } 175 176 //重新连接 177 OpenConnection(); 178 return true; 179 } 180 catch (IADOError * pIADOError) 181 { 182 //重新连接错误 183 if (pComError!=NULL) SetErrorInfo(ErrorType_Connect,GetComErrorDescribe(*pComError)); 184 else throw pIADOError; 185 } 186 187 return false; 188 } 189 190 //设置信息 191 bool __cdecl CDataBase::SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass) 192 { 193 //效验参数 194 ASSERT(szIP!=NULL); 195 ASSERT(szData!=NULL); 196 ASSERT(szName!=NULL); 197 ASSERT(szPass!=NULL); 198 199 //构造连接字符串 200 m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"), 201 szPass,szName,szData,szIP,wPort); 202 203 return true; 204 } 205 206 //是否连接错误 207 bool __cdecl CDataBase::IsConnectError() 208 { 209 try 210 { 211 //状态判断 212 if (m_DBConnection==NULL) return true; 213 if (m_DBConnection->GetState()==adStateClosed) return true; 214 215 //参数判断 216 long lErrorCount=m_DBConnection->Errors->Count; 217 if (lErrorCount>0L) 218 { 219 ErrorPtr pError=NULL; 220 for(long i=0;i<lErrorCount;i++) 221 { 222 pError=m_DBConnection->Errors->GetItem(i); 223 if (pError->Number==0x80004005) return true; 224 } 225 } 226 227 return false; 228 } 229 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 230 231 return false; 232 } 233 234 //是否打开 235 bool __cdecl CDataBase::IsRecordsetOpened() 236 { 237 if (m_DBRecordset==NULL) return false; 238 if (m_DBRecordset->GetState()==adStateClosed) return false; 239 return true; 240 } 241 242 //往下移动 243 void __cdecl CDataBase::MoveToNext() 244 { 245 try 246 { 247 m_DBRecordset->MoveNext(); 248 } 249 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 250 251 return; 252 } 253 254 //移到开头 255 void __cdecl CDataBase::MoveToFirst() 256 { 257 try 258 { 259 m_DBRecordset->MoveFirst(); 260 } 261 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 262 263 return; 264 } 265 266 //是否结束 267 bool __cdecl CDataBase::IsEndRecordset() 268 { 269 try 270 { 271 return (m_DBRecordset->EndOfFile==VARIANT_TRUE); 272 } 273 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 274 275 return true; 276 } 277 278 //获取数目 279 long __cdecl CDataBase::GetRecordCount() 280 { 281 try 282 { 283 if (m_DBRecordset==NULL) return 0; 284 return m_DBRecordset->GetRecordCount(); 285 } 286 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 287 288 return 0; 289 } 290 291 //获取大小 292 long __cdecl CDataBase::GetActualSize(LPCTSTR pszParamName) 293 { 294 ASSERT(pszParamName!=NULL); 295 try 296 { 297 return m_DBRecordset->Fields->Item[pszParamName]->ActualSize; 298 } 299 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 300 301 return -1; 302 } 303 304 //绑定对象 305 bool __cdecl CDataBase::BindToRecordset(CADORecordBinding * pBind) 306 { 307 ASSERT(pBind!=NULL); 308 try 309 { 310 IADORecordBindingPtr pIBind(m_DBRecordset); 311 pIBind->BindToRecordset(pBind); 312 return true; 313 } 314 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 315 316 return false; 317 } 318 319 //获取参数 320 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue) 321 { 322 try 323 { 324 bValue=0; 325 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 326 switch(vtFld.vt) 327 { 328 case VT_BOOL: 329 { 330 bValue=(vtFld.boolVal!=0)?1:0; 331 break; 332 } 333 case VT_I2: 334 case VT_UI1: 335 { 336 bValue=(vtFld.iVal>0)?1:0; 337 break; 338 } 339 case VT_NULL: 340 case VT_EMPTY: 341 { 342 bValue=0; 343 break; 344 } 345 default: bValue=(BYTE)vtFld.iVal; 346 } 347 return true; 348 } 349 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 350 351 return false; 352 } 353 354 //获取参数 355 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue) 356 { 357 try 358 { 359 ulValue=0L; 360 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 361 if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.lVal; 362 return true; 363 } 364 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 365 366 return false; 367 } 368 369 //获取参数 370 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue) 371 { 372 try 373 { 374 dbValue=0.0L; 375 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 376 switch(vtFld.vt) 377 { 378 case VT_R4: 379 { 380 dbValue=vtFld.fltVal; 381 break; 382 } 383 case VT_R8: 384 { 385 dbValue=vtFld.dblVal; 386 break; 387 } 388 case VT_DECIMAL: 389 { 390 dbValue=vtFld.decVal.Lo32; 391 dbValue*=(vtFld.decVal.sign==128)?-1:1; 392 dbValue/=pow((float)10,vtFld.decVal.scale); 393 break; 394 } 395 case VT_UI1: 396 { 397 dbValue=vtFld.iVal; 398 break; 399 } 400 case VT_I2: 401 case VT_I4: 402 { 403 dbValue=vtFld.lVal; 404 break; 405 } 406 case VT_NULL: 407 case VT_EMPTY: 408 { 409 dbValue=0.0L; 410 break; 411 } 412 default: dbValue=vtFld.dblVal; 413 } 414 return true; 415 } 416 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 417 418 return false; 419 } 420 421 //获取参数 422 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, LONG & lValue) 423 { 424 try 425 { 426 lValue=0L; 427 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 428 if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) lValue=vtFld.lVal; 429 return true; 430 } 431 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 432 433 return false; 434 } 435 436 //获取参数 437 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue) 438 { 439 try 440 { 441 ulValue=0L; 442 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 443 if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.ulVal; 444 return true; 445 } 446 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 447 448 return false; 449 } 450 451 //获取参数 452 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, INT & nValue) 453 { 454 try 455 { 456 nValue=0; 457 _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 458 switch(vtFld.vt) 459 { 460 case VT_BOOL: 461 { 462 nValue = vtFld.boolVal; 463 break; 464 } 465 case VT_I2: 466 case VT_UI1: 467 { 468 nValue = vtFld.iVal; 469 break; 470 } 471 case VT_NULL: 472 case VT_EMPTY: 473 { 474 nValue = 0; 475 break; 476 } 477 default: nValue = vtFld.iVal; 478 } 479 return true; 480 } 481 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 482 483 return false; 484 } 485 486 //获取参数 487 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue) 488 { 489 try 490 { 491 llValue=0L; 492 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 493 if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) llValue=vtFld.llVal; 494 return true; 495 } 496 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 497 498 return false; 499 } 500 501 //获取参数 502 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize) 503 { 504 try 505 { 506 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 507 if (vtFld.vt==VT_BSTR) 508 { 509 lstrcpy(szBuffer,(char*)_bstr_t(vtFld)); 510 return true; 511 } 512 return false; 513 } 514 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 515 516 return false; 517 } 518 519 //获取参数 520 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, WORD & wValue) 521 { 522 try 523 { 524 wValue=0L; 525 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 526 if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) wValue=(WORD)vtFld.ulVal; 527 return true; 528 } 529 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 530 531 return false; 532 } 533 534 //获取参数 535 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time) 536 { 537 try 538 { 539 _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 540 switch(vtFld.vt) 541 { 542 case VT_DATE: 543 { 544 COleDateTime TempTime(vtFld); 545 Time=TempTime; 546 break; 547 } 548 case VT_EMPTY: 549 case VT_NULL: 550 { 551 Time.SetStatus(COleDateTime::null); 552 break; 553 } 554 default: return false; 555 } 556 return true; 557 } 558 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 559 560 return false; 561 } 562 563 //获取参数 564 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, bool & bValue) 565 { 566 try 567 { 568 _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; 569 switch(vtFld.vt) 570 { 571 case VT_BOOL: 572 { 573 bValue=(vtFld.boolVal==0)?false:true; 574 break; 575 } 576 case VT_EMPTY: 577 case VT_NULL: 578 { 579 bValue = false; 580 break; 581 } 582 default:return false; 583 } 584 return true; 585 } 586 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 587 588 return false; 589 } 590 591 //获取返回数值 592 long __cdecl CDataBase::GetReturnValue() 593 { 594 try 595 { 596 _ParameterPtr Parameter; 597 long lParameterCount=m_DBCommand->Parameters->Count; 598 for (long i=0;i<lParameterCount;i++) 599 { 600 Parameter=m_DBCommand->Parameters->Item[i]; 601 if (Parameter->Direction==adParamReturnValue) return Parameter->Value.lVal; 602 } 603 ASSERT(FALSE); 604 } 605 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 606 607 return 0; 608 } 609 610 //删除参数 611 void __cdecl CDataBase::ClearAllParameters() 612 { 613 try 614 { 615 long lParameterCount=m_DBCommand->Parameters->Count; 616 if (lParameterCount>0L) 617 { 618 for (long i=lParameterCount;i>0;i--) 619 { 620 m_DBCommand->Parameters->Delete(i-1); 621 } 622 } 623 } 624 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 625 626 return; 627 } 628 629 //设置存储过程 630 void __cdecl CDataBase::SetSPName(LPCTSTR pszSpName) 631 { 632 ASSERT(pszSpName!=NULL); 633 try 634 { 635 m_DBCommand->CommandText=pszSpName; 636 } 637 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 638 639 return; 640 } 641 642 //获得参数 643 void __cdecl CDataBase::GetParameterValue(LPCTSTR pszParamName, _variant_t & vtValue) 644 { 645 //效验参数 646 ASSERT(pszParamName!=NULL); 647 648 //获取参数 649 try 650 { 651 vtValue.Clear(); 652 vtValue=m_DBCommand->Parameters->Item[pszParamName]->Value; 653 } 654 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 655 656 return; 657 } 658 659 //插入参数 660 void __cdecl CDataBase::AddParamter(LPCTSTR pszName, ADOCG::ParameterDirectionEnum Direction, ADOCG::DataTypeEnum Type, long lSize, _variant_t & vtValue) 661 { 662 ASSERT(pszName!=NULL); 663 try 664 { 665 _ParameterPtr Parameter=m_DBCommand->CreateParameter(pszName,Type,Direction,lSize,vtValue); 666 m_DBCommand->Parameters->Append(Parameter); 667 } 668 catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } 669 670 return; 671 } 672 673 //执行语句 674 bool __cdecl CDataBase::Execute(LPCTSTR pszCommand) 675 { 676 ASSERT(pszCommand!=NULL); 677 try 678 { 679 m_DBConnection->CursorLocation=adUseClient; 680 m_DBConnection->Execute(pszCommand,NULL,adExecuteNoRecords); 681 return true; 682 } 683 catch (CComError & ComError) 684 { 685 if (IsConnectError()==true) TryConnectAgain(false,&ComError); 686 else SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); 687 } 688 689 return false; 690 } 691 692 //执行命令 693 bool __cdecl CDataBase::ExecuteCommand(bool bRecordset) 694 { 695 try 696 { 697 //关闭记录集 698 CloseRecordset(); 699 700 //执行命令 701 if (bRecordset==true) 702 { 703 m_DBRecordset->PutRefSource(m_DBCommand); 704 m_DBRecordset->CursorLocation=adUseClient; 705 EfficacyResult(m_DBRecordset->Open((IDispatch *)m_DBCommand,vtMissing,adOpenForwardOnly,adLockReadOnly,adOptionUnspecified)); 706 } 707 else 708 { 709 m_DBConnection->CursorLocation=adUseClient; 710 EfficacyResult(m_DBCommand->Execute(NULL,NULL,adExecuteNoRecords)); 711 } 712 return true; 713 } 714 catch (CComError & ComError) 715 { 716 if (IsConnectError()==true) TryConnectAgain(false,&ComError); 717 else SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); 718 } 719 720 return false; 721 } 722 723 //获取错误 724 LPCTSTR CDataBase::GetComErrorDescribe(CComError & ComError) 725 { 726 _bstr_t bstrDescribe(ComError.Description()); 727 m_strErrorDescribe.Format(TEXT("ADO 错误:0x%8x,%s"),ComError.Error(),(LPCTSTR)bstrDescribe); 728 return m_strErrorDescribe; 729 } 730 731 //设置错误 732 void CDataBase::SetErrorInfo(enADOErrorType enErrorType, LPCTSTR pszDescribe) 733 { 734 m_ADOError.SetErrorInfo(enErrorType,pszDescribe); 735 return; 736 } 737 738 ////////////////////////////////////////////////////////////////////////// 739 740 //构造函数 741 CDataBaseEngine::CDataBaseEngine(void) 742 { 743 //设置变量 744 m_bService=false; 745 m_pIDataBaseSink=NULL; 746 747 return; 748 } 749 750 //析构函数 751 CDataBaseEngine::~CDataBaseEngine(void) 752 { 753 } 754 755 //接口查询 756 void * __cdecl CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer) 757 { 758 QUERYINTERFACE(IDataBaseEngine,Guid,dwQueryVer); 759 QUERYINTERFACE(IQueueServiceSink,Guid,dwQueryVer); 760 QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine,Guid,dwQueryVer); 761 return NULL; 762 } 763 764 //注册接口 765 bool __cdecl CDataBaseEngine::SetDataBaseSink(IUnknownEx * pIUnknownEx) 766 { 767 //效验参数 768 ASSERT(pIUnknownEx!=NULL); 769 ASSERT(m_pIDataBaseSink==NULL); 770 if (pIUnknownEx==NULL) return false; 771 if (m_pIDataBaseSink!=NULL) return false; 772 773 //查询接口 774 m_pIDataBaseSink=GET_OBJECTPTR_INTERFACE(pIUnknownEx,IDataBaseSink); 775 if (m_pIDataBaseSink==NULL) 776 { 777 CEventTrace::ShowEventNotify(TEXT("数据库引擎外挂服务接口获取失败,挂接操作失败"),Level_Exception); 778 return false; 779 } 780 781 return true; 782 } 783 784 //获取接口 785 void * __cdecl CDataBaseEngine::GetQueueService(const IID & Guid, DWORD dwQueryVer) 786 { 787 return m_RequestQueueService.QueryInterface(Guid,dwQueryVer); 788 } 789 790 //启动服务 791 bool __cdecl CDataBaseEngine::StartService() 792 { 793 //判断状态 794 if (m_bService==true) 795 { 796 CEventTrace::ShowEventNotify(TEXT("数据库引擎重复启动,启动操作忽略"),Level_Warning); 797 return true; 798 } 799 800 //外挂接口 801 if (m_pIDataBaseSink==NULL) 802 { 803 CEventTrace::ShowEventNotify(TEXT("数据库引擎外挂服务不存在"),Level_Exception); 804 return false; 805 } 806 807 //设置队列 808 if (m_RequestQueueService.SetQueueServiceSink(GET_MYSELF_INTERFACE(IUnknownEx))==false) 809 { 810 CEventTrace::ShowEventNotify(TEXT("数据库引擎与队列服务绑定失败"),Level_Exception); 811 return false; 812 } 813 814 //启动外挂 815 if (m_pIDataBaseSink->StartService(GET_MYSELF_INTERFACE(IUnknownEx))==false) 816 { 817 CEventTrace::ShowEventNotify(TEXT("数据库引擎外挂服务启动失败"),Level_Exception); 818 return false; 819 } 820 821 //启动队列 822 if (m_RequestQueueService.StartService()==false) 823 { 824 CEventTrace::ShowEventNotify(TEXT("数据库引擎队列服务启动失败"),Level_Exception); 825 return false; 826 } 827 828 //设置变量 829 m_bService=true; 830 831 return true; 832 } 833 834 //停止服务 835 bool __cdecl CDataBaseEngine::StopService() 836 { 837 //设置变量 838 m_bService=false; 839 840 //停止请求队列 841 m_RequestQueueService.StopService(); 842 843 //停止外挂 844 if (m_pIDataBaseSink!=NULL) 845 { 846 m_pIDataBaseSink->StopService(GET_MYSELF_INTERFACE(IUnknownEx)); 847 } 848 849 return true; 850 } 851 852 //队列接口 853 void __cdecl CDataBaseEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime) 854 { 855 //判断状态 856 if (m_bService==false) return; 857 858 //请求处理 859 switch (wIdentifier) 860 { 861 case EVENT_DATABASE: 862 { 863 //效验参数 864 ASSERT(pBuffer!=NULL); 865 ASSERT(wDataSize>=sizeof(NTY_DataBaseEvent)); 866 if (wDataSize<sizeof(NTY_DataBaseEvent)) return; 867 868 //变量定义 869 NTY_DataBaseEvent * pDataBaseEvent=(NTY_DataBaseEvent *)pBuffer; 870 WORD wHandleBuffer=wDataSize-sizeof(NTY_DataBaseEvent); 871 872 //处理数据 873 ASSERT(m_pIDataBaseSink!=NULL); 874 m_pIDataBaseSink->OnDataBaseRequest(*pDataBaseEvent,pDataBaseEvent+1,wHandleBuffer); 875 876 return; 877 } 878 } 879 880 return; 881 } 882 883 ////////////////////////////////////////////////////////////////////////// 884 885 //建立对象函数 886 extern "C" __declspec(dllexport) void * __cdecl CreateDataBase(const GUID & Guid, DWORD dwInterfaceVer) 887 { 888 //建立对象 889 CDataBase * pDataBase=NULL; 890 try 891 { 892 pDataBase=new CDataBase(); 893 if (pDataBase==NULL) throw TEXT("创建失败"); 894 void * pObject=pDataBase->QueryInterface(Guid,dwInterfaceVer); 895 if (pObject==NULL) throw TEXT("接口查询失败"); 896 return pObject; 897 } 898 catch (...) {} 899 900 //清理对象 901 SafeDelete(pDataBase); 902 return NULL; 903 } 904 905 //////////////////////////////////////////////////////////////////////////DataBaseEngine.cpp
头文件DataBaseEngine.h :
1 #ifndef DATA_BASE_ENGINE_HEAD_FILE 2 #define DATA_BASE_ENGINE_HEAD_FILE 3 4 #pragma once 5 6 //组件头文件 7 #include "ServerKernel.h" 8 #include "QueueService.h" 9 10 ////////////////////////////////////////////////////////////////////////// 11 12 //ADO 错误类 13 class CADOError : public IADOError 14 { 15 //变量定义 16 protected: 17 enADOErrorType m_enErrorType; //错误代号 18 CString m_strErrorDescribe; //错误信息 19 20 //函数定义 21 public: 22 //构造函数 23 CADOError(); 24 //析构函数 25 virtual ~CADOError(); 26 27 //基础接口 28 public: 29 //释放对象 30 virtual bool __cdecl Release() { return true; } 31 //是否有效 32 virtual bool __cdecl IsValid() { return AfxIsValidAddress(this,sizeof(CADOError))?true:false; } 33 //接口查询 34 virtual void * __cdecl QueryInterface(const IID & Guid, DWORD dwQueryVer); 35 36 //功能接口 37 public: 38 //错误类型 39 virtual enADOErrorType __cdecl GetErrorType() { return m_enErrorType; } 40 //错误描述 41 virtual LPCTSTR __cdecl GetErrorDescribe() { return m_strErrorDescribe; } 42 43 //功能函数 44 public: 45 //设置错误 46 void SetErrorInfo(enADOErrorType enErrorType, LPCTSTR pszDescribe); 47 }; 48 49 ////////////////////////////////////////////////////////////////////////// 50 51 //数据库对象 52 class CDataBase : public IDataBase 53 { 54 //信息变量 55 protected: 56 CADOError m_ADOError; //错误对象 57 CString m_strConnect; //连接字符串 58 CString m_strErrorDescribe; //错误信息 59 60 //状态变量 61 protected: 62 DWORD m_dwConnectCount; //重试次数 63 DWORD m_dwConnectErrorTime; //错误时间 64 const DWORD m_dwResumeConnectCount; //恢复次数 65 const DWORD m_dwResumeConnectTime; //恢复时间 66 67 //内核变量 68 protected: 69 _CommandPtr m_DBCommand; //命令对象 70 _RecordsetPtr m_DBRecordset; //记录集对象 71 _ConnectionPtr m_DBConnection; //数据库对象 72 73 //函数定义 74 public: 75 //构造函数 76 CDataBase(); 77 //析构函数 78 virtual ~CDataBase(); 79 80 //基础接口 81 public: 82 //释放对象 83 virtual bool __cdecl Release() { if (IsValid()) delete this; return true; } 84 //是否有效 85 virtual bool __cdecl IsValid() { return AfxIsValidAddress(this,sizeof(CDataBase))?true:false; } 86 //接口查询 87 virtual void * __cdecl QueryInterface(const IID & Guid, DWORD dwQueryVer); 88 89 //管理接口 90 public: 91 //打开连接 92 virtual bool __cdecl OpenConnection(); 93 //关闭记录 94 virtual bool __cdecl CloseRecordset(); 95 //关闭连接 96 virtual bool __cdecl CloseConnection(); 97 //重新连接 98 virtual bool __cdecl TryConnectAgain(bool bFocusConnect, CComError * pComError); 99 //设置信息 100 virtual bool __cdecl SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass); 101 102 //状态接口 103 public: 104 //是否连接错误 105 virtual bool __cdecl IsConnectError(); 106 //是否打开 107 virtual bool __cdecl IsRecordsetOpened(); 108 109 //记录集接口 110 public: 111 //往下移动 112 virtual void __cdecl MoveToNext(); 113 //移到开头 114 virtual void __cdecl MoveToFirst(); 115 //是否结束 116 virtual bool __cdecl IsEndRecordset(); 117 //获取数目 118 virtual long __cdecl GetRecordCount(); 119 //获取大小 120 virtual long __cdecl GetActualSize(LPCTSTR pszParamName); 121 //绑定对象 122 virtual bool __cdecl BindToRecordset(CADORecordBinding * pBind); 123 124 //字段接口 125 public: 126 //获取参数 127 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue); 128 //获取参数 129 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, WORD & wValue); 130 //获取参数 131 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, INT & nValue); 132 //获取参数 133 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, LONG & lValue); 134 //获取参数 135 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue); 136 //获取参数 137 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue); 138 //获取参数 139 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue); 140 //获取参数 141 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue); 142 //获取参数 143 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize); 144 //获取参数 145 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time); 146 //获取参数 147 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, bool & bValue); 148 149 //命令对象接口 150 public: 151 //设置存储过程 152 virtual void __cdecl SetSPName(LPCTSTR pszSpName); 153 //插入参数 154 virtual void __cdecl AddParamter(LPCTSTR pszName, ADOCG::ParameterDirectionEnum Direction, ADOCG::DataTypeEnum Type, long lSize, _variant_t & vtValue); 155 //删除参数 156 virtual void __cdecl ClearAllParameters(); 157 //获得参数 158 virtual void __cdecl GetParameterValue(LPCTSTR pszParamName, _variant_t & vtValue); 159 //获取返回数值 160 virtual long __cdecl GetReturnValue(); 161 162 //执行接口 163 public: 164 //执行语句 165 virtual bool __cdecl Execute(LPCTSTR pszCommand); 166 //执行命令 167 virtual bool __cdecl ExecuteCommand(bool bRecordset); 168 169 //内部函数 170 private: 171 //获取错误 172 LPCTSTR GetComErrorDescribe(CComError & ComError); 173 //设置错误 174 void SetErrorInfo(enADOErrorType enErrorType, LPCTSTR pszDescribe); 175 }; 176 177 ////////////////////////////////////////////////////////////////////////// 178 179 //数据库管理类 180 class CDataBaseEngine : public IDataBaseEngine, public IQueueServiceSink 181 { 182 //内核变量 183 protected: 184 bool m_bService; //运行标志 185 CQueueService m_RequestQueueService; //队列对象 186 IDataBaseSink * m_pIDataBaseSink; //通知钩子 187 188 //函数定义 189 public: 190 //构造函数 191 CDataBaseEngine(void); 192 //析构函数 193 virtual ~CDataBaseEngine(void); 194 195 //基础接口 196 public: 197 //释放对象 198 virtual bool __cdecl Release() { if (IsValid()) delete this; return true; } 199 //是否有效 200 virtual bool __cdecl IsValid() { return AfxIsValidAddress(this,sizeof(CDataBaseEngine))?true:false; } 201 //接口查询 202 virtual void * __cdecl QueryInterface(const IID & Guid, DWORD dwQueryVer); 203 204 //服务接口 205 public: 206 //启动服务 207 virtual bool __cdecl StartService(); 208 //停止服务 209 virtual bool __cdecl StopService(); 210 //注册钩子 211 virtual bool __cdecl SetDataBaseSink(IUnknownEx * pIUnknownEx); 212 //获取接口 213 virtual void * __cdecl GetQueueService(const IID & Guid, DWORD dwQueryVer); 214 215 //队列接口 216 public: 217 //队列接口 218 virtual void __cdecl OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime); 219 }; 220 221 ////////////////////////////////////////////////////////////////////////// 222 223 #endifDataBaseEngine.h
头文件Stdafx.h :
1 #pragma once 2 3 #ifndef VC_EXTRALEAN 4 #define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 5 #endif 6 7 // 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。 8 // 有关不同平台的相应值的最新信息,请参考 MSDN。 9 #ifndef WINVER // 允许使用特定于 Windows 95 和 Windows NT 4 或更高版本的功能。 10 #define WINVER 0x0500 // 将此更改为针对于 Windows 98 和 Windows 2000 或更高版本的合适的值。 11 #endif 12 13 #ifndef _WIN32_WINNT // 允许使用特定于 Windows NT 4 或更高版本的功能。 14 #define _WIN32_WINNT 0x0400 // 将此更改为针对于 Windows 2000 或更高版本的合适的值。 15 #endif 16 17 #ifndef _WIN32_WINDOWS // 允许使用特定于 Windows 98 或更高版本的功能。 18 #define _WIN32_WINDOWS 0x0410 // 将此更改为针对于 Windows Me 或更高版本的合适的值。 19 #endif 20 21 #ifndef _WIN32_IE // 允许使用特定于 IE 4.0 或更高版本的功能。 22 #define _WIN32_IE 0x0400 // 将此更改为针对于 IE 5.0 或更高版本的合适的值。 23 #endif 24 25 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的 26 27 #include <afxwin.h> // MFC 核心组件和标准组件 28 #include <afxext.h> // MFC 扩展 29 30 #ifndef _AFX_NO_OLE_SUPPORT 31 #include <afxole.h> // MFC OLE 类 32 #include <afxodlgs.h> // MFC OLE 对话框类 33 #include <afxdisp.h> // MFC 自动化类 34 #endif // _AFX_NO_OLE_SUPPORT 35 36 #ifndef _AFX_NO_DB_SUPPORT 37 #include <afxdb.h> // MFC ODBC 数据库类 38 #endif // _AFX_NO_DB_SUPPORT 39 40 #ifndef _AFX_NO_DAO_SUPPORT 41 #include <afxdao.h> // MFC DAO 数据库类 42 #endif // _AFX_NO_DAO_SUPPORT 43 44 #include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持 45 #ifndef _AFX_NO_AFXCMN_SUPPORT 46 #include <afxcmn.h> // MFC 对 Windows 公共控件的支持 47 #endif // _AFX_NO_AFXCMN_SUPPORTStdafx.h
头文件EventService.h :
1 #ifndef EVENT_SERVICE_HEAD_FILE 2 #define EVENT_SERVICE_HEAD_FILE 3 4 #pragma once 5 6 #include "ServerKernel.h" 7 8 ////////////////////////////////////////////////////////////////////////// 9 10 //事件服务类 11 class CEventService : public IEventService 12 { 13 //变量定义 14 protected: 15 HWND m_hRichEdit; //控件句柄 16 CThreadLock m_ThreadLock; //线程锁 17 bool m_bEventService[EVENT_LEVEL_COUNT]; //显示标志 18 19 //状态变量 20 protected: 21 int m_nMaxLineCount; //最大行数 22 int m_nReserveLineCount; //保留行数 23 24 //函数定义 25 public: 26 //构造函数 27 CEventService(void); 28 //析构函数 29 virtual ~CEventService(void); 30 31 //基础接口 32 public: 33 //释放对象 34 virtual bool __cdecl Release() { if (IsValid()) delete this; return true; } 35 //是否有效 36 virtual bool __cdecl IsValid() { return AfxIsValidAddress(this,sizeof(CEventService))?true:false; } 37 //接口查询 38 virtual void * __cdecl QueryInterface(const IID & Guid, DWORD dwQueryVer); 39 40 //功能接口 41 public: 42 //设置句柄 43 virtual bool __cdecl SetRichEditHwnd(HWND hRichEdit); 44 //设置级别 45 virtual void __cdecl ConfigEventService(enTraceLevel TraceLevel, bool bShow); 46 //事件通知 47 virtual void __cdecl ShowEventNotify(LPCTSTR pszString, enTraceLevel TraceLevel); 48 }; 49 50 ////////////////////////////////////////////////////////////////////////// 51 52 //事件输出类 53 class CEventTrace 54 { 55 //变量定义 56 private: 57 static IEventService * m_pIEventService; //事件接口 58 59 //函数定义 60 private: 61 //构造函数 62 CEventTrace() {} 63 64 //功能函数 65 public: 66 //设置接口 67 static bool SetEventService(IUnknownEx * pIUnknownEx); 68 //获取接口 69 static void * GetEventService(const IID & Guid, DWORD dwQueryVer); 70 //设置级别 71 static void ConfigEventService(enTraceLevel TraceLevel, bool bShow); 72 //事件通知 73 static void ShowEventNotify(LPCTSTR pszString, enTraceLevel TraceLevel); 74 }; 75 76 ////////////////////////////////////////////////////////////////////////// 77 78 #endifEventService.h
头文件ServerKernel.h:
1 #ifndef SERVER_KERNEL_HEAD_FILE 2 #define SERVER_KERNEL_HEAD_FILE 3 4 ////////////////////////////////////////////////////////////////////////// 5 6 //系统头文件 7 #include <ICrsint.h> 8 #include <WinSock2.h> 9 10 //平台头文件 11 #include "..\..\Include\模板库\Template.h" 12 #include "..\..\Include\公共文件\GlobalDef.h" 13 #include "..\..\Include\组件接口\IUnknownEx.h" 14 #include "..\..\共享组件\公共服务\ComService.h" 15 16 ////////////////////////////////////////////////////////////////////////// 17 18 //ADO 导入库 19 #import "MSADO15.DLL" rename_namespace("ADOCG") rename("EOF","EndOfFile") 20 using namespace ADOCG; 21 22 //COM 错误类型 23 typedef _com_error CComError; //COM 错误 24 25 ////////////////////////////////////////////////////////////////////////// 26 //公共宏定义 27 28 //模块定义 29 #ifdef _DEBUG 30 #define SERVER_KERNEL_DLL_NAME TEXT("KernelD.dll") //组件 DLL 名字 31 #else 32 #define SERVER_KERNEL_DLL_NAME TEXT("Kernel.dll") //组件 DLL 名字 33 #endif 34 35 //常量宏定义 36 #define EVENT_LEVEL_COUNT 4 //事件等级 37 #define MAX_QUEUE_PACKET 10240 //最大队列 38 #define INDEX_ALL_SOCKET 0xFFFF //所有连接 39 #define TIMER_REPEAT_TIMER DWORD(-1) //重复次数 40 41 ////////////////////////////////////////////////////////////////////////// 42 //枚举定义 43 44 //输出等级 45 enum enTraceLevel 46 { 47 Level_Normal =0, //普通消息 48 Level_Warning =1, //警告消息 49 Level_Exception =2, //异常消息 50 Level_Debug =3, //调试消息 51 }; 52 53 //数据库错误代码 54 enum enADOErrorType 55 { 56 ErrorType_Nothing =0, //没有错误 57 ErrorType_Connect =1, //连接错误 58 ErrorType_Other =2, //其他错误 59 }; 60 61 ////////////////////////////////////////////////////////////////////////// 62 //事件定义 63 64 //事件标识 65 #define EVENT_CONTROL 0x0001 //控制消息 66 #define EVENT_TIMER 0x0002 //定时器引擎 67 #define EVENT_DATABASE 0x0003 //数据库请求 68 #define EVENT_SOCKET_ACCEPT 0x0004 //网络应答 69 #define EVENT_SOCKET_READ 0x0005 //网络读取 70 #define EVENT_SOCKET_CLOSE 0x0006 //网络关闭 71 72 //定时器事件 73 struct NTY_TimerEvent 74 { 75 WORD wTimerID; //定时器 ID 76 WPARAM wBindParam; //绑定参数 77 }; 78 79 //数据库请求事件 80 struct NTY_DataBaseEvent 81 { 82 WORD wIndex; //对象索引 83 WORD wRoundID; //对象标识 84 WORD wRequestID; //请求标识 85 }; 86 87 //网络应答事件 88 struct NTY_SocketAcceptEvent 89 { 90 WORD wIndex; //连接索引 91 WORD wRoundID; //连接标识 92 DWORD dwClientIP; //连接地址 93 }; 94 95 //网络读取事件 96 struct NTY_SocketReadEvent 97 { 98 WORD wIndex; //连接索引 99 WORD wRoundID; //连接标识 100 WORD wDataSize; //数据大小 101 CMD_Command Command; //命令信息 102 }; 103 104 //网络关闭事件 105 struct NTY_SocketCloseEvent 106 { 107 WORD wIndex; //连接索引 108 WORD wRoundID; //连接标识 109 DWORD dwClientIP; //连接地址 110 DWORD dwConnectSecond; //连接时间 111 }; 112 113 ////////////////////////////////////////////////////////////////////////// 114 115 #define VER_IADOError INTERFACE_VERSION(5,2) 116 static const GUID IID_IADOError={0x66463b5a,0x390c,0x42f9,0x85,0x19,0x13,0x31,0x39,0x36,0xfe,0x8f}; 117 118 //数据库错误接口 119 interface IADOError : public IUnknownEx 120 { 121 //错误描述 122 virtual LPCTSTR __cdecl GetErrorDescribe()=NULL; 123 //错误类型 124 virtual enADOErrorType __cdecl GetErrorType()=NULL; 125 }; 126 127 ////////////////////////////////////////////////////////////////////////// 128 129 #define VER_IDataBase INTERFACE_VERSION(5,2) 130 static const GUID IID_IDataBase={0x9e962173,0x2a9f,0x4ebd,0x8e,0x98,0x40,0xe9,0x96,0x57,0x24,0xfb}; 131 132 //数据库连接接口 133 interface IDataBase : public IUnknownEx 134 { 135 //打开连接 136 virtual bool __cdecl OpenConnection()=NULL; 137 //关闭记录 138 virtual bool __cdecl CloseRecordset()=NULL; 139 //关闭连接 140 virtual bool __cdecl CloseConnection()=NULL; 141 //重新连接 142 virtual bool __cdecl TryConnectAgain(bool bFocusConnect, CComError * pComError)=NULL; 143 //设置信息 144 virtual bool __cdecl SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass)=NULL; 145 //是否连接错误 146 virtual bool __cdecl IsConnectError()=NULL; 147 //是否打开 148 virtual bool __cdecl IsRecordsetOpened()=NULL; 149 //往下移动 150 virtual void __cdecl MoveToNext()=NULL; 151 //移到开头 152 virtual void __cdecl MoveToFirst()=NULL; 153 //是否结束 154 virtual bool __cdecl IsEndRecordset()=NULL; 155 //获取数目 156 virtual long __cdecl GetRecordCount()=NULL; 157 //获取大小 158 virtual long __cdecl GetActualSize(LPCTSTR pszParamName)=NULL; 159 //绑定对象 160 virtual bool __cdecl BindToRecordset(CADORecordBinding * pBind)=NULL; 161 //获取参数 162 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue)=NULL; 163 //获取参数 164 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, WORD & wValue)=NULL; 165 //获取参数 166 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, INT & nValue)=NULL; 167 //获取参数 168 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, LONG & lValue)=NULL; 169 //获取参数 170 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue)=NULL; 171 //获取参数 172 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue)=NULL; 173 //获取参数 174 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue)=NULL; 175 //获取参数 176 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue)=NULL; 177 //获取参数 178 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize)=NULL; 179 //获取参数 180 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time)=NULL; 181 //获取参数 182 virtual bool __cdecl GetFieldValue(LPCTSTR lpFieldName, bool & bValue)=NULL; 183 //设置存储过程 184 virtual void __cdecl SetSPName(LPCTSTR pszSpName)=NULL; 185 //插入参数 186 virtual void __cdecl AddParamter(LPCTSTR pszName, ADOCG::ParameterDirectionEnum Direction, ADOCG::DataTypeEnum Type, long lSize, _variant_t & vtValue)=NULL; 187 //删除参数 188 virtual void __cdecl ClearAllParameters()=NULL; 189 //获得参数 190 virtual void __cdecl GetParameterValue(LPCTSTR pszParamName, _variant_t & vtValue)=NULL; 191 //获取返回数值 192 virtual long __cdecl GetReturnValue()=NULL; 193 //执行语句 194 virtual bool __cdecl Execute(LPCTSTR pszCommand)=NULL; 195 //执行命令 196 virtual bool __cdecl ExecuteCommand(bool bRecordset)=NULL; 197 }; 198 199 ////////////////////////////////////////////////////////////////////////// 200 201 #define VER_IDataBaseSink INTERFACE_VERSION(5,2) 202 static const GUID IID_IDataBaseSink={0x1287cdc2,0xcbda,0x4bb6,0x95,0xeb,0xd9,0xcc,0x6a,0x2b,0xef,0xd3}; 203 204 //数据库钩子接口 205 interface IDataBaseSink : public IUnknownEx 206 { 207 //数据库模块启动 208 virtual bool __cdecl StartService(IUnknownEx * pIUnknownEx)=NULL; 209 //数据库模块关闭 210 virtual bool __cdecl StopService(IUnknownEx * pIUnknownEx)=NULL; 211 //数据操作处理 212 virtual bool __cdecl OnDataBaseRequest(const NTY_DataBaseEvent & DataBaseEvent, void * pDataBuffer, WORD wDataSize)=NULL; 213 }; 214 215 ////////////////////////////////////////////////////////////////////////// 216 217 #define VER_IDataBaseEngine INTERFACE_VERSION(5,2) 218 static const GUID IID_IDataBaseEngine={0x9b00b2a6,0x620e,0x4791,0x97,0xad,0x28,0x32,0x16,0xf1,0x8c,0xdf}; 219 220 //数据库引擎接口 221 interface IDataBaseEngine : public IUnknownEx 222 { 223 //启动服务 224 virtual bool __cdecl StartService()=NULL; 225 //停止服务 226 virtual bool __cdecl StopService()=NULL; 227 //注册钩子 228 virtual bool __cdecl SetDataBaseSink(IUnknownEx * pIUnknownEx)=NULL; 229 //获取接口 230 virtual void * __cdecl GetQueueService(const IID & Guid, DWORD dwQueryVer)=NULL; 231 }; 232 233 ////////////////////////////////////////////////////////////////////////// 234 235 #define VER_IQueueServiceSink INTERFACE_VERSION(5,2) 236 static const GUID IID_IQueueServiceSink={0x88b5bf59,0x3a98,0x43b1,0xac,0x85,0xf1,0x17,0x5b,0x29,0x69,0x40}; 237 238 //数据队列类钩子接口 239 interface IQueueServiceSink : public IUnknownEx 240 { 241 //通知回调函数 242 virtual void __cdecl OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime)=NULL; 243 }; 244 245 ////////////////////////////////////////////////////////////////////////// 246 247 #define VER_IQueueService INTERFACE_VERSION(5,2) 248 static const GUID IID_IQueueService={0xcc5310b5,0x3709,0x40aa,0x85,0x24,0xd6,0xc5,0x87,0xb0,0x32,0x22}; 249 250 //数据队列接口 251 interface IQueueService : public IUnknownEx 252 { 253 //加入数据 254 virtual bool __cdecl AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize)=NULL; 255 }; 256 257 ////////////////////////////////////////////////////////////////////////// 258 259 #define VER_IQueueServiceEngine INTERFACE_VERSION(5,2) 260 static const GUID IID_IQueueServiceEngine={0xba2c602e,0x7f5a,0x40ad,0xb7,0xa5,0x7d,0x1c,0x2a,0x8f,0xee,0x78}; 261 262 //队列类引擎接口 263 interface IQueueServiceEngine : public IUnknownEx 264 { 265 //开始服务 266 virtual bool __cdecl StartService()=NULL; 267 //停止服务 268 virtual bool __cdecl StopService()=NULL; 269 //设置接口 270 virtual bool __cdecl SetQueueServiceSink(IUnknownEx * pIUnknownEx)=NULL; 271 //负荷信息 272 virtual bool __cdecl GetBurthenInfo(tagBurthenInfo & BurthenInfo)=NULL; 273 }; 274 275 ////////////////////////////////////////////////////////////////////////// 276 277 #define VER_IEventService INTERFACE_VERSION(5,2) 278 static const GUID IID_IEventService={0x729d0499,0xad36,0x49d5,0x8d,0x46,0xfd,0xd,0x78,0x82,0xa6,0x37}; 279 280 //服务引擎接口 281 interface IEventService : public IUnknownEx 282 { 283 //设置句柄 284 virtual bool __cdecl SetRichEditHwnd(HWND hRichEdit)=NULL; 285 //设置级别 286 virtual void __cdecl ConfigEventService(enTraceLevel TraceLevel, bool bShow)=NULL; 287 //事件通知 288 virtual void __cdecl ShowEventNotify(LPCTSTR pszString, enTraceLevel TraceLevel)=NULL; 289 }; 290 291 ////////////////////////////////////////////////////////////////////////// 292 293 #define VER_ITimerEngine INTERFACE_VERSION(5,2) 294 static const GUID IID_ITimerEngine={0x4a9b0421,0x1224,0x4e5e,0xa5,0x4f,0xb1,0x61,0x6e,0x62,0xdb,0x98}; 295 296 //定时器引擎接口 297 interface ITimerEngine : public IUnknownEx 298 { 299 //设置定时器 300 virtual bool __cdecl SetTimer(WORD wTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM wParam)=NULL; 301 //删除定时器 302 virtual bool __cdecl KillTimer(WORD wTimerID)=NULL; 303 //删除定时器 304 virtual bool __cdecl KillAllTimer()=NULL; 305 }; 306 307 ////////////////////////////////////////////////////////////////////////// 308 309 #define VER_ITimerEngineManager INTERFACE_VERSION(5,2) 310 static const GUID IID_ITimerEngineManager={0xcdbfa840,0xdc45,0x41f7,0xb6,0x3c,0xad,0x83,0x75,0x98,0xc6,0x3e}; 311 312 //定时器引擎接口 313 interface ITimerEngineManager : public IUnknownEx 314 { 315 //开始服务 316 virtual bool __cdecl StartService()=NULL; 317 //停止服务 318 virtual bool __cdecl StopService()=NULL; 319 //设置接口 320 virtual bool __cdecl SetTimerEngineSink(IUnknownEx * pIUnknownEx)=NULL; 321 }; 322 323 ////////////////////////////////////////////////////////////////////////// 324 325 #define VER_ITCPSocketEngine INTERFACE_VERSION(5,2) 326 static const GUID IID_ITCPSocketEngine={0x9979ea68,0x5ee7,0x4c15,0xa4,0xdf,0x9f,0xe3,0x85,0x26,0x13,0xbb}; 327 328 //TCP SOCKET 引擎接口 329 interface ITCPSocketEngine : public IUnknownEx 330 { 331 //检测连接 332 virtual bool __cdecl DetectSocket()=NULL; 333 //发送函数 334 virtual bool __cdecl SendData(WORD wIndex, WORD wRoundID, WORD wMainCmdID, WORD wSubCmdID)=NULL; 335 //发送函数 336 virtual bool __cdecl SendData(WORD wIndex, WORD wRoundID, WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize)=NULL; 337 //批量发送 338 virtual bool __cdecl SendDataBatch(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize)=NULL; 339 //关闭连接 340 virtual bool __cdecl CloseSocket(WORD wIndex, WORD wRoundID)=NULL; 341 //关闭连接 342 virtual bool __cdecl ShutDownSocket(WORD wIndex, WORD wRoundID)=NULL; 343 //允许群发 344 virtual bool __cdecl AllowBatchSend(WORD wIndex, WORD wRoundID, bool bAllow)=NULL; 345 }; 346 347 ////////////////////////////////////////////////////////////////////////// 348 349 #define VER_ITCPSocketEngineManager INTERFACE_VERSION(5,2) 350 static const GUID IID_ITCPSocketEngineManager={0xf91b246f,0x3c97,0x4445,0xb3,0xeb,0xb9,0x42,0x3b,0x68,0x1b,0xed}; 351 352 //TCP SOCKET 引擎管理接口 353 interface ITCPSocketEngineManager : public IUnknownEx 354 { 355 //设置接口 356 virtual bool __cdecl SetSocketEngineSink(IUnknownEx * pIUnknownEx)=NULL; 357 //设置端口 358 virtual bool __cdecl SetServicePort(WORD wListenPort)=NULL; 359 //设置数目 360 virtual bool __cdecl SetMaxSocketItem(WORD wMaxSocketItem)=NULL; 361 //启动服务 362 virtual bool __cdecl StartService()=NULL; 363 //停止服务 364 virtual bool __cdecl StopService()=NULL; 365 }; 366 367 ////////////////////////////////////////////////////////////////////////// 368 369 #define VER_IAttemperEngineSink INTERFACE_VERSION(5,2) 370 static const GUID IID_IAttemperEngineSink={0x82d2c5,0x4e6f,0x4031,0xae,0xd4,0x6f,0xee,0x5a,0x17,0x1b,0x8a}; 371 372 //调度模块钩子接口 373 interface IAttemperEngineSink : public IUnknownEx 374 { 375 //管理接口 376 public: 377 //调度模块启动 378 virtual bool __cdecl StartService(IUnknownEx * pIUnknownEx)=NULL; 379 //调度模块关闭 380 virtual bool __cdecl StopService(IUnknownEx * pIUnknownEx)=NULL; 381 //事件处理接口 382 virtual bool __cdecl OnAttemperEvent(WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime)=NULL; 383 384 //事件接口 385 public: 386 //定时器事件 387 virtual bool __cdecl OnEventTimer(WORD wTimerID, WPARAM wBindParam)=NULL; 388 //数据库事件 389 virtual bool __cdecl OnEventDataBase(void * pDataBuffer, WORD wDataSize, NTY_DataBaseEvent * pDataBaseEvent)=NULL; 390 //网络应答事件 391 virtual bool __cdecl OnEventSocketAccept(NTY_SocketAcceptEvent * pSocketAcceptEvent)=NULL; 392 //网络读取事件 393 virtual bool __cdecl OnEventSocketRead(CMD_Command Command, void * pDataBuffer, WORD wDataSize, NTY_SocketReadEvent * pSocketReadEvent)=NULL; 394 //网络关闭事件 395 virtual bool __cdecl OnEventSocketClose(NTY_SocketCloseEvent * pSocketCloseEvent)=NULL; 396 }; 397 398 ////////////////////////////////////////////////////////////////////////// 399 400 #define VER_IAttemperEngine INTERFACE_VERSION(5,2) 401 static const GUID IID_IAttemperEngine={0x967b3e64,0x69af,0x434a,0xb8,0x6c,0x67,0x9b,0x72,0xbb,0x2e,0xe}; 402 403 //调度引擎接口 404 interface IAttemperEngine : public IUnknownEx 405 { 406 //管理接口 407 public: 408 //启动服务 409 virtual bool __cdecl StartService()=NULL; 410 //停止服务 411 virtual bool __cdecl StopService()=NULL; 412 //设置网络 413 virtual bool __cdecl SetSocketEngine(IUnknownEx * pIUnknownEx)=NULL; 414 //设置钩子 415 virtual bool __cdecl SetAttemperEngineSink(IUnknownEx * pIUnknownEx)=NULL; 416 //获取接口 417 virtual void * __cdecl GetQueueService(const IID & Guid, DWORD dwQueryVer)=NULL; 418 }; 419 420 ////////////////////////////////////////////////////////////////////////// 421 422 #define VER_IServiceEngine INTERFACE_VERSION(5,2) 423 static const GUID IID_IServiceEngine={0x74284fc0,0xc587,0x4c21,0x9b,0x7c,0x16,0x76,0x27,0x1a,0x7b,0xd5}; 424 425 //服务引擎接口 426 interface IServiceEngine : public IUnknownEx 427 { 428 //服务接口 429 public: 430 //启动服务 431 virtual bool __cdecl StartService()=NULL; 432 //停止服务 433 virtual bool __cdecl StopService()=NULL; 434 435 //配置接口 436 public: 437 //设置事件 438 virtual bool __cdecl SetEventService(IUnknownEx * pIUnknownEx)=NULL; 439 //设置钩子 440 virtual bool __cdecl SetDataBaseSink(IUnknownEx * pIUnknownEx)=NULL; 441 //设置钩子 442 virtual bool __cdecl SetAttemperEngineSink(IUnknownEx * pIUnknownEx)=NULL; 443 //注册钩子 444 virtual bool __cdecl RegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx)=NULL; 445 //设置网络引擎接口 446 virtual bool __cdecl InitServiceEngine(WORD wListenPort, WORD wMaxSocketItem)=NULL; 447 448 //服务查询 449 public: 450 //获取定时器接口 451 virtual void * __cdecl GetTimerEngine(const IID & Guid, DWORD dwQueryVer)=NULL; 452 //获取数据库引擎接口 453 virtual void * __cdecl GetDataBaseEngine(const IID & Guid, DWORD dwQueryVer)=NULL; 454 //获取调度引擎接口 455 virtual void * __cdecl GetAttemperEngine(const IID & Guid, DWORD dwQueryVer)=NULL; 456 //获取网络引擎接口 457 virtual void * __cdecl GetTCPSocketEngine(const IID & Guid, DWORD dwQueryVer)=NULL; 458 //获取异步引擎接口 459 virtual void * __cdecl GetAsynchronismEngine(const IID & Guid, DWORD dwQueryVer)=NULL; 460 //获取接口 461 virtual void * __cdecl GetDataBaseQueueService(const IID & Guid, DWORD dwQueryVer)=NULL; 462 //获取接口 463 virtual void * __cdecl GetAttemperQueueService(const IID & Guid, DWORD dwQueryVer)=NULL; 464 465 //功能接口 466 public: 467 //服务状态 468 virtual bool __cdecl IsService()=NULL; 469 //外部控制 470 virtual bool __cdecl ControlService(void * pBuffer, WORD wDataSize)=NULL; 471 }; 472 473 ////////////////////////////////////////////////////////////////////////// 474 475 #define VER_IAsynchronismEngine INTERFACE_VERSION(5,2) 476 static const GUID IID_IAsynchronismEngine={0x3728c1a5,0x37a9,0x4ace,0x8e,0x31,0xd9,0xb1,0xce,0x63,0xd9,0x88}; 477 478 //异步引擎接口 479 interface IAsynchronismEngine : public IUnknownEx 480 { 481 //管理接口 482 public: 483 //启动服务 484 virtual bool __cdecl StartService()=NULL; 485 //停止服务 486 virtual bool __cdecl StopService()=NULL; 487 //插入请求 488 virtual bool __cdecl InsertRequest(WORD wRequestID, void * const pBuffer, WORD wDataSize, IUnknownEx * pIUnknownEx)=NULL; 489 490 //功能接口 491 public: 492 //注册钩子 493 virtual bool __cdecl RegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx)=NULL; 494 //取消注册 495 virtual bool __cdecl UnRegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx)=NULL; 496 }; 497 498 ////////////////////////////////////////////////////////////////////////// 499 500 #define VER_IAsynchronismEngineSink INTERFACE_VERSION(5,2) 501 static const GUID IID_IAsynchronismEngineSink={0x6898f671,0x5c4b,0x4555,0x8c,0x82,0x49,0xc4,0xf3,0x2a,0xeb,0x4d}; 502 503 //异步引擎钩子接口 504 interface IAsynchronismEngineSink : public IUnknownEx 505 { 506 //启动事件 507 virtual bool __cdecl OnAsynchronismEngineStart()=NULL; 508 //停止事件 509 virtual bool __cdecl OnAsynchronismEngineStop()=NULL; 510 //异步请求 511 virtual bool __cdecl OnAsynchronismRequest(WORD wRequestID, void * pBuffer, WORD wDataSize)=NULL; 512 }; 513 514 ////////////////////////////////////////////////////////////////////////// 515 516 //导出组件文件 517 #include "QueueServiceEvent.h" 518 #include "ServerKernelHelper.h" 519 520 ////////////////////////////////////////////////////////////////////////// 521 522 #endifServerKernel.h
头文件QueueService.h:
1 #ifndef QUEUE_SERVICE_HEAD_FILE 2 #define QUEUE_SERVICE_HEAD_FILE 3 4 #include "ServerKernel.h" 5 6 #pragma once