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