#include "StdAfx.h"
#include "AdoImpl.h"

AdoImpl::AdoImpl(void)
{
	m_pADODatabase = NULL;
	memset(m_szConnectString, 0, 1024);
	InitializeCriticalSection(&m_csAdo);
}

AdoImpl::~AdoImpl(void)
{
	DeleteCriticalSection(&m_csAdo);
}

void AdoImpl::SetConnectString(
							   IN const int &nType, 
							   IN LPCTSTR lpDataSource, 
							   IN LPCTSTR lpDatabaseTCPPort, 
							   IN LPCTSTR lpDatabaseAccount, 
							   IN LPCTSTR lpDatabasePassWord, 
							   IN LPCTSTR lpDatabaseName, 
							   IN LPCTSTR lpDatabaseFile)
{
	switch (nType)
	{
	case ADO_ACCESS97:
		_stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=%s"), lpDatabaseFile);
		break;
	case ADO_ACCESS2000:
		_stprintf_s(m_szConnectString, _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), lpDatabaseFile);
		break;
	case ADO_ACCESS2007:
		_stprintf_s(m_szConnectString, _T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s"), lpDatabaseFile);
		break;
	case ADO_SQLSERVER:
		{
			if ( !_tcsicmp(lpDatabaseTCPPort, _T("0")))
			{
				//sprintf(m_szConnectString, "Provider=sqloledb.1;Persist Security Info=false;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s; ",
				_stprintf_s(m_szConnectString, _T("Provider=sqloledb;Data Source=%s;Initial Catalog=%s;User Id=%s;Password=%s; "),
					lpDataSource,			// IP��ַ���������;
					lpDatabaseName, 
					lpDatabaseAccount,
					lpDatabasePassWord);
			}
			else
			{
				//sprintf(m_szConnectString, "Provider=sqloledb.1;Persist Security Info=false;Data Source=%s,%s;Initial Catalog=%s;User Id=%s;Password=%s; ",
				_stprintf_s(m_szConnectString, _T("Provider=sqloledb;Data Source=%s,%s;Initial Catalog=%s;User Id=%s;Password=%s; "),
					lpDataSource,			// IP��ַ���������;
					lpDatabaseTCPPort, 
					lpDatabaseName, 
					lpDatabaseAccount,
					lpDatabasePassWord);
			}
		}
		break;
	case ADO_PGSQL:
		{
			_stprintf_s(m_szConnectString, _T("DRIVER={PostgreSQL ODBC Driver(UNICODE)}; SERVER=%s; port=%s; DATABASE=%s; UID=%s; PWD=%s;"),
				lpDataSource,			// IP��ַ���������;
				lpDatabaseTCPPort, 
				lpDatabaseName, 
				lpDatabaseAccount,
				lpDatabasePassWord);
		}
		break;
	default:
		break;
	}
}

BOOL AdoImpl::IsOpen()
{
	if ( m_pADODatabase == NULL)
		return FALSE;

	return m_pADODatabase->IsOpen();
}

BOOL AdoImpl::Opendatabase(IN LPCTSTR lpConnectString /* = NULL */)
{
	BOOL bResult = FALSE;
	if( NULL == m_pADODatabase )
	{
		m_pADODatabase = new CADODatabase();
		if( m_pADODatabase )
		{
			if( lpConnectString == NULL )
			{
				m_pADODatabase->SetConnectionString(m_szConnectString);
			}
			else
			{
				m_pADODatabase->SetConnectionString(lpConnectString);
				_tcscpy_s(m_szConnectString, lpConnectString);
			}

			if( TRUE == m_pADODatabase->Open() )
			{
				bResult = TRUE;
			}
			else
			{
				if( m_pADODatabase->IsOpen() )
				{
					m_pADODatabase->Close();
				}

				delete m_pADODatabase;
				m_pADODatabase = NULL;
			}
		}
	}

	return bResult;
}

void AdoImpl::Closedatabase()
{
	if( NULL != m_pADODatabase )
	{
		if( m_pADODatabase->IsOpen() )
		{
			m_pADODatabase->Close();
		}

		if( m_pADODatabase )
			delete m_pADODatabase;
		m_pADODatabase = NULL;
	}
}

