Files

931 lines
20 KiB
C++
Raw Permalink Normal View History

2026-03-03 13:56:44 +08:00
#include "StdAfx.h"
#include "Math.h"
#include "DataBaseEngine.h"
//////////////////////////////////////////////////////////////////////////
//<2F><EFBFBD><EAB6A8>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding,__uuidof(IADORecordBinding));
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define EfficacyResult(hResult) { if (FAILED(hResult)) _com_issue_error(hResult); }
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CADOError::CADOError()
{
m_enErrorType=SQLException_None;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CADOError::~CADOError()
{
}
//<2F>ӿڲ<D3BF>ѯ
void * __cdecl CADOError::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBaseException,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBaseException,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
void CADOError::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe)
{
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
m_enErrorType=enErrorType;
m_strErrorDescribe=pszDescribe;
//<2F>׳<EFBFBD><D7B3><EFBFBD><EFBFBD><EFBFBD>
throw QUERY_ME_INTERFACE(IDataBaseException);
return;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CDataBase::CDataBase() : m_dwResumeConnectCount(30L),m_dwResumeConnectTime(30L)
{
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
m_dwConnectCount=0;
m_dwConnectErrorTime=0L;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_DBCommand.CreateInstance(__uuidof(Command));
m_DBRecordset.CreateInstance(__uuidof(Recordset));
m_DBConnection.CreateInstance(__uuidof(Connection));
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_DBCommand!=NULL);
ASSERT(m_DBRecordset!=NULL);
ASSERT(m_DBConnection!=NULL);
if (m_DBCommand==NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴴽<EFBFBD>ʧ<EFBFBD><EFBFBD>");
if (m_DBRecordset==NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴴽<EFBFBD>ʧ<EFBFBD><EFBFBD>");
if (m_DBConnection==NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD>󴴽<EFBFBD>ʧ<EFBFBD><EFBFBD>");
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_DBCommand->CommandType=adCmdStoredProc;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDataBase::~CDataBase()
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
CloseConnection();
//<2F>ͷŶ<CDB7><C5B6><EFBFBD>
m_DBCommand.Release();
m_DBRecordset.Release();
m_DBConnection.Release();
return;
}
//<2F>ӿڲ<D3BF>ѯ
void * __cdecl CDataBase::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBase,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBase,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void __cdecl CDataBase::OpenConnection()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
try
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
CloseConnection();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>
EfficacyResult(m_DBConnection->Open(_bstr_t(m_strConnect),L"",L"",adConnectUnspecified));
m_DBConnection->CursorLocation=adUseClient;
m_DBCommand->ActiveConnection=m_DBConnection;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwConnectCount=0L;
m_dwConnectErrorTime=0L;
return ;
}
catch (CComError & ComError) { SetErrorInfo(SQLException_Connect,GetComErrorDescribe(ComError)); }
return ;
}
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
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 ;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool __cdecl CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool __cdecl CDataBase::SetConnectionInfo(LPCTSTR szIP, WORD wPort, LPCTSTR szData, LPCTSTR szName, LPCTSTR szPass)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(szIP!=NULL);
ASSERT(szData!=NULL);
ASSERT(szName!=NULL);
ASSERT(szPass!=NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
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)); }
}
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
void __cdecl CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue)//(LPCTSTR pszParamName, _variant_t & vtValue)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pszParamName!=NULL);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
try
{
DBVarValue.Clear();
DBVarValue=m_DBCommand->Parameters->Item[pszParamName]->Value;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F>رռ<D8B1>¼
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 ;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
void __cdecl CDataBase::MoveToNext()
{
try
{
m_DBRecordset->MoveNext();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//<2F>Ƶ<EFBFBD><C6B5><EFBFBD>ͷ
void __cdecl CDataBase::MoveToFirst()
{
try
{
m_DBRecordset->MoveFirst();
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool __cdecl CDataBase::IsRecordsetEnd()
{
try
{
return (m_DBRecordset->EndOfFile==VARIANT_TRUE);
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return true;
}
//<2F><>ȡ<EFBFBD><C8A1>Ŀ
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
long __cdecl CDataBase::GetReturnValue()
{
try
{
_ParameterPtr Parameter;
long lParameterCount=m_DBCommand->Parameters->Count;
for (long i=0;i<lParameterCount;i++)
{
Parameter=m_DBCommand->Parameters->Item[i];
if (Parameter->Direction==adParamReturnValue) return Parameter->Value.lVal;
}
ASSERT(FALSE);
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return 0;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void __cdecl CDataBase::GetRecordsetValue(LPCTSTR pszItem, CDBVarValue & DBVarValue)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pszItem!=NULL);
try
{
DBVarValue.Clear();
DBVarValue=m_DBRecordset->Fields->GetItem(pszItem)->Value;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return ;
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID __cdecl CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset)
{
return ;
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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 ;
}
//<2F>ӿں<D3BF><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĺ<C3B5><C4BA><EFBFBD>
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool __cdecl CDataBase::IsRecordsetOpened()
{
if (m_DBRecordset==NULL) return false;
if (m_DBRecordset->GetState()==adStateClosed) return false;
return true;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
LPCTSTR CDataBase::GetComErrorDescribe(CComError & ComError)
{
_bstr_t bstrDescribe(ComError.Description());
m_strErrorDescribe.Format(TEXT("ADO <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x%8x<38><78>%s"),ComError.Error(),(LPCTSTR)bstrDescribe);
return m_strErrorDescribe;
}
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
void CDataBase::SetErrorInfo(enSQLException enErrorType, LPCTSTR pszDescribe)
{
m_ADOError.SetErrorInfo(enErrorType,pszDescribe);
return;
}
///<2F>ӿں<D3BF><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĺ<C3B5><C4BA><EFBFBD>
//<2F><><EFBFBD>ô洢<C3B4><E6B4A2><EFBFBD><EFBFBD>
void __cdecl CDataBase::SetSPName(LPCTSTR pszSpName)
{
ASSERT(pszSpName!=NULL);
try
{
m_DBCommand->CommandText=pszSpName;
}
catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
return;
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool __cdecl CDataBase::ExecuteCommand(bool bRecordset)
{
try
{
//<2F>رռ<D8B1>¼<EFBFBD><C2BC>
CloseRecordset();
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
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; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
try
{
m_DBRecordset->Open(_variant_t(strSQL),
m_DBConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
if(!IsRecordsetEnd())
{
//while (!m_DBRecordset->adoEOF)//<2F><>¼β
while (!IsRecordsetEnd())//<2F><>¼β
{
int iUserRight=0; //<2F>û<EFBFBD>Ȩ<EFBFBD><C8A8>
//<2F><>ȡ<EFBFBD><C8A1>FaceID<49><44><EFBFBD>ֶ<EFBFBD>
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();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_DBRecordset->MoveNext();
}
}
m_DBRecordset->Close();
}
catch(_com_error *)
{
//AfxMessageBox(e->ErrorMessage());
}
catch(...)
{
//AfxMessageBox("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣.");
return;
}
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CDataBaseEngine::CDataBaseEngine(void)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bService=false;
m_pIDataBaseEngineSink=NULL;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDataBaseEngine::~CDataBaseEngine(void)
{
}
//<2F>ӿڲ<D3BF>ѯ
void * __cdecl CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBaseEngine,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool __cdecl CDataBaseEngine::StartService()
{
//<2F>ж<EFBFBD>״̬
if (m_bService==true)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),TraceLevel_Warning);
return true;
}
//<2F><><EFBFBD>ҽӿ<D2BD>
if (m_pIDataBaseEngineSink==NULL)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD>񲻴<EFBFBD><EFBFBD><EFBFBD>"),TraceLevel_Exception);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pIDataBaseEngineSink->OnDataBaseEngineStart(QUERY_ME_INTERFACE(IUnknownEx))==false)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"),TraceLevel_Exception);
return false;
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bService=true;
return true;
}
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
bool __cdecl CDataBaseEngine::ConcludeService()
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
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)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pIUnknownEx!=NULL);
ASSERT(m_pIDataBaseEngineSink==NULL);
if (pIUnknownEx==NULL) return false;
if (m_pIDataBaseEngineSink!=NULL) return false;
//<2F><>ѯ<EFBFBD>ӿ<EFBFBD>
m_pIDataBaseEngineSink=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,IDataBaseEngineSink);
if (m_pIDataBaseEngineSink==NULL)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڻ<EFBFBD>ȡʧ<EFBFBD>ܣ<EFBFBD><EFBFBD>ҽӲ<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"),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)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(m_pIDataBaseEngineSink!=NULL);
m_pIDataBaseEngineSink->OnDataBaseEngineRequest(wRequestID, dwContextID, pData, wDataSize);
return true;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern "C" __declspec(dllexport) void * __cdecl CreateDataBaseEngine(const GUID & Guid, DWORD dwInterfaceVer)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDataBaseEngine * pDataBaseEngine=NULL;
try
{
pDataBaseEngine=new CDataBaseEngine();
if (pDataBaseEngine==NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
void * pObject=pDataBaseEngine->QueryInterface(Guid,dwInterfaceVer);
if (pObject==NULL) throw TEXT("<EFBFBD>ӿڲ<EFBFBD>ѯʧ<EFBFBD><EFBFBD>");
return pObject;
}
catch (...) {}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeDelete(pDataBaseEngine);
return NULL;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern "C" __declspec(dllexport) void * __cdecl CreateDataBase(const GUID & Guid, DWORD dwInterfaceVer)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDataBase * pDataBase=NULL;
try
{
pDataBase=new CDataBase();
if (pDataBase==NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
void * pObject=pDataBase->QueryInterface(Guid,dwInterfaceVer);
if (pObject==NULL) throw TEXT("<EFBFBD>ӿڲ<EFBFBD>ѯʧ<EFBFBD><EFBFBD>");
return pObject;
}
catch (...) {}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SafeDelete(pDataBase);
return NULL;
}
//////////////////////////////////////////////////////////////////////////