1258 lines
26 KiB
C++
1258 lines
26 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|