int AdoImpl::Execute(IN LPCTSTR lpSQL)
{
	INT nRetCode = 0;

	if( NULL == m_pADODatabase )
	{
		return -1;
	}

	EnterCriticalSection(&m_csAdo);
	if ( m_pADODatabase->IsOpen() )
	{
		nRetCode = m_pADODatabase->Execute(lpSQL);
		LeaveCriticalSection(&m_csAdo);
	}
	else
	{
		LeaveCriticalSection(&m_csAdo);
		return -1;
	}

	return nRetCode;
}

void AdoImpl::DeleteADORecordSet(IN CADORecordset* pRSet)
{
	CloseADORecordSet(pRSet);

	if( pRSet )
	{
		delete pRSet;
		pRSet = NULL;
	}
}

BOOL AdoImpl::OpenADORecordSet(IN CADORecordset *pRSet, IN LPCTSTR lpSQL, IN const int& nCursorLocation)
{
	BOOL bResult = TRUE;
	if( NULL == pRSet ) return FALSE;
	if ( !pRSet->Open(lpSQL, nCursorLocation))
	{
		DeleteADORecordSet(pRSet);
		bResult = FALSE;
	}

	return bResult;
}

void AdoImpl::CloseADORecordSet(IN CADORecordset* pRSet)
{
	if( NULL != pRSet )
	{
		if( pRSet->IsOpen() )
		{
			pRSet->Close();
		}
	}
}

bool AdoImpl::GetADODateBaseStatus()
{
	if( NULL == m_pADODatabase || !m_pADODatabase->IsOpen()) 
		return false;

	return true;
}

DWORD AdoImpl::GetTableRecordCount(IN LPCTSTR lpTableName, IN LPCTSTR lpFilters)
{
	if ( lpTableName == NULL)
		return -1;

	TCHAR szSQL[1024] = _T("");
	if(lpFilters == NULL || _tcscmp(lpFilters,_T("")) == 0)
		_stprintf_s(szSQL,_T("select count(*) as cot from %s"),lpTableName);
	else
		_stprintf_s(szSQL,_T("select count(*) as cot from %s where %s"),lpTableName,lpFilters);

	DWORD nRecordCount = 0;			
	_variant_t vtFieldValue;

	BOOL bResult = FALSE;
	//AutoThreadSection aSection(&s_critSection);
	EnterCriticalSection(&m_csAdo);
	bResult = GetADODateBaseStatus();
	if( FALSE == bResult )
	{
		LeaveCriticalSection(&m_csAdo);
		return -1;
	}

	CADORecordset* pRSet = new CADORecordset(m_pADODatabase);
	if( NULL == pRSet )
	{
		LeaveCriticalSection(&m_csAdo);
		return -1;
	}


	bResult = OpenADORecordSet(pRSet, szSQL);
	if( FALSE == bResult )
	{
		LeaveCriticalSection(&m_csAdo);
		return -1;
	}


	if( !pRSet->IsFieldNull(_T("cot")) )
	{
		pRSet->GetFieldValue(_T("cot"), nRecordCount);
	}
	else
	{
		nRecordCount = -1;
	}// end if( !pRSet->IsFieldNull(0) )

	DeleteADORecordSet(pRSet);
	LeaveCriticalSection(&m_csAdo);

	return nRecordCount;
}

