Programming/MFC2008. 9. 6. 16:30

MS Access로 mdb를 만들었다고 가정하고 시작해본다.

ADO를 사용하기 위해서는 가령 작업하고 있는 파일(TestADODlg.cpp/TestADODlg.h),

라면 다음과 같은 선언을 상단에 우선적으로 해야한다.



(Step1) - 헤더파일

#if !defined(AFX_TESTADODLG_H__4B76919F_E8B6_4E36_92B4_4F549B5272FC__INCLUDED_)
#define AFX_TESTADODLG_H__4B76919F_E8B6_4E36_92B4_4F549B5272FC__INCLUDED_

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

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "EndOfFile")
using namespace ADODB;
// #import "C:\Program Files\Common Files\System\ADO\msado15.dll"no_namespace

// rename("EOF", "EndOfFile")


 

(Step2)

void CTestADODlg::OnTestADO()
{
 
 // DAO (Access2000) 이후 버젼 리딩가능
 AfxGetModuleState()->m_dwVersion = 0x0601;
 
 // COM이나 OLE를 라이브러리를 초기화한다.
 AfxOleInit();
 
 
 // ADO에 Connection 객체 사용
 _ConnectionPtr pConn;  
 HRESULT hr;
 BOOL IsConnectionOpen = FALSE;
 
 // DB를 열기 위한 예의상 구문으로 인식하고 넘어가자. 
 CoInitialize(NULL);
 hr = pConn.CreateInstance(__uuidof(Connection));
 pConn->CursorLocation = adUseClient;
 
 // 데이터베이스 접속
 if(SUCCEEDED(hr))
 {
  // Provider: 여기서는 mdb를 사용하므로, Microsoft.Jet.OLEDB.4.0를 선택한다.
  // Data위치: D:\\tDbTest.mdb
  _bstr_t strMode("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= d:\\dbTest.mdb;");
  try
  {
   hr = pConn->Open(strMode,_bstr_t(L""),_bstr_t(L""), -1);
  }
  catch(_com_error& e)
  {
   AfxMessageBox(e.Description());
   AfxMessageBox(e.ErrorMessage());  
  }
 }
 if(SUCCEEDED(hr))
 {
  AfxMessageBox("데이터베이스 연결됨");
  IsConnectionOpen = TRUE;
 }
 
 // 데이터베이스에 연결이 되었다면,  레코드의 내용을 확인하자.
 if(IsConnectionOpen)
 {
  _RecordsetPtr pRs;
  hr = pRs.CreateInstance(__uuidof(Recordset));
  _bstr_t strQuery("Select * from tblTest");
 
 
  // 레코드셋 설정
  hr = pRs->Open(strQuery, pConn.GetInterfacePtr(),
   adOpenForwardOnly,adLockReadOnly,adCmdText);  
  // 아래와 같은 방식으로 접속해도 된다
  // pRs = pConn->Execute((_bstr_t)strQuery, NULL, adOptionUnspecified);
   
  _variant_t vtColumn;
  _variant_t vtNull;
 
  // _varint_t 형의 Type을 변경한다.
  vtNull.ChangeType(VT_NULL);
 
  TCHAR strDisp[MAX_PATH+1];
  short i;
 
  // Record수를 읽는다.
  long nRecord = pRs->RecordCount;
 
  // Field수를 구한다. 주의해야할 것은 long형이라는 것이다.
  long nRow = pRs->Fields->Count;

  // 다음은 Field수를 구하는 다른 방법이다.
  long nRow2 = pRs->GetFields()->Count;
 
 
  // 필드명 표시
  for(i = 0; i<nRow ; i++)
  {
   // 필드명 취득
   vtColumn = pRs->Fields->GetItem(i)->Name;  
   vtColumn.ChangeType(VT_BSTR);


   // 문자열 복사하는 방법
   lstrcpyn(strDisp,(_bstr_t)vtColumn,MAX_PATH);  
  }

  // 필드값 표시  
  while(!pRs->EndOfFile)
  {
   for(i=0;i<nRow;i++)
   {
    // 필드값을 읽어온다
    vtColumn = pRs->GetCollect(i);

    // 또한 필드값을 읽어오는 다른 방법이다.
    // vtColumn = pRs->Fields->GetItem(i)->Value;

    // 조금더 다르게 하여 특정 필드의 필드값을 읽어온다.
    // vtColumn = pRs->Fields->GetItem("Checker")->Value;

    // 데이터가 NULL이면 ""을 대입
    if(vtColumn == vtNull)
    {
     vtColumn = _variant_t("");    
    }
    else
    {
     vtColumn.ChangeType(VT_BSTR);    
    }
    lstrcpyn(strDisp,(_bstr_t)vtColumn,MAX_PATH);
   
   }
   pRs->MoveNext();
  }
  hr = pRs->Close();
 }

pConn->Close();
}

Posted by skensita