您的位置:首页 > 博客中心 > 数据库 >

收藏一个c++连接数据库的类

时间:2022-03-14 03:42

DataBaseEngine.cpp:

gxlsystem.com,布布扣gxlsystem.com,布布扣
  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 :

gxlsystem.com,布布扣gxlsystem.com,布布扣
  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 #endif
DataBaseEngine.h

头文件Stdafx.h :

gxlsystem.com,布布扣gxlsystem.com,布布扣
 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_SUPPORT
Stdafx.h

头文件EventService.h :

gxlsystem.com,布布扣gxlsystem.com,布布扣
 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 #endif
EventService.h

头文件ServerKernel.h:

gxlsystem.com,布布扣gxlsystem.com,布布扣
  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 #endif
ServerKernel.h

头文件QueueService.h:

gxlsystem.com,布布扣gxlsystem.com,布布扣
  1 #ifndef QUEUE_SERVICE_HEAD_FILE
  2 #define QUEUE_SERVICE_HEAD_FILE
  3 
  4 #include "ServerKernel.h"
  5 
  6 #pragma once                            

热门排行

今日推荐

热门手游