'ADO'에 해당되는 글 3건

  1. VB 에서 오라클 DB 조회
  2. MFC용 ADO클래스 (버전업) (2)
  3. MFC용 ADO클래스

VB 에서 오라클 DB 조회

1. 오라클 클라이언트를 설치하고

2. TNS 설정을 해주고.

3. ADODB를 이용해 접속 하면 됩니다.

예제 코드는 아래와 같습니다.

전체 소스 보기




주요 서브루틴을 설명하면..

Private Sub dbCon() 에서 오라클 DB에 연결하고,

Private Sub Command1_Click() 에서는 쿼리를 이용해 실제 Data를 가져와서
MSFlexGrid에 데이타를 넣습니다.

Private Sub btnExport_Click() 에서는 엑셀을 열어 워크시트를 하나 생성하고,
MSFlexGrid에 있던 데이타를 넣습니다.

오랜만에 VB를 할려니 삽질이네요.
하지만 역시 잘아는 VC보다도 생산성이 좋네요 ㅎㅎ

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]

MFC용 ADO클래스

최신 포스트가 있습니다.
보시려면 여기를 클릭하세요.

-----------------------------------------------------------------------

MFC에서 DB를 연동하는 경우는 드문경우 입니다만,
공부를 목적으로 허접한 클래스 하나 만들어 봤습니다.

ADO가 성능면에서 떨어진다고는 하지만
ODBC셋팅이 별도 필요 없고, 소규모의 간단한 DB작업엔
괜찮을것 같아서 작업했습니다.

보시면 아시겠지만 가장 기초적인 작업만 할 수 있는 클래스 이구요
생성하면 커넥션을 엑티비티하는것이 아니고, Open으로 쿼리를 날리고,
그때마다 커넥션을 하므로 성능을 저하시키는 단점이 있습니다.
(차후 보완해야할 점입니다)


[CAdoDB.h] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#pragma once

#import "C:program filescommon filessystemadomsado15.dll"
               no_namespace
               rename("EOF", "adoEOF")

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

private:
       _RecordsetPtr m_pRs;
       CString m_strConnection;
       BOOL m_IsOpen;
};



[CAdoDB.cpp] =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#include "StdAfx.h"
#include "adodb.h"

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

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

CAdoDB::~CAdoDB(void)
{
}

BOOL CAdoDB::Init(CString Filename)
{
       if ( m_pRs==NULL )
               return FALSE;

       m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=") + Filename;

       return FALSE;
}


BOOL CAdoDB::Open(CString sql, CString Filename)
{
       HRESULT hr;

       if ( m_pRs==NULL )
               return FALSE;

       Close();

       if ( Filename.IsEmpty() && m_strConnection.IsEmpty() )
               return FALSE;

       m_strConnection = (Filename.IsEmpty())?(m_strConnection):(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=")+Filename);

       try
       {

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

       if ( SUCCEEDED( hr ) )
               m_IsOpen = TRUE;

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

       return SUCCEEDED( hr );
}

BOOL CAdoDB::IsEOF()
{
       if ( !m_IsOpen )
               return TRUE;

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

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 );
}

BOOL CAdoDB::MoveNext()
{
       if ( !m_IsOpen )
               return FALSE;

       HRESULT hr = m_pRs->MoveNext();

       return SUCCEEDED( hr );
}

BOOL CAdoDB::Close()
{
       if ( !m_IsOpen )
               return TRUE;

       m_IsOpen = FALSE;

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