VC++에서 ADO 사용 예제및 설명


ADO를 VC++에서 사용하는 방법을 간단하게 알아보자


 


1) 먼저, 테스트용의 mdb 파일을 작성합니다.



Access나, 그 외의 툴을 사용해 mdb 파일을 작성합니다. (적당한 툴이 없을 때는, WSH등을 사용해 작성하면 좋습니다.)
내용은 table1를 작성해서 필드로 field1(텍스트), field2(텍스트)를 작성합니다.
작성한 테이블에, 레코드를 1건 만들어 둡니다.


 


2) adotest.udl 파일을 작성합니다.


udl 파일을 만드는 방법은 메모장 같은 텍스트에디터 파일을 비운상태에서, “xxx.udl” 형태로 파일명을 지정한후, 바탕화면에 저장합니다.


이제, 바탕화면에서, “xxx.udl”를 선택후, 우측버튼을 클릭해서, 속성메뉴를 선택합니다. 이제, 아래순으로 진행 나갑니다.


 


3) ADO에서 사용할 provider(공급자)를 선택합니다.


 


adotest.udl 파일의 property(속성)을 통해,
프로바이더(공급자) 탭에서, ADO에서 사용하는 프로바이더를 선택합니다.
(여기에서는, mdb 파일을 사용하므로,
Microsoft Jet 3.51 OLE DB Provider,
Microsoft Jet 4.0 OLE DB Provider
등을 선택합니다.)


 


4) 데이터베이스명을 입력합니다.


 


접속 탭에서,
데이타베이스명을 입력 합니다.또는 선택합니다
여기서 지정하는 것은, db1.mdb 입니다.


 


5) 접속 테스트를 실행해봅니다.



접속 테스트 버튼을 눌러서, 접속 테스트를 실행해 봅니다.
성공하면, 준비는 완료,  이제 OK버튼을 누르고, 속성을 닫습니다.


 


6) vc++에서 ADO를 사용합니다.


 


가) StdAfx.h 파일을 열어서,맨 마지막줄의
#end if
보다 바로 위에,
#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”)
을 기술합니다. 환경에 따라서는 변경할 필요가 있을 수도 있습니다.


 


아래는, StdAfx.h의 소스 입니다.


—– 시작 —–


// stdafx.h : 표준의 시스템 인클루드 파일,

//


#if !defined(AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_)
#define AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#define VC_EXTRALEAN // Windows 헤더로부터 대부분 사용되지 않는 스탭을 제외합니다.


#include <afxwin.h> // MFC 의 코어 및 표준 컴퍼넌트
#include <afxext.h> // MFC 의 확장 부분
#include <afxdtctl.h> // MFC 의 Internet Explorer 4 코먼 컨트롤 서포트
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 의 Windows 코먼 컨트롤 서포트
#endif // _AFX_NO_AFXCMN_SUPPORT


 


#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”, “adoEOF”)


#endif // !defined(AFX_STDAFX_H__7EE7EAAB_0239_11D5_9E98_00105A8056E8__INCLUDED_)


—– 끝 —–


 


나) ado를 사용할 클래스(ADOTEST.h/ADOTEST.cpp) 에서…


public 멤버변수로, 다음을 추가 합니다.


BOOL m_IsConnectionOpen;
_ConnectionPtr m_pConnection;

_ConnectionPtr는, COM를 사용하기 쉽게 해 주고 있는 것 같고,
다양한 연산자를 오버라이드(override) 하고 있습니다.
그러니까, m_pConnection는, “->” 등을 사용할 수도 있습니다. 또한, “.” 을 사용한 경우는, 실체의 멤버가 보이고,
“->”을 사용한 경우는, COM의 멤버에 접근할수 있습니다.


아래는, ADOTEST.h의 소스


 


// ADOTEST.h : ADOTEST


#if !defined(AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_)
#define AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#ifndef __AFXWIN_H__
 #error include ‘stdafx.h’ before including this file for PCH
#endif


#include “resource.h”  


 


