#include "StdAfx.h" #include "Math.h" #include "DataBaseEngine.h" ////////////////////////////////////////////////////////////////////////// //宏定义 _COM_SMARTPTR_TYPEDEF(IADORecordBinding,__uuidof(IADORecordBinding)); //效验结果宏 #define EfficacyResult(hResult) { if (FAILED(hResult)) _com_issue_error(hResult); } ////////////////////////////////////////////////////////////////////////// //构造函数 CADOError::CADOError() { m_enErrorType=SQLException_None; } //析构函数 CADOError::~CADOError() { } //接口查询 void * __cdecl CADOError::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBaseException,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBaseException,Guid,dwQueryVer); return NULL; } //设置错误 void CADOError::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe) { //设置错误 m_enErrorType=enErrorType; m_strErrorDescribe=pszDescribe; //抛出错误 throw QUERY_ME_INTERFACE(IDataBaseException); return; } ////////////////////////////////////////////////////////////////////////// //构造函数 CDataBase::CDataBase() : m_dwResumeConnectCount(30L),m_dwResumeConnectTime(30L) { //状态变量 m_dwConnectCount=0; m_dwConnectErrorTime=0L; //创建对象 m_DBCommand.CreateInstance(__uuidof(Command)); m_DBRecordset.CreateInstance(__uuidof(Recordset)); m_DBConnection.CreateInstance(__uuidof(Connection)); //效验数据 ASSERT(m_DBCommand!=NULL); ASSERT(m_DBRecordset!=NULL); ASSERT(m_DBConnection!=NULL); if (m_DBCommand==NULL) throw TEXT("数据库命令对象创建失败"); if (m_DBRecordset==NULL) throw TEXT("数据库记录集对象创建失败"); if (m_DBConnection==NULL) throw TEXT("数据库连接对象创建失败"); //设置变量 m_DBCommand->CommandType=adCmdStoredProc; return; } //析构函数 CDataBase::~CDataBase() { //关闭连接 CloseConnection(); //释放对象 m_DBCommand.Release(); m_DBRecordset.Release(); m_DBConnection.Release(); return; } //接口查询 void * __cdecl CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBase,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBase,Guid,dwQueryVer); return NULL; } //打开连接 void __cdecl CDataBase::OpenConnection() { //连接数据库 try { //关闭连接 CloseConnection(); //连接数据库 EfficacyResult(m_DBConnection->Open(_bstr_t(m_strConnect),L"",L"",adConnectUnspecified)); m_DBConnection->CursorLocation=adUseClient; m_DBCommand->ActiveConnection=m_DBConnection; //设置变量 m_dwConnectCount=0L; m_dwConnectErrorTime=0L; return ; } catch (CComError & ComError) { SetErrorInfo(SQLException_Connect,GetComErrorDescribe(ComError)); } return ; } //关闭连接 void __cdecl CDataBase::CloseConnection() { try { CloseRecordset(); if ((m_DBConnection!=NULL)&&(m_DBConnection->GetState()!=adStateClosed)) { EfficacyResult(m_DBConnection->Close()); } return ; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return ; } //设置信息 bool __cdecl CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword) { //效验参数 ASSERT(szDBName!=NULL); ASSERT(szUser!=NULL); ASSERT(szPassword!=NULL); struct sockaddr_in local; local.sin_family = AF_INET; local.sin_addr.s_addr = dwDBAddr; char * pIP = inet_ntoa(local.sin_addr); //构造连接字符串 m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"), szPassword,szUser,szDBName,pIP,wPort); return true; } //设置信息 bool __cdecl CDataBase::SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass) { //效验参数 ASSERT(szIP!=NULL); ASSERT(szData!=NULL); ASSERT(szName!=NULL); ASSERT(szPass!=NULL); //构造连接字符串 m_strConnect.Format(TEXT("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s,%ld;"), szPass,szName,szData,szIP,wPort); return true; } VOID __cdecl CDataBase::ClearParameters() { try { long lParameterCount=m_DBCommand->Parameters->Count; if (lParameterCount>0L) { for (long i=lParameterCount;i>0;i--) { m_DBCommand->Parameters->Delete(i-1); } } } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } } //获得参数 void __cdecl CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue)//(LPCTSTR pszParamName, _variant_t & vtValue) { //效验参数 ASSERT(pszParamName!=NULL); //获取参数 try { DBVarValue.Clear(); DBVarValue=m_DBCommand->Parameters->Item[pszParamName]->Value; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; } //执行语句 VOID __cdecl CDataBase::AddParameter(LPCTSTR pszName, DataTypeEnum Type, ParameterDirectionEnum Direction, LONG lSize, CDBVarValue & DBVarValue) { ASSERT(pszName!=NULL); try { _ParameterPtr Parameter=m_DBCommand->CreateParameter(pszName,Type,Direction,lSize,DBVarValue); m_DBCommand->Parameters->Append(Parameter); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; return ; } VOID __cdecl CDataBase::NextRecordset() { try { m_DBRecordset->MoveNext(); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; } //关闭记录 VOID __cdecl CDataBase::CloseRecordset() { try { if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close()); return ; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return ; } VOID __cdecl CDataBase::BindToRecordset(CADORecordBinding * pBind) { ASSERT(pBind!=NULL); try { IADORecordBindingPtr pIBind(m_DBRecordset); pIBind->BindToRecordset(pBind); return ; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return ; } //往下移动 void __cdecl CDataBase::MoveToNext() { try { m_DBRecordset->MoveNext(); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; } //移到开头 void __cdecl CDataBase::MoveToFirst() { try { m_DBRecordset->MoveFirst(); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; } //是否结束 bool __cdecl CDataBase::IsRecordsetEnd() { try { return (m_DBRecordset->EndOfFile==VARIANT_TRUE); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return true; } //获取数目 long __cdecl CDataBase::GetRecordCount() { try { if (m_DBRecordset==NULL) return 0; return m_DBRecordset->GetRecordCount(); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return 0; } //获取返回数值 long __cdecl CDataBase::GetReturnValue() { try { _ParameterPtr Parameter; long lParameterCount=m_DBCommand->Parameters->Count; for (long i=0;iParameters->Item[i]; if (Parameter->Direction==adParamReturnValue) return Parameter->Value.lVal; } ASSERT(FALSE); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return 0; } //获取返回数值 void __cdecl CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue) { //效验参数 ASSERT(pszItem!=NULL); try { DBVarValue.Clear(); DBVarValue=m_DBRecordset->Fields->GetItem(pszItem)->Value; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return ; } //执行语句 VOID __cdecl CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset) { return ; } //执行语句 VOID __cdecl CDataBase::ExecuteSentence(LPCTSTR pszCommand, bool bRecordset) { ASSERT(pszCommand!=NULL); try { m_DBConnection->CursorLocation=adUseClient; m_DBConnection->Execute(pszCommand,NULL,adExecuteNoRecords); return ; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } catch(...) { CloseRecordset(); CloseConnection(); } return ; } //接口函数引用的函数 //是否打开 bool __cdecl CDataBase::IsRecordsetOpened() { if (m_DBRecordset==NULL) return false; if (m_DBRecordset->GetState()==adStateClosed) return false; return true; } //获取错误 LPCTSTR CDataBase::GetComErrorDescribe(CComError & ComError) { _bstr_t bstrDescribe(ComError.Description()); m_strErrorDescribe.Format(TEXT("ADO 错误:0x%8x,%s"),ComError.Error(),(LPCTSTR)bstrDescribe); return m_strErrorDescribe; } //设置错误 void CDataBase::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe) { m_ADOError.SetErrorInfo(enErrorType,pszDescribe); return; } ///接口函数引用的函数 //设置存储过程 void __cdecl CDataBase::SetSPName(LPCTSTR pszSpName) { ASSERT(pszSpName!=NULL); try { m_DBCommand->CommandText=pszSpName; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; } //执行语句 bool __cdecl CDataBase::Execute(LPCTSTR pszCommand) { ASSERT(pszCommand!=NULL); try { m_DBConnection->CursorLocation=adUseClient; m_DBConnection->Execute(pszCommand,NULL,adExecuteNoRecords); return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } catch(...) { CloseRecordset(); CloseConnection(); } return false; } //执行命令 bool __cdecl CDataBase::ExecuteCommand(bool bRecordset) { try { //关闭记录集 CloseRecordset(); //执行命令 if (bRecordset==true) { m_DBRecordset->PutRefSource(m_DBCommand); m_DBRecordset->CursorLocation=adUseClient; EfficacyResult(m_DBRecordset->Open((IDispatch *)m_DBCommand,vtMissing,adOpenForwardOnly,adLockReadOnly,adOptionUnspecified)); } else { m_DBConnection->CursorLocation=adUseClient; EfficacyResult(m_DBCommand->Execute(NULL,NULL,adExecuteNoRecords)); } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } catch(...) { CloseRecordset(); CloseConnection(); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE & bValue) { try { bValue=0; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch(vtFld.vt) { case VT_BOOL: { bValue=(vtFld.boolVal!=0)?1:0; break; } case VT_I2: case VT_UI1: { bValue=(vtFld.iVal>0)?1:0; break; } case VT_NULL: case VT_EMPTY: { bValue=0; break; } default: bValue=(BYTE)vtFld.iVal; } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, UINT & ulValue) { try { ulValue=0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.lVal; return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DOUBLE & dbValue) { try { dbValue=0.0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch(vtFld.vt) { case VT_R4: { dbValue=vtFld.fltVal; break; } case VT_R8: { dbValue=vtFld.dblVal; break; } case VT_DECIMAL: { dbValue=vtFld.decVal.Lo32; dbValue*=(vtFld.decVal.sign==128)?-1:1; dbValue/=pow((float)10,vtFld.decVal.scale); break; } case VT_UI1: { dbValue=vtFld.iVal; break; } case VT_I2: case VT_I4: { dbValue=vtFld.lVal; break; } case VT_NULL: case VT_EMPTY: { dbValue=0.0L; break; } default: dbValue=vtFld.dblVal; } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, LONG & lValue) { try { lValue=0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) lValue=vtFld.lVal; return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, DWORD & ulValue) { try { ulValue=0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) ulValue=vtFld.ulVal; return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, INT & nValue) { try { nValue=0; _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch(vtFld.vt) { case VT_BOOL: { nValue = vtFld.boolVal; break; } case VT_I2: case VT_UI1: { nValue = vtFld.iVal; break; } case VT_NULL: case VT_EMPTY: { nValue = 0; break; } default: nValue = vtFld.iVal; } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue) { try { llValue=0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) llValue=vtFld.llVal; return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, TCHAR szBuffer[], UINT uSize) { try { _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if (vtFld.vt==VT_BSTR) { lstrcpy(szBuffer,(char*)_bstr_t(vtFld)); return true; } return false; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, WORD & wValue) { try { wValue=0L; _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) wValue=(WORD)vtFld.ulVal; return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, COleDateTime & Time) { try { _variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch(vtFld.vt) { case VT_DATE: { COleDateTime TempTime(vtFld); Time=TempTime; break; } case VT_EMPTY: case VT_NULL: { Time.SetStatus(COleDateTime::null); break; } default: return false; } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } //获取参数 bool __cdecl CDataBase::GetFieldValue(LPCTSTR lpFieldName, bool & bValue) { try { _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value; switch(vtFld.vt) { case VT_BOOL: { bValue=(vtFld.boolVal==0)?false:true; break; } case VT_EMPTY: case VT_NULL: { bValue = false; break; } default:return false; } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; } void CDataBase::ExecuteSql(LPCTSTR strSQL,LONG DBValue) { _variant_t var; //临时变量 try { m_DBRecordset->Open(_variant_t(strSQL), m_DBConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if(!IsRecordsetEnd()) { //while (!m_DBRecordset->adoEOF)//记录尾 while (!IsRecordsetEnd())//记录尾 { int iUserRight=0; //用户权限 //读取“FaceID”字段 var = m_DBRecordset->GetCollect("UserRight"); if (var.vt != VT_NULL) { iUserRight = atoi( (LPCSTR)_bstr_t(var) ); } iUserRight=iUserRight&DBValue; m_DBRecordset->PutCollect("UserRight", _variant_t(iUserRight)); m_DBRecordset->Update();//更新数据 m_DBRecordset->MoveNext(); } } m_DBRecordset->Close(); } catch(_com_error *) { //AfxMessageBox(e->ErrorMessage()); } catch(...) { //AfxMessageBox("访问数据库服务器时发生异常."); return; } } ////////////////////////////////////////////////////////////////////////// //构造函数 CDataBaseEngine::CDataBaseEngine(void) { //设置变量 m_bService=false; m_pIDataBaseEngineSink=NULL; return; } //析构函数 CDataBaseEngine::~CDataBaseEngine(void) { } //接口查询 void * __cdecl CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer) { QUERYINTERFACE(IDataBaseEngine,Guid,dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine,Guid,dwQueryVer); return NULL; } //启动服务 bool __cdecl CDataBaseEngine::StartService() { //判断状态 if (m_bService==true) { CTraceService::TraceString(TEXT("数据库引擎重复启动,启动操作忽略"),TraceLevel_Warning); return true; } //外挂接口 if (m_pIDataBaseEngineSink==NULL) { CTraceService::TraceString(TEXT("数据库引擎外挂服务不存在"),TraceLevel_Exception); return false; } //启动外挂 if (m_pIDataBaseEngineSink->OnDataBaseEngineStart(QUERY_ME_INTERFACE(IUnknownEx))==false) { CTraceService::TraceString(TEXT("数据库引擎外挂服务启动失败"),TraceLevel_Exception); return false; } //设置变量 m_bService=true; return true; } //停止服务 bool __cdecl CDataBaseEngine::ConcludeService() { //设置变量 m_bService=false; if(m_pIDataBaseEngineSink!=NULL) { m_pIDataBaseEngineSink->OnDataBaseEngineStop(QUERY_ME_INTERFACE(IUnknownEx)); } m_pIDataBaseEngineSink=NULL; return true; } // bool __cdecl CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx) { //效验参数 ASSERT(pIUnknownEx!=NULL); ASSERT(m_pIDataBaseEngineSink==NULL); if (pIUnknownEx==NULL) return false; if (m_pIDataBaseEngineSink!=NULL) return false; //查询接口 m_pIDataBaseEngineSink=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,IDataBaseEngineSink); if (m_pIDataBaseEngineSink==NULL) { CTraceService::TraceString(TEXT("数据库引擎外挂服务接口获取失败,挂接操作失败"),TraceLevel_Exception); return false; } return true; } bool __cdecl CDataBaseEngine::PostDataBaseTimer(DWORD dwTimerID, WPARAM dwBindParameter) { return true; } bool __cdecl CDataBaseEngine::PostDataBaseControl(WORD wControlID, VOID * pData, WORD wDataSize) { return true; } bool __cdecl CDataBaseEngine::PostDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize) { //处理数据 ASSERT(m_pIDataBaseEngineSink!=NULL); m_pIDataBaseEngineSink->OnDataBaseEngineRequest(wRequestID, dwContextID, pData, wDataSize); return true; } ////////////////////////////////////////////////////////////////////////// //建立对象函数 extern "C" __declspec(dllexport) void * __cdecl CreateDataBaseEngine(const GUID & Guid, DWORD dwInterfaceVer) { //建立对象 CDataBaseEngine * pDataBaseEngine=NULL; try { pDataBaseEngine=new CDataBaseEngine(); if (pDataBaseEngine==NULL) throw TEXT("创建失败"); void * pObject=pDataBaseEngine->QueryInterface(Guid,dwInterfaceVer); if (pObject==NULL) throw TEXT("接口查询失败"); return pObject; } catch (...) {} //清理对象 SafeDelete(pDataBaseEngine); return NULL; } ////////////////////////////////////////////////////////////////////////// //建立对象函数 extern "C" __declspec(dllexport) void * __cdecl CreateDataBase(const GUID & Guid, DWORD dwInterfaceVer) { //建立对象 CDataBase * pDataBase=NULL; try { pDataBase=new CDataBase(); if (pDataBase==NULL) throw TEXT("创建失败"); void * pObject=pDataBase->QueryInterface(Guid,dwInterfaceVer); if (pObject==NULL) throw TEXT("接口查询失败"); return pObject; } catch (...) {} //清理对象 SafeDelete(pDataBase); return NULL; } //////////////////////////////////////////////////////////////////////////