//重新连接 bool __cdecl CDataBase::TryConnectAgain(bool bFocusConnect, CComError * pComError) { try { //判断重连 bool bReConnect = bFocusConnect; if (bReConnect == false) { DWORD dwNowTime = (DWORD)time(NULL); if ((m_dwConnectErrorTime + m_dwResumeConnectTime) > dwNowTime) bReConnect = true; } if ((bReConnect == false) && (m_dwConnectCount > m_dwResumeConnectCount)) bReConnect = true; //设置变量 m_dwConnectCount++; m_dwConnectErrorTime = (DWORD)time(NULL); if (bReConnect == false) { if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError)); return false; } //重新连接 OpenConnection(); return true; } catch (IDataBaseException * pIDataBaseException) { //重新连接错误 if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError)); else throw pIDataBaseException; } 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) { if (IsConnectError()==true) TryConnectAgain(false,&ComError); else SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; }
//是否连接错误 bool __cdecl CDataBase::IsConnectError() { try { //状态判断 if (m_DBConnection == NULL) return true; if (m_DBConnection->GetState() == adStateClosed) return true; //参数判断 long lErrorCount = m_DBConnection->Errors->Count; if (lErrorCount > 0L) { ErrorPtr pError = NULL; for (long i = 0; i < lErrorCount; i++) { pError = m_DBConnection->Errors->GetItem(i); if (pError->Number == 0x80004005) return true; } } return false; } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, 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(SQLException_Syntax, 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(SQLException_Syntax, 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; }
//执行语句 VOID __cdecl CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset) { ASSERT(pszSPName != NULL); try { //关闭记录集 CloseRecordset(); m_DBCommand->CommandText = pszSPName; //执行命令 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)); } } catch (CComError & ComError) { if (IsConnectError() == true) TryConnectAgain(false, &ComError); else SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//是否结束 bool __cdecl CDataBase::IsEndRecordset() { try { return (m_DBRecordset->EndOfFile==VARIANT_TRUE); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return true; }
//移到开头 void __cdecl CDataBase::MoveToFirst() { try { m_DBRecordset->MoveFirst(); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; }
//设置存储过程 void __cdecl CDataBase::SetSPName(LPCTSTR pszSpName) { ASSERT(pszSpName!=NULL); try { m_DBCommand->CommandText=pszSpName; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; }
//获取大小 long __cdecl CDataBase::GetActualSize(LPCTSTR pszParamName) { ASSERT(pszParamName!=NULL); try { return m_DBRecordset->Fields->Item[pszParamName]->ActualSize; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return -1; }
//获取数目 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; }
//关闭记录 VOID __cdecl CDataBase::CloseRecordset() { try { if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close()); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//关闭记录 bool __cdecl CDataBase::CloseRecordset() { try { if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close()); 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(10.0, 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(SQLException_Syntax, GetComErrorDescribe(ComError)); } return false; }
//插入参数 void __cdecl CDataBase::AddParamter(LPCTSTR pszName, ADOCG::ParameterDirectionEnum Direction, ADOCG::DataTypeEnum Type, long lSize, _variant_t & vtValue) { ASSERT(pszName!=NULL); try { _ParameterPtr Parameter=m_DBCommand->CreateParameter(pszName,Type,Direction,lSize,vtValue); m_DBCommand->Parameters->Append(Parameter); } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; }
//获取数据 VOID __cdecl CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue) { ASSERT(pszItem != NULL); try { DBVarValue = m_DBRecordset->Fields->GetItem(pszItem)->Value; } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//绑定对象 bool __cdecl CDataBase::BindToRecordset(CADORecordBinding * pBind) { ASSERT(pBind!=NULL); try { IADORecordBindingPtr pIBind(m_DBRecordset); pIBind->BindToRecordset(pBind); return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; }
//插入参数 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(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//获取参数 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; }
//绑定对象 VOID __cdecl CDataBase::BindToRecordset(CADORecordBinding * pBind) { ASSERT(pBind != NULL); try { IADORecordBindingPtr pIBind(m_DBRecordset); pIBind->BindToRecordset(pBind); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//是否结束 bool __cdecl CDataBase::IsRecordsetEnd() { try { return (m_DBRecordset->EndOfFile == VARIANT_TRUE); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } return true; }
//移到开头 void __cdecl CDataBase::MoveToFirst() { try { m_DBRecordset->MoveFirst(); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } return; }
//执行命令 VOID __cdecl CDataBase::ExecuteSentence(LPCTSTR pszCommand, bool bRecordset) { ASSERT(pszCommand != NULL); try { m_DBConnection->CursorLocation = adUseClient; m_DBConnection->Execute(pszCommand, NULL, adExecuteNoRecords); } catch (CComError & ComError) { if (IsConnectError() == true) TryConnectAgain(false, &ComError); else SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//获取数目 long __cdecl CDataBase::GetRecordCount() { try { if (m_DBRecordset == NULL) return 0; return m_DBRecordset->GetRecordCount(); } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } return 0; }
//切换记录 VOID __cdecl CDataBase::NextRecordset() { try { VARIANT lngRec; m_DBRecordset->NextRecordset(&lngRec); return; } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//获得参数 void __cdecl CDataBase::GetParameterValue(LPCTSTR pszParamName, _variant_t & vtValue) { //效验参数 ASSERT(pszParamName!=NULL); //获取参数 try { vtValue.Clear(); vtValue=m_DBCommand->Parameters->Item[pszParamName]->Value; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return; }
//关闭连接 bool __cdecl CDataBase::CloseConnection() { try { CloseRecordset(); if ((m_DBConnection!=NULL)&&(m_DBConnection->GetState()!=adStateClosed)) { EfficacyResult(m_DBConnection->Close()); } return true; } catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); } return false; }
//关闭连接 VOID __cdecl CDataBase::CloseConnection() { try { CloseRecordset(); if ((m_DBConnection != NULL) && (m_DBConnection->GetState() != adStateClosed)) { EfficacyResult(m_DBConnection->Close()); } } catch (CComError & ComError) { SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError)); } }
//获取参数 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(SQLException_Syntax, GetComErrorDescribe(ComError)); } return false; }