2096 lines
46 KiB
C++
2096 lines
46 KiB
C++
|
|
#include "stdafx.h"
|
|
#include "AdoLib.h"
|
|
#include "AdoException.h"
|
|
#include "AdodbImpl.h"
|
|
|
|
using namespace AdoLib;
|
|
|
|
// »ý¼ºÀÚ
|
|
CAdoDBImpl::CAdoDBImpl()
|
|
: m_fnExceptionLog(NULL),
|
|
m_RecordsetPtr(NULL),
|
|
m_lTimeOut(0)
|
|
{
|
|
}
|
|
|
|
CAdoDBImpl::~CAdoDBImpl()
|
|
{
|
|
ReleaseRecordset();
|
|
}
|
|
|
|
// Release Recordset
|
|
bool CAdoDBImpl::ReleaseRecordset()
|
|
{
|
|
try
|
|
{
|
|
if(NULL != m_RecordsetPtr)
|
|
{
|
|
m_RecordsetPtr.Release();
|
|
m_RecordsetPtr = NULL;
|
|
}
|
|
|
|
m_strLastError.clear();
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Set Callback function ExceptionLog
|
|
void CAdoDBImpl::SetCallbackExceptionLog(FN_CALLBACL_ADO_EXCEPTION_LOG fnExceptionLog)
|
|
{
|
|
m_fnExceptionLog = fnExceptionLog;
|
|
}
|
|
|
|
// Set Connection Info - connection string
|
|
bool CAdoDBImpl::SetConnectionInfo(char* szConnection, long lTimeOut, bool bNowConnect)
|
|
{
|
|
try
|
|
{
|
|
m_lTimeOut = lTimeOut;
|
|
m_CAdoConnection.SetConnectionInfo(szConnection, lTimeOut, bNowConnect);
|
|
|
|
m_strLastError.clear();
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Set Connection Info - data
|
|
bool CAdoDBImpl::SetConnectionInfo(char* strIP,
|
|
UINT nPortNum,
|
|
char* szDbName,
|
|
char* szID,
|
|
char* szPwd,
|
|
long lTimeOut,
|
|
bool bNowConnect)
|
|
{
|
|
try
|
|
{
|
|
m_lTimeOut = lTimeOut;
|
|
m_CAdoConnection.SetConnectionInfo(strIP, nPortNum, szDbName, szID, szPwd, lTimeOut, bNowConnect);
|
|
|
|
m_strLastError.clear();
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Set Commond
|
|
bool CAdoDBImpl::SetCommond(std::string strQuery)
|
|
{
|
|
try
|
|
{
|
|
if(!ReleaseRecordset()) { return false; }
|
|
if(!m_CAdoConnection.ConnectDBMS()) { return false; }
|
|
|
|
m_strLastError.clear();
|
|
return m_CAdoCommand.SetCommand(m_CAdoConnection.GetConnectionPtr(), strQuery, m_lTimeOut);
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Execute - not Record set
|
|
bool CAdoDBImpl::Execute()
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
return m_CAdoCommand.Execute();
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
|
|
m_CAdoConnection.DisconnectDBMS();
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Execute - return Record set
|
|
bool CAdoDBImpl::ExecuteEx()
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
return m_CAdoCommand.Execute(m_RecordsetPtr);
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
|
|
m_CAdoConnection.DisconnectDBMS();
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Set Input Output Bind Param - total : Exception ó¸®
|
|
//-----------------------------------------------------------------------------
|
|
bool CAdoDBImpl::BindParam(const char* szName,
|
|
_variant_t& nValue,
|
|
ADODB::DataTypeEnum eType,
|
|
ADODB::ParameterDirectionEnum eDirection,
|
|
DWORD dwSize)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
return m_CAdoCommand.BindParam(szName, nValue, eType, eDirection, dwSize);
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Set Input Param
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// unsigned __int64
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, unsigned __int64& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adBigInt, ADODB::adParamInput, sizeof(unsigned __int64));
|
|
}
|
|
|
|
// unsigned int
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, unsigned int& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamInput, sizeof(unsigned int));
|
|
}
|
|
|
|
// unsigned long
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, unsigned long& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamInput, sizeof(unsigned long));
|
|
}
|
|
|
|
// unsigned short
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, unsigned short& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adSmallInt, ADODB::adParamInput, sizeof(unsigned short));
|
|
}
|
|
|
|
// __int64
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, __int64& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adBigInt, ADODB::adParamInput, sizeof(__int64));
|
|
}
|
|
|
|
// int
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, int& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamInput, sizeof(int));
|
|
}
|
|
|
|
// long
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, long& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamInput, sizeof(long));
|
|
}
|
|
|
|
// short
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, short& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adSmallInt, ADODB::adParamInput, sizeof(short));
|
|
}
|
|
|
|
// BYTE
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, BYTE& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adTinyInt, ADODB::adParamInput, sizeof(BYTE));
|
|
}
|
|
|
|
// bool
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, bool& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adBoolean, ADODB::adParamInput, sizeof(bool));
|
|
}
|
|
|
|
// double
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, double& nValue)
|
|
{
|
|
_variant_t varValue = nValue;
|
|
return BindParam(szName, varValue, ADODB::adDouble, ADODB::adParamInput, sizeof(double));
|
|
}
|
|
|
|
// tm
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, tm& nValue)
|
|
{
|
|
SYSTEMTIME tmpValue = {0};
|
|
|
|
tmpValue.wYear = nValue.tm_year + 1900;
|
|
tmpValue.wMonth = nValue.tm_mon + 1;
|
|
tmpValue.wDayOfWeek = nValue.tm_wday;
|
|
tmpValue.wDay = nValue.tm_mday;
|
|
tmpValue.wHour = nValue.tm_hour;
|
|
tmpValue.wMinute = nValue.tm_min;
|
|
tmpValue.wSecond = nValue.tm_sec;
|
|
tmpValue.wMilliseconds = 0;
|
|
|
|
return SetInputParam(szName, tmpValue);
|
|
}
|
|
|
|
// SYSTEMTIME
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, SYSTEMTIME& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
varValue.vt = VT_DATE;
|
|
|
|
if(!SystemTimeToVariantTime(&nValue, &varValue.date)) { return false; }
|
|
|
|
return BindParam(szName, varValue, ADODB::adDate, ADODB::adParamInput, sizeof(double));
|
|
}
|
|
|
|
// char
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, char& nValue)
|
|
{
|
|
std::string strValue;
|
|
strValue = nValue;
|
|
|
|
return SetInputParam(szName, strValue);
|
|
}
|
|
|
|
// WCHAR
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, WCHAR& nValue)
|
|
{
|
|
std::wstring strValue;
|
|
strValue = nValue;
|
|
|
|
return SetInputParam(szName, strValue);
|
|
}
|
|
|
|
// char*
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, std::string nValue)
|
|
{
|
|
_variant_t varValue = ConvertSafeSQLString(nValue).c_str();
|
|
|
|
DWORD dwLength = (DWORD)nValue.length();
|
|
if(nValue.empty())
|
|
{
|
|
varValue.vt = VT_NULL;
|
|
dwLength = 1;
|
|
}
|
|
|
|
return BindParam(szName, varValue, ADODB::adVarChar, ADODB::adParamInput, sizeof(char) * dwLength);
|
|
}
|
|
|
|
// WCHAR*
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, std::wstring nValue)
|
|
{
|
|
_variant_t varValue = ConvertSafeSQLString(nValue).c_str();
|
|
|
|
DWORD dwLength = (DWORD)nValue.length();
|
|
if(nValue.empty())
|
|
{
|
|
varValue.vt = VT_NULL;
|
|
dwLength = 1;
|
|
}
|
|
|
|
return BindParam(szName, varValue, ADODB::adVarWChar, ADODB::adParamInput, sizeof(WCHAR) * dwLength);
|
|
}
|
|
|
|
// Binary
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, BYTE* nValue, DWORD dwSize)
|
|
{
|
|
_variant_t varValue;
|
|
|
|
if(!BytesToVariantArray(nValue, dwSize, &varValue)) { return false; }
|
|
|
|
bool bResult = BindParam(szName, varValue, ADODB::adBinary, ADODB::adParamInput, dwSize);
|
|
|
|
VariantClear(&varValue);
|
|
|
|
return bResult;
|
|
}
|
|
|
|
// variant
|
|
bool CAdoDBImpl::SetInputParam(const char* szName, _variant_t& nValue, ADODB::DataTypeEnum eType, DWORD dwSize)
|
|
{
|
|
return BindParam(szName, nValue, eType, ADODB::adParamInput, dwSize);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Set Output Param
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// unsigned __int64
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, unsigned __int64& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adBigInt, ADODB::adParamOutput, sizeof(unsigned __int64));
|
|
}
|
|
|
|
// unsigned int
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, unsigned int& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamOutput, sizeof(unsigned int));
|
|
}
|
|
|
|
// unsigned long
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, unsigned long& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamOutput, sizeof(unsigned long));
|
|
}
|
|
|
|
// unsigned short
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, unsigned short& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adSmallInt, ADODB::adParamOutput, sizeof(unsigned short));
|
|
}
|
|
|
|
// __int64
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, __int64& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adBigInt, ADODB::adParamOutput, sizeof(__int64));
|
|
}
|
|
|
|
// int
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, int& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamOutput, sizeof(int));
|
|
}
|
|
|
|
// long
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, long& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adInteger, ADODB::adParamOutput, sizeof(long));
|
|
}
|
|
|
|
// short
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, short& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adSmallInt, ADODB::adParamOutput, sizeof(short));
|
|
}
|
|
|
|
// BYTE
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, BYTE& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adTinyInt, ADODB::adParamOutput, sizeof(BYTE));
|
|
}
|
|
|
|
// bool
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, bool& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adBoolean, ADODB::adParamOutput, sizeof(bool));
|
|
}
|
|
|
|
// double
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, double& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adDouble, ADODB::adParamOutput, sizeof(double));
|
|
}
|
|
|
|
// tm
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, tm& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adDate, ADODB::adParamOutput, sizeof(double));
|
|
}
|
|
|
|
// SYSTEMTIME
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, SYSTEMTIME& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adDate, ADODB::adParamOutput, sizeof(double));
|
|
}
|
|
|
|
// char
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, char& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adChar, ADODB::adParamOutput, sizeof(char));
|
|
}
|
|
|
|
// WCHAR
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, WCHAR& nValue)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adWChar, ADODB::adParamOutput, sizeof(WCHAR));
|
|
}
|
|
|
|
// char*
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, std::string nValue, DWORD dwLength)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adVarChar, ADODB::adParamOutput, sizeof(char) * dwLength);
|
|
}
|
|
|
|
// WCHAR*
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, std::wstring nValue, DWORD dwLength)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adVarWChar, ADODB::adParamOutput, sizeof(WCHAR) * dwLength);
|
|
}
|
|
|
|
// Binary
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, BYTE* nValue, DWORD dwSize)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, ADODB::adBinary, ADODB::adParamOutput, dwSize);
|
|
}
|
|
|
|
// variant
|
|
bool CAdoDBImpl::SetOutputParam(const char* szName, ADODB::DataTypeEnum eType, DWORD dwSize)
|
|
{
|
|
_variant_t varValue;
|
|
return BindParam(szName, varValue, eType, ADODB::adParamOutput, dwSize);
|
|
}
|
|
|
|
// Set Param : in out param ¼³Á¤
|
|
bool CAdoDBImpl::SetParam(const char* szName,
|
|
_variant_t& nValue,
|
|
ADODB::DataTypeEnum eType,
|
|
ADODB::ParameterDirectionEnum eDirection,
|
|
DWORD dwSize)
|
|
{
|
|
return BindParam(szName, nValue, eType, eDirection, dwSize);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Get Param Value
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// unsigned __int64
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, unsigned __int64& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned __int64)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned int
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, unsigned int& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned int)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned long
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, unsigned long& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned long)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned short
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, unsigned short& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned short)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// __int64
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, __int64& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (__int64)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// int
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, int& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (int)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// long
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, long& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (long)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// short
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, short& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (short)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// BYTE
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, BYTE& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (BYTE)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// bool
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, bool& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT:
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// double
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, double& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (double)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// tm
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, tm& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
ZeroMemory(&nValue, sizeof(tm));
|
|
|
|
SYSTEMTIME tmpValue;
|
|
if(!GetParamValue(szName, tmpValue)) return false;
|
|
|
|
nValue.tm_year = tmpValue.wYear - 1900;
|
|
nValue.tm_mon = tmpValue.wMonth - 1;
|
|
nValue.tm_wday = tmpValue.wDayOfWeek;
|
|
nValue.tm_mday = tmpValue.wDay;
|
|
nValue.tm_yday = (int)wce_getYdayFromSYSTEMTIME(&tmpValue);
|
|
nValue.tm_hour = tmpValue.wHour;
|
|
nValue.tm_min = tmpValue.wMinute;
|
|
nValue.tm_sec = tmpValue.wSecond;
|
|
nValue.tm_isdst = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// SYSTEMTIME
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, SYSTEMTIME& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
ZeroMemory(&nValue, sizeof(SYSTEMTIME));
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
if(VT_EMPTY != varValue.vt && VT_NULL != varValue.vt)
|
|
{
|
|
if(!VariantTimeToSystemTime(varValue.date, &nValue))
|
|
{
|
|
ZeroMemory(&nValue, sizeof(SYSTEMTIME));
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// char
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, char& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
nValue = (char)varValue.bstrVal[0];
|
|
else
|
|
nValue = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// WCHAR
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, WCHAR& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
nValue = varValue.bstrVal[0];
|
|
else
|
|
nValue = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// char*
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, char* nValue, DWORD dwLength)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
{
|
|
_bstr_t bstrVal(varValue.bstrVal);
|
|
|
|
if(dwLength)
|
|
strncpy(nValue, bstrVal, dwLength);
|
|
else
|
|
strcpy(nValue, bstrVal);
|
|
}
|
|
else
|
|
{
|
|
nValue[0] = 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// WCHAR*
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, WCHAR* nValue, DWORD dwLength)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
{
|
|
_bstr_t bstrVal(varValue.bstrVal);
|
|
|
|
if(dwLength)
|
|
wcsncpy(nValue, bstrVal, dwLength);
|
|
else
|
|
wcscpy(nValue, bstrVal);
|
|
}
|
|
else
|
|
{
|
|
nValue[0] = 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Binary
|
|
bool CAdoDBImpl::GetParamValue(const char* szName, BYTE* nValue, DWORD dwSize)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
|
|
_variant_t varValue;
|
|
m_CAdoCommand.GetParamValue(szName, varValue);
|
|
|
|
DWORD Size = dwSize;
|
|
if(!VariantArrayToBytes(varValue, nValue, &Size))
|
|
{
|
|
ZeroMemory(nValue, dwSize);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(CAdoException& e)
|
|
{
|
|
if(m_fnExceptionLog) m_fnExceptionLog(e.toString().c_str());
|
|
m_strLastError = e.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Get Field Value
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CAdoDBImpl::GetFirstFieldValue(int& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
if(1 > GetRecordCount()) { return false; }
|
|
if(1 > m_RecordsetPtr->Fields->Count) { return false; }
|
|
|
|
_variant_t index = (short)0;
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(&index)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (int)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetReturnValue (int)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned __int64
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, unsigned __int64& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned __int64)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (unsigned __int64)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned int
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, unsigned int& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned int)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (unsigned int)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned long
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, unsigned long& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned long)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (unsigned long)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// unsigned short
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, unsigned short& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (unsigned short)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (unsigned short)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// __int64
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, __int64& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (__int64)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (__int64)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// int
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, int& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (int)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (int)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// long
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, long& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (long)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (long)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// short
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, short& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (short)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (short)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// BYTE
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, BYTE& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (BYTE)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (BYTE)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// bool
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, bool& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT:
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = 0; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (bool)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// double
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, double& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
switch(varValue.vt)
|
|
{
|
|
case VT_I2:
|
|
case VT_I4:
|
|
case VT_R4:
|
|
case VT_R8:
|
|
case VT_CY:
|
|
case VT_DECIMAL:
|
|
case VT_I1:
|
|
case VT_UI1:
|
|
case VT_UI2:
|
|
case VT_UI4:
|
|
case VT_I8:
|
|
case VT_UI8:
|
|
case VT_INT:
|
|
case VT_UINT: nValue = (double)varValue; break;
|
|
case VT_BOOL: nValue = ((bool)varValue) ? 1 : 0; break;
|
|
default : nValue = -1; break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (double)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// tm
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, tm& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
ZeroMemory(&nValue, sizeof(tm));
|
|
|
|
SYSTEMTIME tmpValue;
|
|
if(!GetFieldValue(szName, tmpValue)) return false;
|
|
|
|
nValue.tm_year = tmpValue.wYear - 1900;
|
|
nValue.tm_mon = tmpValue.wMonth - 1;
|
|
nValue.tm_wday = tmpValue.wDayOfWeek;
|
|
nValue.tm_mday = tmpValue.wDay;
|
|
nValue.tm_yday = (int)wce_getYdayFromSYSTEMTIME(&tmpValue);
|
|
nValue.tm_hour = tmpValue.wHour;
|
|
nValue.tm_min = tmpValue.wMinute;
|
|
nValue.tm_sec = tmpValue.wSecond;
|
|
nValue.tm_isdst = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (tm)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// SYSTEMTIME
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, SYSTEMTIME& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
ZeroMemory(&nValue, sizeof(SYSTEMTIME));
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
if(VT_EMPTY != varValue.vt && VT_NULL != varValue.vt)
|
|
{
|
|
if(!VariantTimeToSystemTime(varValue.date, &nValue))
|
|
{
|
|
ZeroMemory(&nValue, sizeof(SYSTEMTIME));
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (SYSTEMTIME)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// char
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, char& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
nValue = (char)varValue.bstrVal[0];
|
|
else
|
|
nValue = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (char)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// WCHAR
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, WCHAR& nValue)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
nValue = varValue.bstrVal[0];
|
|
else
|
|
nValue = 0;
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (WCHAR)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// char*
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, char* nValue, DWORD dwLength)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
{
|
|
_bstr_t bstrVal(varValue.bstrVal);
|
|
|
|
if(dwLength)
|
|
strncpy(nValue, bstrVal, dwLength);
|
|
else
|
|
strcpy(nValue, bstrVal);
|
|
}
|
|
else
|
|
{
|
|
nValue[0] = 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (char*)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// WCHAR*
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, WCHAR* nValue, DWORD dwLength)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
if(VT_BSTR == varValue.vt)
|
|
{
|
|
_bstr_t bstrVal(varValue.bstrVal);
|
|
|
|
if(dwLength)
|
|
wcsncpy(nValue, bstrVal, dwLength);
|
|
else
|
|
wcscpy(nValue, bstrVal);
|
|
}
|
|
else
|
|
{
|
|
nValue[0] = 0;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (WCHAR*)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Binary
|
|
bool CAdoDBImpl::GetFieldValue(const char* szName, BYTE* nValue, DWORD dwSize)
|
|
{
|
|
try
|
|
{
|
|
m_strLastError.clear();
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
|
|
_variant_t varValue;
|
|
varValue = m_RecordsetPtr->Fields->GetItem(szName)->GetValue();
|
|
|
|
DWORD Size = dwSize;
|
|
if(!VariantArrayToBytes(varValue, nValue, &Size))
|
|
{
|
|
ZeroMemory(nValue, dwSize);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetFieldValue (Binary)");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
m_strLastError = ex.toString().c_str();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------//
|
|
// Move Recode
|
|
//---------------------------------------------------------------------------//
|
|
int CAdoDBImpl::GetRecordCount()
|
|
{
|
|
try
|
|
{
|
|
if(NULL == m_RecordsetPtr) { return 0; }
|
|
return m_RecordsetPtr->RecordCount;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::GetRecordCount");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool CAdoDBImpl::FirstRecord()
|
|
{
|
|
try
|
|
{
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
m_RecordsetPtr->MoveFirst();
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::FirstRecord");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool CAdoDBImpl::NextRecord()
|
|
{
|
|
try
|
|
{
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
m_RecordsetPtr->MoveNext();
|
|
if(m_RecordsetPtr->EndOfFile) { return false; }
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::NextRecord");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool CAdoDBImpl::NextRecordSet()
|
|
{
|
|
try
|
|
{
|
|
if(NULL == m_RecordsetPtr) { return false; }
|
|
m_RecordsetPtr = m_RecordsetPtr->NextRecordset(NULL);
|
|
return true;
|
|
}
|
|
catch(_com_error& e)
|
|
{
|
|
CAdoException ex(e.ErrorMessage(), e.Error(), (char*)e.Description(), (char*)e.Source(), "CAdoDBImpl::NextRecordSet");
|
|
if(m_fnExceptionLog) m_fnExceptionLog(ex.toString().c_str());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------//
|
|
// time utility
|
|
//---------------------------------------------------------------------------//
|
|
FILETIME CAdoDBImpl::wce_getFILETIMEFromYear(WORD year)
|
|
{
|
|
SYSTEMTIME s = {0};
|
|
FILETIME f;
|
|
|
|
s.wYear = year;
|
|
s.wMonth = 1;
|
|
s.wDayOfWeek = 1;
|
|
s.wDay = 1;
|
|
|
|
SystemTimeToFileTime( &s, &f );
|
|
return f;
|
|
}
|
|
|
|
// __int64 <--> FILETIME
|
|
__int64 CAdoDBImpl::wce_FILETIME2int64(FILETIME f)
|
|
{
|
|
__int64 t;
|
|
|
|
t = f.dwHighDateTime;
|
|
t <<= 32;
|
|
t |= f.dwLowDateTime;
|
|
return t;
|
|
}
|
|
|
|
time_t CAdoDBImpl::wce_getYdayFromSYSTEMTIME(const SYSTEMTIME* s)
|
|
{
|
|
__int64 t;
|
|
FILETIME f1, f2;
|
|
|
|
f1 = wce_getFILETIMEFromYear(s->wYear);
|
|
SystemTimeToFileTime(s, &f2);
|
|
|
|
t = wce_FILETIME2int64(f2)-wce_FILETIME2int64(f1);
|
|
|
|
return (time_t)((t/10000000)/(60*60*24));
|
|
}
|
|
|
|
//---------------------------------------------------------------------------//
|
|
// VariantArray <-> Bytes
|
|
//---------------------------------------------------------------------------//
|
|
|
|
// VariantArray -> Bytes
|
|
bool CAdoDBImpl::VariantArrayToBytes(VARIANT Variant, // in
|
|
BYTE *pBytes, // out
|
|
DWORD *pdwBytes) // size
|
|
{
|
|
if(!(Variant.vt & VT_ARRAY) ||
|
|
!Variant.parray ||
|
|
!pBytes ||
|
|
!pdwBytes)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
SAFEARRAY *pArrayVal = NULL;
|
|
CHAR HUGEP *pArray = NULL;
|
|
|
|
pArrayVal = Variant.parray;
|
|
DWORD dwBytes = pArrayVal->rgsabound[0].cElements;
|
|
|
|
if(*pdwBytes < dwBytes) { return false; }
|
|
*pdwBytes = 0;
|
|
|
|
if(!SUCCEEDED(SafeArrayAccessData(pArrayVal, (void HUGEP * FAR *) &pArray)))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
memcpy(pBytes, pArray, dwBytes);
|
|
SafeArrayUnaccessData(pArrayVal);
|
|
*pdwBytes = dwBytes;
|
|
|
|
return true;
|
|
}
|
|
|
|
// Bytes -> VariantArray
|
|
bool CAdoDBImpl::BytesToVariantArray(BYTE *pValue, // in
|
|
DWORD cValueElements, // size
|
|
VARIANT *pVariant) // out - »ç¿ë ÈÄ VariantClear(&var); ÇØ¾ßÇÑ´Ù!!
|
|
{
|
|
SAFEARRAY *pArrayVal = NULL;
|
|
SAFEARRAYBOUND arrayBound;
|
|
CHAR HUGEP *pArray = NULL;
|
|
|
|
arrayBound.lLbound = 0;
|
|
arrayBound.cElements = cValueElements;
|
|
|
|
pArrayVal = SafeArrayCreate(VT_UI1, 1, &arrayBound);
|
|
if (pArrayVal == NULL) { return false; }
|
|
|
|
if (!SUCCEEDED(SafeArrayAccessData(pArrayVal, (void HUGEP* FAR*)&pArray)))
|
|
{
|
|
if (pArrayVal) { SafeArrayDestroy(pArrayVal); }
|
|
return false;
|
|
}
|
|
|
|
memcpy( pArray, pValue, arrayBound.cElements );
|
|
SafeArrayUnaccessData( pArrayVal );
|
|
|
|
V_VT(pVariant) = VT_ARRAY | VT_UI1;
|
|
V_ARRAY(pVariant) = pArrayVal;
|
|
|
|
return true;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------//
|
|
// Convert Safe SQL String
|
|
//---------------------------------------------------------------------------//
|
|
|
|
std::wstring CAdoDBImpl::ConvertSafeSQLString(std::wstring str)
|
|
{
|
|
std::wstring strSafe = str.c_str();
|
|
|
|
std::wstring::size_type Index = 0;
|
|
|
|
while(true)
|
|
{
|
|
Index = strSafe.find(L"'", Index);
|
|
if(std::wstring::npos == Index) break;
|
|
strSafe.replace(Index, 1, L"''");
|
|
Index += 2;
|
|
}
|
|
|
|
return strSafe;
|
|
}
|
|
|
|
std::string CAdoDBImpl::ConvertSafeSQLString(std::string str)
|
|
{
|
|
std::string strSafe = str.c_str();
|
|
|
|
std::string::size_type Index = 0;
|
|
|
|
while(true)
|
|
{
|
|
Index = strSafe.find("'", Index);
|
|
if(std::wstring::npos == Index) break;
|
|
strSafe.replace(Index, 1, "''");
|
|
Index += 2;
|
|
}
|
|
|
|
return strSafe;
|
|
}
|
|
|
|
std::string CAdoDBImpl::GetAdoLastError()
|
|
{
|
|
return m_strLastError;
|
|
}
|