Files

1258 lines
26 KiB
C++
Raw Permalink Normal View History

2026-03-03 13:56:44 +08:00
#include "StdAfx.h"
#include "Math.h"
#include "TraceService.h"
#include "DataBase.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 * 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 * 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 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;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//<2F>رռ<D8B1>¼
VOID CDataBase::CloseRecordset()
{
try
{
if (IsRecordsetOpened()) EfficacyResult(m_DBRecordset->Close());
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
VOID CDataBase::CloseConnection()
{
try
{
CloseRecordset();
if ((m_DBConnection != NULL) && (m_DBConnection->GetState() != adStateClosed))
{
EfficacyResult(m_DBConnection->Close());
}
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CDataBase::TryConnectAgain(bool bFocusConnect, CComError * pComError)
{
try
{
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
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;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_dwConnectCount++;
m_dwConnectErrorTime = (DWORD)time(NULL);
if (bReConnect == false)
{
if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError));
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OpenConnection();
return true;
}
catch (IDataBaseException * pIDataBaseException)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
if (pComError != NULL) SetErrorInfo(SQLException_Connect, GetComErrorDescribe(*pComError));
else throw pIDataBaseException;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool CDataBase::SetConnectionInfo(DWORD dwDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(dwDBAddr != 0);
ASSERT(szDBName != NULL);
ASSERT(szUser != NULL);
ASSERT(szPassword != NULL);
BYTE a = (BYTE)((dwDBAddr >> 24) & 0xFF);
BYTE b = (BYTE)((dwDBAddr >> 16) & 0xFF);
BYTE c = (BYTE)((dwDBAddr >> 8) & 0xFF);
BYTE d = (BYTE)(dwDBAddr & 0xFF);
try
{
//<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=%d.%d.%d.%d;Data Source=%s,%ld;"),
szPassword, szUser, szDBName, a, b, c, d, wPort);
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return true;
}
//<2F>л<EFBFBD><D0BB><EFBFBD>¼
VOID CDataBase::NextRecordset()
{
try
{
VARIANT lngRec;
m_DBRecordset->NextRecordset(&lngRec);
return;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool CDataBase::SetConnectionInfo(LPCTSTR szDBAddr, WORD wPort, LPCTSTR szDBName, LPCTSTR szUser, LPCTSTR szPassword)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(szDBAddr != NULL);
ASSERT(szDBName != NULL);
ASSERT(szUser != NULL);
ASSERT(szPassword != NULL);
try
{
//<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, szDBAddr, wPort);
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return true;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
bool CDataBase::IsConnectError()
{
try
{
//״̬<D7B4>ж<EFBFBD>
if (m_DBConnection == NULL) return true;
if (m_DBConnection->GetState() == adStateClosed) return true;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool CDataBase::IsRecordsetOpened()
{
if (m_DBRecordset == NULL) return false;
if (m_DBRecordset->GetState() == adStateClosed) return false;
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
void CDataBase::MoveToNext()
{
try
{
m_DBRecordset->MoveNext();
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return;
}
//<2F>Ƶ<EFBFBD><C6B5><EFBFBD>ͷ
void CDataBase::MoveToFirst()
{
try
{
m_DBRecordset->MoveFirst();
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool CDataBase::IsRecordsetEnd()
{
try
{
return (m_DBRecordset->EndOfFile == VARIANT_TRUE);
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return true;
}
//<2F><>ȡ<EFBFBD><C8A1>Ŀ
long CDataBase::GetRecordCount()
{
try
{
if (m_DBRecordset == NULL) return 0;
return m_DBRecordset->GetRecordCount();
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return 0;
}
//<2F><>ȡ<EFBFBD><C8A1>С
long CDataBase::GetActualSize(LPCTSTR pszParamName)
{
ASSERT(pszParamName != NULL);
try
{
return m_DBRecordset->Fields->Item[pszParamName]->ActualSize;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return -1;
}
//<2F>󶨶<EFBFBD><F3B6A8B6><EFBFBD>
VOID CDataBase::BindToRecordset(CADORecordBinding * pBind)
{
ASSERT(pBind != NULL);
try
{
IADORecordBindingPtr pIBind(m_DBRecordset);
pIBind->BindToRecordset(pBind);
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
VOID 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));
}
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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) ? 2 : 0;
break;
}
case VT_I2:
case VT_UI1:
{
bValue = (BYTE)vtFld.iVal;
break;
}
case VT_NULL:
case VT_EMPTY:
{
bValue = 0;
break;
}
default:
bValue = (BYTE)vtFld.iVal;
}
return true;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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((DOUBLE)10.0, (DOUBLE)(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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue)
{
try
{
llValue = 0L;
_variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch (vtFld.vt)
{
case VT_BOOL:
{
llValue = vtFld.boolVal;
break;
}
case VT_I2:
case VT_UI1:
{
llValue = vtFld.iVal;
break;
}
case VT_I4:
{
llValue = vtFld.lVal;
break;
}
case VT_DECIMAL:
{
llValue = vtFld.decVal.Lo64;
llValue *= (vtFld.decVal.sign == 128) ? -1 : 1;
llValue = (__int64)(llValue / pow((DOUBLE)10.0, (DOUBLE)(vtFld.decVal.scale)));
break;
}
case VT_NULL:
case VT_EMPTY:
{
llValue = 0;
break;
}
default:
llValue = vtFld.llVal;
break;
}
return true;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, LPSTR szBuffer, UINT uSize)
{
try
{
_variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if (vtFld.vt == VT_BSTR)
{
lstrcpyA(szBuffer, (LPCSTR)_bstr_t(vtFld));
return true;
}
return false;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool CDataBase::GetFieldValue(LPCTSTR lpFieldName, LPWSTR szBuffer, UINT uSize)
{
try
{
_variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
if (vtFld.vt == VT_BSTR)
{
lstrcpyW(szBuffer, (LPCWSTR)_bstr_t(vtFld));
return true;
}
return false;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
bool 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 CDataBase::GetFieldValue(LPCTSTR lpFieldName, BYTE* pData, UINT& uSize)
{
try
{
_variant_t vtFld = m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
switch (vtFld.vt)
{
case VT_ARRAY|VT_UI1:
{
for (LONG i = 0;i<(LONG)uSize;i++)
{
if (FAILED(SafeArrayGetElement(vtFld.parray,&i,pData+i)))
{
uSize = i;
break;
}
}
break;
}
default:
return false;
}
return true;
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return false;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
long 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;
}
}
catch (CComError & ComError)
{
SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return 0;
}
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void 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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return;
}
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
void CDataBase::GetParameter(LPCTSTR pszParamName, CDBVarValue & DBVarValue)
{
//Ч<><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(SQLException_Syntax, GetComErrorDescribe(ComError));
}
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void 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));
}
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID CDataBase::ExecuteProcess(LPCTSTR pszSPName, bool bRecordset)
{
ASSERT(pszSPName != NULL);
try
{
//<2F>رռ<D8B1>¼<EFBFBD><C2BC>
CloseRecordset();
m_DBCommand->CommandText = pszSPName;
//ִ<><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));
}
}
catch (CComError & ComError)
{
if (IsConnectError() == true) TryConnectAgain(false, &ComError);
else SetErrorInfo(SQLException_Syntax, GetComErrorDescribe(ComError));
}
}
//ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID 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));
}
}
//<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><><EFBFBD><EFBFBD><ECBAAF>
CDataBaseEngine::CDataBaseEngine(void)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bService = false;
m_pIDataBaseEngineSinks.clear();
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDataBaseEngine::~CDataBaseEngine(void)
{
}
//<2F>ӿڲ<D3BF>ѯ
void * CDataBaseEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDataBaseEngine, Guid, dwQueryVer);
QUERYINTERFACE(IQueueServiceSink, Guid, dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDataBaseEngine, Guid, dwQueryVer);
return NULL;
}
/*
//ע<><D7A2><EFBFBD>ӿ<EFBFBD>
bool 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;
}
//ע<><D7A2><EFBFBD>ӿ<EFBFBD>
bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownEx[], WORD wSinkCount)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pIUnknownEx != NULL);
if (pIUnknownEx == NULL) return false;
for (WORD i=0;i<wSinkCount;i++)
{
if (SetDataBaseEngineSink(pIUnknownEx[i])==false)
{
return false;
}
}
return true;
}
*/
//ע<><D7A2><EFBFBD>ӿ<EFBFBD>
bool 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;
}
*/
SetDataBaseEngineSink(&pIUnknownEx, 1);
return true;
}
bool CDataBaseEngine::SetDataBaseEngineSink(IUnknownEx * pIUnknownExs[], WORD wSinkCount)
{
m_pIDataBaseEngineSinks.clear();
wSinkCount = 1;
for (WORD i = 0; i < wSinkCount; i++)
{
IUnknownEx *pIUnknownEx = pIUnknownExs[i];
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pIUnknownEx != NULL);
if (pIUnknownEx == NULL) return false;
//<2F><>ѯ<EFBFBD>ӿ<EFBFBD>
IDataBaseEngineSink * pIDataBaseEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IDataBaseEngineSink);
if (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;
}
m_pIDataBaseEngineSinks.push_back(pIDataBaseEngineSink);
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool 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_pIDataBaseEngineSinks.empty())
{
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><C3B6><EFBFBD>
if (m_QueueServiceEvent.SetQueueServiceSink(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>ʧ<EFBFBD><EFBFBD>"), TraceLevel_Exception);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_pIDataBaseEngineSinks.size(); i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pIDataBaseEngineSinks[i]->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 CDataBaseEngine::ConcludeService()
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bService = false;
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_QueueServiceEvent.SetQueueServiceSink(NULL);
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_pIDataBaseEngineSinks.size(); i++)
{
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
if (m_pIDataBaseEngineSinks[i] != NULL)
{
m_pIDataBaseEngineSinks[i]->OnDataBaseEngineConclude(QUERY_ME_INTERFACE(IUnknownEx));
}
}
m_pIDataBaseEngineSinks.clear();
m_QueueServiceEvent.SetQueueServiceSink(NULL);
return true;
}
//<2F><><EFBFBD><EFBFBD><E6B8BA>
bool CDataBaseEngine::GetBurthenInfo( tagBurthenInfo & BurthenInfo )
{
ASSERT(TRUE);ASSERT(FALSE);
return true;
}
//<2F><><EFBFBD>нӿ<D0BD>
void CDataBaseEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize)
{
//<2F>ж<EFBFBD>״̬
if (m_bService == false) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch (wIdentifier)
{
case EVENT_DATABASE:
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pBuffer != NULL);
ASSERT(wDataSize >= sizeof(NTY_DataBaseEvent));
if (wDataSize < sizeof(NTY_DataBaseEvent)) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NTY_DataBaseEvent * pDataBaseEvent = (NTY_DataBaseEvent *)pBuffer;
WORD wHandleBuffer = wDataSize - sizeof(NTY_DataBaseEvent);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_pIDataBaseEngineSinks.size(); i++)
{
ASSERT(m_pIDataBaseEngineSinks[i] != NULL);
m_pIDataBaseEngineSinks[i]->OnDataBaseEngineRequest(pDataBaseEvent->wRequestID, pDataBaseEvent->dwContextID, pDataBaseEvent + 1, wHandleBuffer);
}
return;
}
case EVENT_TIMER://ʱ<><CAB1><EFBFBD>¼<EFBFBD>
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pBuffer != NULL);
ASSERT(wDataSize >= sizeof(NTY_TimerEvent));
if (wDataSize < sizeof(NTY_TimerEvent)) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NTY_TimerEvent * pDataBaseEvent = (NTY_TimerEvent *)pBuffer;
WORD wHandleBuffer = wDataSize - sizeof(NTY_TimerEvent);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_pIDataBaseEngineSinks.size(); i++)
{
ASSERT(m_pIDataBaseEngineSinks[i] != NULL);
m_pIDataBaseEngineSinks[i]->OnDataBaseEngineTimer(pDataBaseEvent->dwTimerID, pDataBaseEvent->dwBindParameter);
}
return;
}
case EVENT_CONTROL://<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pBuffer != NULL);
ASSERT(wDataSize >= sizeof(NTY_ControlEvent));
if (wDataSize < sizeof(NTY_ControlEvent)) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NTY_ControlEvent * pDataBaseEvent = (NTY_ControlEvent *)pBuffer;
WORD wHandleBuffer = wDataSize - sizeof(NTY_ControlEvent);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (WORD i = 0; i < m_pIDataBaseEngineSinks.size(); i++)
{
ASSERT(m_pIDataBaseEngineSinks[i] != NULL);
m_pIDataBaseEngineSinks[i]->OnDataBaseEngineControl(pDataBaseEvent->wControlID, pDataBaseEvent + 1, wHandleBuffer);
}
return;
}
default:
{
ASSERT(false);
}
}
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool CDataBaseEngine::PostDataBaseControl(WORD wControlID, VOID * pData, WORD wDataSize)
{
return m_QueueServiceEvent.PostControlEvent(wControlID, pData, wDataSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool CDataBaseEngine::PostDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
{
return m_QueueServiceEvent.PostDataBaseEvent(wRequestID, dwContextID, pData, wDataSize);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CDataBaseEngine::DeferDataBaseRequest(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
{
ASSERT(FALSE);
return false;
}
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern "C" __declspec(dllexport) void * 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 * 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;
}
//////////////////////////////////////////////////////////////////////////