class CADOTESTApp : public CWinApp
{
public:
 BOOL m_IsConnectionOpen;
 _ConnectionPtr m_pConnection;

 
 CADOTESTApp();


 // ClassWizard
 //{{AFX_VIRTUAL(CADOTESTApp)
 public:
 virtual BOOL InitInstance();
 //}}AFX_VIRTUAL


 //{{AFX_MSG(CADOTESTApp)
 
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};



/////////////////////////////////////////////////////////////////////////////


//{{AFX_INSERT_LOCATION}}


#endif // !defined(AFX_ADOTEST_H__7EE7EAA7_0239_11D5_9E98_00105A8056E8__INCLUDED_)


 


다) BOOL CADOTESTApp::InitInstance()에, ADO를 사용하는 코드를 기술합니다.


아래는, ADOTEST.cpp의 소스


 


BOOL CADOTESTApp::InitInstance()
{
 // OLE/COM 라이브러리를 초기화
 AfxOleInit();


 // ① 데이터베이스를 열기


 //  이후, 데이터베이스를 계속 사용하는 경우에는 계속 열어둡니다.


 


 // ADO의 Connection 객체 사용
 HRESULT hr;
 hr = m_pConnection.CreateInstance( __uuidof( Connection ) );
 if (SUCCEEDED(hr))
 {
   //데이터 베이스 연결을 udl 파일로 사용


   hr = m_pConnection->Open(
   _bstr_t(L”File Name=c:\\adotest.udl;”),
   _bstr_t(L””),
   _bstr_t(L””),
   adModeUnknown);
  if (SUCCEEDED(hr))
  {
     ::AfxMessageBox(“데이터베이스 연결됨”);
     m_IsConnectionOpen = TRUE;
  }
 }


 /*
 // RecordSet을 얻기
 if (m_IsConnectionOpen)
 {
  _RecordsetPtr pRecordSet;
  _bstr_t bstrQuery(“SELECT * FROM TABLE1”);
  _variant_t vRecsAffected(0L);


  pRecordSet = m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);


  if (!pRecordSet->GetadoEOF())
  {
   char DebugBuf[1024];
   _variant_t vFirstName;
   _variant_t vLastName;
   char szFirstName[1024];
   char szLastName[1024];
   while (!pRecordSet->GetadoEOF())
   {
    // RecordSet에서


    vFirstName = pRecordSet->GetCollect(L”Field1″);
    vLastName = pRecordSet->GetCollect(L”Field2″);
    strcpy(szFirstName,(_bstr_t)vFirstName);
    strcpy(szLastName,(_bstr_t)vLastName);
    sprintf(DebugBuf,”%s”,szFirstName);
    AfxMessageBox(DebugBuf);
    sprintf(DebugBuf,”%s”,szLastName);
    AfxMessageBox(DebugBuf);
    pRecordSet->MoveNext();
   }
  }
  pRecordSet->Close();
  pRecordSet = NULL;
 }
 */


 


 /*
 // INSERT 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“INSERT INTO TABLE1 (field1,field2) values (‘8′,’9’)”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 /*
 // UPDATE 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“UPDATE TABLE1 SET field1=’10’,field2=’11’ where field1=’1′”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 /*
 // DELETE 문
 if (m_IsConnectionOpen)
 {
  _bstr_t bstrQuery(“DELETE FROM TABLE1 WHERE FIELD1=’10′”);
  _variant_t vRecsAffected(0L);
  m_pConnection->BeginTrans();
  m_pConnection->Execute(bstrQuery,&vRecsAffected,adOptionUnspecified);
  m_pConnection->CommitTrans();
 }
 */


 


 // 데이터 베이스를 닫습니다.


 if (m_IsConnectionOpen)
 {
  ::AfxMessageBox(“데이터베이스를 닫습니다.”);
  m_IsConnectionOpen = FALSE;
  m_pConnection->Close();
 }


 


 // 리소스 해제


 m_pConnection = NULL;


 AfxMessageBox(“완료.”);


 return FALSE;
}


 


// www.codein.co.kr


답글 남기기

이메일 주소는 공개되지 않습니다.