MFC용 ADO클래스 (버전업)

미루고 미루던 작업을 디드어 했습니다. ㅎㅎ
하나의 커넥션을 끊지 않고, 계속 활용하도록 수정했습니다.

원본보기

[CAdoDB.h] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

[CODE type=c++]
#ifndef __ADODB_HEADER_B694B3CA_2D77_4AC8_95E3_DBA44C3DB329__

#define __ADODB_HEADER_B694B3CA_2D77_4AC8_95E3_DBA44C3DB329__
/*******************************************************************
*
* MDB를 OLE로 연결한다.
* 하나의 connection로 모든 처리를 한다.
*
* ** 반드시 클래스 사용전 CoInitialize()함수를 호출해
* COM Object사용을 초기화 해야 한다.
*
*
* Usage:
* CAdoDB db;
* db.Init( "test.mdb" );
* db.Open( sql );
* while( db.IsEOF() == FALSE )
* {
* value = db.GetValueString( "field" );
* db.MoveNext();
* }
* db.Close();
*
* db.Excute( sql );
*
*
*
* 2006-07-21
*
* By newtype / newtype@newtype.pe.kr / http://newtype.pe.kr/
*
/****************************************************************/

#pragma once

#import "msado26.tlb" rename ("EOF","adoEOF") no_namespace
/*
#import "C:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename("EOF", "adoEOF")
*/


class CAdoDB
{
public:
CAdoDB(void);
~CAdoDB(void);
BOOL Init(CString Filename);
BOOL Connection(CString Filename = _T(""));
BOOL CloseConneciton();
BOOL Open(CString sql, CString Filename = _T(""));
BOOL Close();
BOOL IsEOF();
CString GetValueString(CString Field);
int GetValueInt(CString Field);
BOOL MoveNext();
BOOL Excute(CString sql, CString Filename = _T(""));

_ConnectionPtr GetConnection();
void AttachConnection( _ConnectionPtr conn );
void DetachConnection();


private:
_ConnectionPtr m_pConn;
_RecordsetPtr m_pRs;
CString m_strConnection;
BOOL m_IsOpen;
BOOL m_IsConn;

BOOL FileCmp( CString Filename );
};


#endif // __ADODB_HEADER_B694B3CA_2D77_4AC8_95E3_DBA44C3DB329__

[/HTML][/CODE]
[CAdoDB.cpp] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
[CODE type=c++]
/* AdoDB.cpp */
#include "adodb.h"

/*******************************************************************
* OLE DB connection string
*******************************************************************/
const TCHAR *oleString = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");


/********************************************************************
* 기본 생성자
*
* connection객체와 recordset객체를 생성한다.
********************************************************************/
CAdoDB::CAdoDB(void)
{
if ( FAILED(m_pConn.CreateInstance(__uuidof(::Connection))) )
AfxMessageBox(_T("Connection COM 객체 생성에 실패 하였습니다."), MB_OK, NULL);

if ( FAILED(m_pRs.CreateInstance(__uuidof(Recordset))) )
AfxMessageBox(_T("Recordset COM 객체 생성에 실패 하였습니다."), MB_OK, NULL);

m_strConnection = _T("");
m_IsOpen = FALSE;
}



/********************************************************************
* 기본 소멸자
*
* connection객체와 recordset객체를 close하고 반환 한다.
********************************************************************/
CAdoDB::~CAdoDB(void)
{
Close();
CloseConneciton();

m_pRs.Release();
m_pConn.Release();
}



/********************************************************************
* 연결 문자열을 만든다.
* 기존 파일명과 틀릴때에만 connection을 닫고, 연결문자열을 만든다.
*
* return : BOOL : TRUE | FALSE
*
* parameter :
* [in] CString Filename : MDB 파일명
********************************************************************/
BOOL CAdoDB::Init(CString Filename)
{
if ( m_pRs==NULL || m_pConn==NULL )
return FALSE;

if ( Filename.IsEmpty() )
return FALSE;

if ( FileCmp( Filename ) == TRUE )
return TRUE;

Close();

m_strConnection = oleString + Filename;

return FALSE;
}



/********************************************************************
* DB에 연결한다.
* 기존 connection이 있으면 유지 한다.
*
* return : BOOL : TRUE | FALSE
*
* parameter :
* [in] CString Filename : MDB 파일명
********************************************************************/
BOOL CAdoDB::Connection(CString Filename)
{
if ( Filename.IsEmpty() && m_strConnection.IsEmpty() )
return FALSE;

if ( Filename.IsEmpty() == FALSE )
{
Init( Filename );
}

if ( m_pConn == NULL )
return FALSE;

if ( m_IsConn == TRUE )
return TRUE;

try
{
m_pConn->Open( (_bstr_t)m_strConnection, "","" ,adConnectUnspecified );

m_IsConn = TRUE;
}
catch(_com_error &err)
{

m_IsConn = FALSE;

TRACE("Error : %s : DB CONNECTION FAIL\n", err.Description() );
}

return m_IsConn;
}



