최신 포스트가 있습니다.
보시려면 여기를 클릭하세요.
-----------------------------------------------------------------------
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() );
}
보시려면 여기를 클릭하세요.
-----------------------------------------------------------------------
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() );
}
반응형
'Dev > C, C++' 카테고리의 다른 글
MFC에서 .NET스타일의 메뉴를 사용해 보자 (5) | 2003.02.08 |
---|---|
MFC에서 타이틀 변경은 어떻게 하나요? (1) | 2003.02.06 |
Http프로토콜을 이용한 파일 다운로드 (0) | 2003.01.23 |
Http프로토콜을 이용한 파일 업로드 (2) | 2003.01.18 |
EVC에서 다이얼로그에서 메인프레임의 타이틀 바꾸기.. (2) | 2002.12.30 |