/************************************************************************/
/*  ������GetFieldValueList[4/12/2016 IT];
/*  ��������ȡָ������ѯ�ֶε�������¼��;
/*  ������;
/*  	[IN] lpTableName��Ҫ��ѯ�ı�;
/*  	[IN] lpFields��Ҫ��ѯ���ֶ�;
/*  	[IN] lpFilters����ѯ������;
/*  	[IN] dwCallBackType���ص���������;
/*  	[IN] lpCallBack���ص�����ָ��;
/*  	[INOUT] lpParamter�����ݸ��ص������IJ���;
/*  ���أ��ɹ���ѯ���ؼ�¼��, �������󷵻�-1;
/*  ע�⣺��ʹ��select count(*) as cot from table����ȡ��¼��;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
int AdoImpl::GetFieldValueList(IN LPCTSTR lpTableName, IN LPCTSTR lpFields, IN LPCTSTR lpFilters, IN const DWORD &dwCallBackType, IN LPVOID lpCallBack, IN OUT LPVOID lpParamter)
{
	if ( lpCallBack == NULL || lpParamter == NULL )
		return -1;

	if ( lpTableName == NULL || lpTableName[0] == _T('\0') || lpFields == NULL || lpFields[0] == _T('\0'))
		return -1;

	int nRecordCount = 0;			
	BOOL bResult = FALSE;
	TCHAR szSQL[2048] = _T("");		// ���ȿ��ܻ᲻��,_stprintf_s�������SQL��䲻��ȷ;

	EnterCriticalSection( &m_csAdo );
	bResult = GetADODateBaseStatus();
	if( FALSE == bResult ){
		LeaveCriticalSection( &m_csAdo );
		return -1;
	}

	// ��ȡ��ѯ��¼��;
	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection( &m_csAdo );
	if( NULL == pRSet )
		return -1;

	if ( lpFilters && lpFilters[0] != _T('\0') )
		_stprintf_s(szSQL, _T("select %s from %s where %s"), lpFields, lpTableName, lpFilters);
	else
		_stprintf_s(szSQL, _T("select %s from %s"), lpFields, lpTableName);

	bResult = OpenADORecordSet(pRSet, szSQL);
	if( FALSE == bResult )
	{
		return -1;
	}

	// �ûص������������ص����ݼ����;
	nRecordCount = ((RecordsetCallback)lpCallBack)(dwCallBackType, lpParamter, 0, pRSet);

	DeleteADORecordSet(pRSet);

	return nRecordCount;
}

/************************************************************************/
/*  ������GetFieldValueList[4/12/2016 IT];
/*  ��������ȡָ������ѯ�ֶε�������¼��;
/*  ������;
/*  	[IN] lpTableName��Ҫ��ѯ�ı�;
/*  	[IN] lpFields��Ҫ��ѯ���ֶ�;
/*  	[IN] lpFilters����ѯ������;
/*  	[IN] dwCallBackType���ص���������;
/*  	[IN] lpCallBack���ص�����ָ��;
/*  	[INOUT] lpParamter�����ݸ��ص������IJ���;
/*  ���أ��ɹ���ѯ���ؼ�¼��, �������󷵻�-1;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
int AdoImpl::GetFieldValueListEx(IN LPCTSTR lpTableName, IN LPCTSTR lpFields, IN LPCTSTR lpFilters, IN const DWORD &dwCallBackType, IN LPVOID lpCallBack, IN OUT LPVOID lpParamter)
{
	if ( lpCallBack == NULL || lpParamter == NULL )
		return -1;

	if ( lpTableName == NULL || lpTableName[0] == _T('\0') || lpFields == NULL || lpFields[0] == _T('\0'))
		return -1;

	int nRecordCount = 0;			
	BOOL bResult = FALSE;
	TCHAR szSQL[2048] = _T("");		// ���ȿ��ܻ᲻��,_stprintf_s�������SQL��䲻��ȷ;
	if ( lpFilters && lpFilters[0] != _T('\0') )
	{
		_stprintf_s(szSQL, _T("select count(*) as cot from %s where %s"), lpTableName, lpFilters);
	}
	else 
	{
		_stprintf_s(szSQL, _T("select count(*) as cot from %s"), lpTableName);
	}

	EnterCriticalSection( &m_csAdo );
	bResult = GetADODateBaseStatus();
	if( FALSE == bResult ){
		LeaveCriticalSection( &m_csAdo );
		return -1;
	}

	// ��ȡ��¼��;
	CADORecordset* pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection( &m_csAdo );
	if( NULL == pRSet )
		return -1;

	bResult = OpenADORecordSet(pRSet, szSQL);
	if( FALSE == bResult ){
		return -1;
	}

	if( !pRSet->IsFieldNull(_T("cot")) )
	{
		pRSet->GetFieldValue(_T("cot"), nRecordCount);
	}
	else
	{
		nRecordCount = -1;
		// û�м�¼�򷵻�;
		DeleteADORecordSet(pRSet);
		return -1;
	}

	DeleteADORecordSet(pRSet);

	// ��ȡ��ѯ��¼��;
	pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection( &m_csAdo );
	if( NULL == pRSet )
		return -1;

	if ( lpFilters && lpFilters[0] != _T('\0') )
		_stprintf_s(szSQL, _T("select %s from %s where %s"), lpFields, lpTableName, lpFilters);
	else
		_stprintf_s(szSQL, _T("select %s from %s"), lpFields, lpTableName);

	bResult = OpenADORecordSet(pRSet, szSQL);
	if( FALSE == bResult )
	{
		return -1;
	}

	// �ûص������������ص����ݼ����;
	nRecordCount = ((RecordsetCallback)lpCallBack)(dwCallBackType, lpParamter, nRecordCount, pRSet);

	DeleteADORecordSet(pRSet);

	return nRecordCount;
}

BOOL AdoImpl::AppenChunkFromFile(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpFileName)
{
	if ( lpTableName == NULL || 
		lpTableName[0] == _T('\0') || 
		lpFieldName == NULL || 
		lpFieldName[0] == _T('\0') || 
		lpFileName == NULL ||
		!PathFileExists(lpFileName) )
		return FALSE;

	CFile cf;
	BYTE* pBuffer = NULL;
	if ( !cf.Open(lpFileName, CFile::modeRead) )
		return FALSE;

	DWORD dwLength = cf.GetLength();
	pBuffer = new BYTE[dwLength+1];
	memset(pBuffer, 0, dwLength + 1);

	cf.Read(pBuffer, dwLength);
	cf.Close();

	BOOL bResult = AppenChunkFromBuffer(lpTableName, lpFieldName, pBuffer, dwLength);
	if ( pBuffer )
	{
		delete []pBuffer;
		pBuffer = NULL;
	}

	return bResult;
}

/************************************************************************/
/*  ������AppenChunkFromBuffer[4/13/2016 IT];
/*  ��������ָ���Ļ�������Ѷ���������д���ֶ���;
/*  ������;
/*  	[IN] lpTableName������;
/*  	[IN] lpFieldName���ֶ���;
/*  	[IN] lpBuffer������������;
/*  	[IN] nBuflen����������С;
/*  ���أ�void;
/*  ע�⣺;
/*  ʾ����;
/*
/*  �޸ģ�;
/*  ���ڣ�;
/*  ���ݣ�;
/************************************************************************/
BOOL AdoImpl::AppenChunkFromBuffer(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN BYTE* lpBuffer, IN const int& nBuflen)
{
	if ( lpTableName == NULL || 
		lpTableName[0] == _T('\0') || 
		lpFieldName == NULL || 
		lpFieldName[0] == _T('\0') || 
		lpBuffer == NULL )
		return FALSE;

	EnterCriticalSection( &m_csAdo );
	BOOL bResult = GetADODateBaseStatus();
	if( FALSE == bResult ){
		LeaveCriticalSection( &m_csAdo );
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection( &m_csAdo );
	if( NULL == pRSet )
		return -1;

	TCHAR szSQL[2048] = {0};
	_stprintf_s(szSQL, _T("select %s from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, adUseServer);
	if( FALSE == bResult )
	{
		return FALSE;
	}

	pRSet->Edit();
	bResult = pRSet->AppendChunk(lpFieldName, lpBuffer, nBuflen);
	if ( bResult )
	{
		pRSet->Update();
	}

	DeleteADORecordSet(pRSet);

	return bResult;
}

BOOL AdoImpl::GetBinary(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpCitizenIdNumber, LPVOID lpData)
{
	EnterCriticalSection(&m_csAdo);
	BOOL bResult = GetADODateBaseStatus();
	if (FALSE == bResult) {
		LeaveCriticalSection(&m_csAdo);
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection(&m_csAdo);
	if (NULL == pRSet)
		return -1;

	TCHAR szSQL[2048] = { 0 };
#if 0
	_stprintf_s(szSQL, _T("select %s from %s where [staff_citizen_id_number] = '%s'"), lpFieldName, lpTableName, lpCitizenIdNumber);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	TCHAR szDirectory[MAX_PATH] = {0};
	_stprintf_s(szDirectory, _T("%sstaff_Image\\identity_card_image\\%s.jpg"), g_szModulePath, lpCitizenIdNumber);
	bResult = pRSet->GetChunkToFile(lpFieldName, szDirectory);
#else

#if 0
	_stprintf_s(szSQL, _T("select %s,staff_citizen_id_number from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString str;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("staff_citizen_id_number"), str))
		{
			_stprintf_s(szDirectory, _T("%sstaff_Image\\identity_card_image\\%s.jpg"), g_szModulePath, str);
			bResult = pRSet->GetChunkToFile(lpFieldName, szDirectory);
		}
		pRSet->MoveNext();
	}
#else
	_stprintf_s(szSQL, _T("select %s,idno from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString str;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("idno"), str))
		{
			str.Trim();
			_stprintf_s(szDirectory, _T("%sstaff\\%s\\����֤��\\"), g_szModulePath, str);
			SHCreateDirectory(NULL, szDirectory);
			_stprintf_s(szDirectory, _T("%sstaff\\%s\\����֤��\\%s.jpg"), g_szModulePath, str, str);
			bResult = pRSet->GetChunkToFile(lpFieldName, szDirectory);
		}
		pRSet->MoveNext();
	}
#endif
#endif
	DeleteADORecordSet(pRSet);

	return 0;
}

BOOL AdoImpl::GetOrderContractImage(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpCitizenIdNumber, LPVOID lpData)
{
	EnterCriticalSection(&m_csAdo);
	BOOL bResult = GetADODateBaseStatus();
	if (FALSE == bResult) {
		LeaveCriticalSection(&m_csAdo);
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection(&m_csAdo);
	if (NULL == pRSet)
		return -1;

	TCHAR szSQL[2048] = { 0 };

	_stprintf_s(szSQL, _T("select %s,id from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString str;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	TCHAR szFile[MAX_PATH] = {0};
	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("id"), str))
		{
			str.Trim();
			_stprintf_s(szDirectory, _T("%sOrderContract\\%s\\"), g_szModulePath, str);
			SHCreateDirectory(NULL, szDirectory);
			_stprintf_s(szFile, _T("%sOrderContract\\%s\\ERP��ͬ.jpg"), g_szModulePath, str);
			bResult = pRSet->GetChunkToFile(lpFieldName, szFile);
			if (bResult == 0)
				RemoveDirectory(szDirectory);
			else
				WriteTextLog(_T("%s %s\\ERP��ͬ.jpg"), str, str);
		}
		pRSet->MoveNext();
	}

	DeleteADORecordSet(pRSet);

	return 0;
}


BOOL AdoImpl::GetOrderOtherContractImage(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpCitizenIdNumber, LPVOID lpData)
{
	EnterCriticalSection(&m_csAdo);
	BOOL bResult = GetADODateBaseStatus();
	if (FALSE == bResult) {
		LeaveCriticalSection(&m_csAdo);
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection(&m_csAdo);
	if (NULL == pRSet)
		return -1;

	TCHAR szSQL[2048] = { 0 };

	_stprintf_s(szSQL, _T("select %s,id,[date] from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString strOrder;
	CString strDateTime;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	TCHAR szFile[MAX_PATH] = { 0 };
	BOOL bPath = FALSE;
	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("id"), strOrder))
		{
			strOrder.Trim();
			if (pRSet->GetFieldValue(_T("date"), strDateTime) )
			{
				strDateTime.Remove(':');
				strDateTime.Remove('-');
				strDateTime.Remove(' ');
				_stprintf_s(szDirectory, _T("%sOrderContract\\%s\\"), g_szModulePath, strOrder);
				bPath = TRUE;
				if (!PathFileExists(szDirectory))
				{
					bPath = FALSE;
					SHCreateDirectory(NULL, szDirectory);					
				}

				_stprintf_s(szFile, _T("%sOrderContract\\%s\\������ͬ%s.jpg"), g_szModulePath, strOrder, strDateTime);
				bResult = pRSet->GetChunkToFile(lpFieldName, szFile);
				if (!bPath && bResult == 0)
					RemoveDirectory(szDirectory);
				else
					WriteTextLog(_T("%s %s\\������ͬ%s.jpg"), strOrder, strOrder, strDateTime);
			}			
		}
		pRSet->MoveNext();
	}

	DeleteADORecordSet(pRSet);

	return 0;
}



BOOL AdoImpl::GetChargeAgainstRevenueImage(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpCitizenIdNumber, LPVOID lpData)
{
	EnterCriticalSection(&m_csAdo);
	BOOL bResult = GetADODateBaseStatus();
	if (FALSE == bResult) {
		LeaveCriticalSection(&m_csAdo);
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection(&m_csAdo);
	if (NULL == pRSet)
		return -1;

	TCHAR szSQL[2048] = { 0 };

	_stprintf_s(szSQL, _T("select %s,id from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString strOrder;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	_stprintf_s(szDirectory, _T("%s����֧��\\"), g_szModulePath);
	SHCreateDirectory(NULL, szDirectory);

	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("id"), strOrder))
		{
			strOrder.Trim();
			_stprintf_s(szDirectory, _T("%s����֧��\\%s.jpg"), g_szModulePath, strOrder);
			bResult = pRSet->GetChunkToFile(lpFieldName, szDirectory);
		}
		pRSet->MoveNext();
	}

	DeleteADORecordSet(pRSet);

	return 0;
}



BOOL AdoImpl::GetOtherRevenueImage(IN LPCTSTR lpTableName, IN LPCTSTR lpFieldName, IN LPCTSTR lpCitizenIdNumber, LPVOID lpData)
{
	EnterCriticalSection(&m_csAdo);
	BOOL bResult = GetADODateBaseStatus();
	if (FALSE == bResult) {
		LeaveCriticalSection(&m_csAdo);
		return FALSE;
	}

	CADORecordset *pRSet = new CADORecordset(m_pADODatabase);
	LeaveCriticalSection(&m_csAdo);
	if (NULL == pRSet)
		return -1;

	TCHAR szSQL[2048] = { 0 };

	_stprintf_s(szSQL, _T("select %s,id,[date] from %s"), lpFieldName, lpTableName);
	// д�����ƴ��ļ�ʱ,_RecordSetPtr������adUseSever��ʽ��,�����²��ɹ�;
	bResult = OpenADORecordSet(pRSet, szSQL, CADORecordset::openQuery);
	if (FALSE == bResult)
	{
		return FALSE;
	}

	CString strOrder;
	CString strDateTime;
	TCHAR szDirectory[MAX_PATH] = { 0 };
	while (!pRSet->IsEOF())
	{
		if (pRSet->GetFieldValue(_T("id"), strOrder))
		{
			strOrder.Trim();
			if (pRSet->GetFieldValue(_T("date"), strDateTime))
			{
				strDateTime.Remove(':');
				strDateTime.Remove('-');
				strDateTime.Remove(' ');
				_stprintf_s(szDirectory, _T("%sOrderContract\\%s\\������ͬ\\"), g_szModulePath, strOrder);
				SHCreateDirectory(NULL, szDirectory);
				_stprintf_s(szDirectory, _T("%sOrderContract\\%s\\������ͬ\\%s.jpg"), g_szModulePath, strOrder, strDateTime);
				bResult = pRSet->GetChunkToFile(lpFieldName, szDirectory);
			}
		}
		pRSet->MoveNext();
	}

	DeleteADORecordSet(pRSet);

	return 0;
}