/********************************************************************
* 레코드 셋을 오픈 한다.
* 기존 recordset이 있으면 close 한다.
*
* return : BOOL : TRUE | FALSE
*
* parameter :
* [in] CString sql : SQL Query SELECT 구문
* [in] CString Filename : MDB 파일명
********************************************************************/
BOOL CAdoDB::Open(CString sql, CString Filename)
{
HRESULT hr;
VARIANT conn;

if ( m_pConn == NULL || m_pRs == NULL )
return FALSE;

if ( Filename.IsEmpty() == FALSE )
{
Connection(Filename);
}
else
{
Connection();
}

if ( m_IsConn == FALSE )
return FALSE;

if ( m_IsOpen == TRUE )
Close();

try
{
//TRACE( sql );
TRACE( "\n" );

VariantInit(&conn);
conn.pdispVal=m_pConn;
conn.vt=VT_DISPATCH;

hr = m_pRs->Open( (LPTSTR)(LPCTSTR)sql, conn,
adOpenForwardOnly, adLockOptimistic, adCmdUnknown);
}
catch(_com_error &e)
{
TRACE("\tDescription: %s\n", (LPCTSTR) e.Description());
}
catch(...)
{
TRACE("*** Unhandled Exception ***\n");
}

if ( SUCCEEDED( hr ) )
m_IsOpen = TRUE;

if ( sql.TrimLeft().Left(7).CollateNoCase( "SELECT " ) )
{
m_IsOpen = FALSE;
}

return SUCCEEDED( hr );
}



/********************************************************************
* 더 이상 튜플이 없으면 TRUE를 반환 한다.
*
* return : BOOL : TRUE | FALSE
*
* parameter : None
********************************************************************/
BOOL CAdoDB::IsEOF()
{
if ( !m_IsOpen )
return TRUE;

return (BOOL)m_pRs->GetadoEOF();
}



/********************************************************************
* 현재 튜플의 Field에 해당하는 Instance를 문자열 형태로 얻는다.
*
* return : CString : Value
*
* parameter :
* [in] CString Field : 값을 가져올 Attribute Name
********************************************************************/
CString CAdoDB::GetValueString(CString Field)
{
if ( !m_IsOpen || IsEOF() )
return "";

_variant_t vt = m_pRs->GetCollect( (LPTSTR)(LPCTSTR)Field );

return ( (vt.vt == VT_NULL)? ("") : vt );
}


/********************************************************************
* 현재 튜플의 Field에 해당하는 Instance를 정수 형태로 얻는다.
*
* return : int : Value
*
* parameter :
* [in] CString Field : 값을 가져올 Attribute Name
********************************************************************/
int CAdoDB::GetValueInt(CString Field)
{
return atoi( GetValueString(Field) );
}


/********************************************************************
* 다음 튜플로 이동한다.
*
* return : BOOL : TRUE | FALSE
*
* parameter : None
********************************************************************/
BOOL CAdoDB::MoveNext()
{
if ( !m_IsOpen )
return FALSE;

return SUCCEEDED( m_pRs->MoveNext() );
}


/********************************************************************
* recordset을 닫는다.
*
* return : BOOL : TRUE | FALSE
*
* parameter : None
********************************************************************/
BOOL CAdoDB::Close()
{
if ( m_IsOpen == FALSE )
return TRUE;

m_IsOpen = FALSE;

return SUCCEEDED( m_pRs->Close() );
}


/********************************************************************
* connection을 끊는다.
*
* return : BOOL : TRUE | FALSE
*
* parameter : None
********************************************************************/
BOOL CAdoDB::CloseConneciton()
{
if ( m_IsConn == FALSE )
return TRUE;

m_IsConn = FALSE;

return SUCCEEDED( m_pConn->Close() );
}


/********************************************************************
* DML 쿼리를 실행한다.
* connection이 없으면 연결한다.
*
* return : BOOL : TRUE | FALSE
*
* parameter :
* [in] CString sql : SQL Query DML 구문
* [in] CString Filename : MDB 파일명
********************************************************************/
BOOL CAdoDB::Excute(CString sql, CString Filename /*= _T("")*/)
{
if ( m_pConn == NULL )
return FALSE;

if ( Filename.IsEmpty() == FALSE )
{
Connection(Filename);
}
else
{
Connection();
}

if ( m_IsConn == FALSE )
return FALSE;

try
{
TRACE( sql );
TRACE( "\n" );

m_pConn->Execute( (_bstr_t)sql, NULL, adCmdText );
}
catch(_com_error &err)
{
TRACE("Error : %s : DB Execute FAIL\n", err.Description() );
return FALSE;

}

return TRUE;
}



/********************************************************************
* 기존에 연결 파일명과 비교해 틀리면 FALSE를 반환한다.
* (개선의 여지가 있음.
* 파일명에 경로가 포함될 경우 정확한 비교가 되지 않음 )
*
* return : BOOL : TRUE | FALSE
*
* parameter :
* [in] CString Filename : MDB 파일명
********************************************************************/
BOOL CAdoDB::FileCmp( CString Filename )
{
if ( m_IsConn == FALSE )
return FALSE;

return m_strConnection.CompareNoCase( oleString + Filename ) == 0;
}


/********************************************************************
* 현재 connection을 얻는다.
*
* return : _ConnectionPtr
*
* parameter : None
* [in] CString Filename : MDB 파일명
********************************************************************/
_ConnectionPtr CAdoDB::GetConnection()
{
return m_pConn;
}



/********************************************************************
* connection을 새로 Attach한다.
* 이미 사용중인 connection 및 Recordset는 닫는다.
*
* return : None
*
* parameter :
* [in] _ConnectionPtr conn : 사용할 Connection Object
********************************************************************/
void CAdoDB::AttachConnection( _ConnectionPtr conn )
{
if ( m_IsOpen == TRUE )
Close();

if ( m_IsConn == TRUE )
{
CloseConneciton();
m_pConn.Release();
}

m_pConn = conn;
m_IsConn = TRUE;
}

/********************************************************************
* connection을 새로 Attach한다.
* 이미 사용중인 connection 및 Recordset는 닫는다.
*
* return : None
*
* parameter :
* [in] _ConnectionPtr conn : 사용할 Connection Object
********************************************************************/
void CAdoDB::DetachConnection()
{
if ( m_IsConn == FALSE )
return;

m_pConn = NULL;
m_IsConn = FALSE;
}
[/HTML][/CODE]