'ADO'에 해당되는 글 3건

  1. 2008.09.06 [ADO] ADO 객체 정리
  2. 2008.09.06 [ADO] INSERT, UPDATE, DELETE 기능
  3. 2008.09.06 [ADO] MFC ADO 사용법
Programming/MFC2008. 9. 6. 16:31

Connection 객체

 
Connection 객체는 ODBC 데이타 소스와 연결할 때 사용한다.

 
프로퍼티 설명
Attributes 객체에 대한 하나이상의 특성을 나타낸다.
CommandTimeout 명령이 실행되는 최대 시간을 지정한다. 만약 시간이 경과되면 오류를 발행한다.
ConnectionString 데이타 소스와 연결할 때 사용하는 연결정보를 저장한다.
ConnectionTimeout 데이타 소스와 연결할 때 최대 대기 시간을 지정한다.
DefaultDatabase Connection 객체에 대한 기본 데이타베이스를 지정한다.
IsolationLevel Connection 객체에 대한 격리 레벨을 지정한다.
Mode Connection 객체에서 데이타의 변경에 대한 권한을 지정한다.
Provider Connection 객체의 Provider 이름을 나타낸다.
Version ADO의 버젼을 나타낸다.

메소드 설명
BeginTrans 새로운 트랜젝션을 시작한다.
CommitTrans 현재 트랜젝션에서 일어난 변경사항을 저장하고 트랙젝션을 닫는다.
그리고 새로운 트랜젝션을 다시 시작한다.
RollbackTrans 현재 트랜젝션에서 일어난 변경사항을 취소하고 트랙젝션을 닫는다.
그리고 새로운 트랜젝션을 다시 시작한다.
여기서 트랜젝션은 데이타베이스에 가하는 일련의 작업 집합을 말한다.
Open 데이타 소스에 연결한다.
Close 데이타 소스로의 연결을 종료한다.
Execute 지정된 쿼리, SQL 문장 또는 Stored Procedure를 실행한다.
 

 Error 객체

 
ADO의 명령수행중에 발생한 오류에 대한 정보를 담고 있다.

 
프로퍼티 설명
Number 오류 번호
Description 오류에 대한 설명
Source 오류를 발생시킨 객체의 이름을 나타낸다.
HelpFile 오류와 관련된 도움말 파일의 이름을 나타낸다.
HelpContext 오류와 관련된 도움말의 컨텍스트 ID를 나타낸다.
SQLStatus SQL 상태를 나타내는 길이가 5인 문자열을 리턴한다.
NativeError 데이타베이스에서 정의한 오류 번호를 리턴한다.
 

 Command 객체

 
Command 객체는 데이타 소스로 부터 실행할 명령을 정의한다.

 
프로퍼티 설명
ActiveConnection 데이타 소스에 연결된 Connection객체로 Command 객체는 이 연결객체를 통해서 명령을 실행한다.
CommandText 실행할 SQL 문장이나 테이블 이름, 또는 스토어드 프로시져
CommandTimeout 명령이 실행되는데 걸리는 최대 대기 시간을 나타낸다.
CommandType Command 객체의 종류를 지정한다.
Prepared 명령을 실행하기 전에 준비된 문장을 생성할 것인지를 지정한다.

메소드 설명
CreateParameter 새로운 파라메터 객체를 생성한다.
Execute CommandText에서 지정한 쿼리, SQL 문장, 또는 스토어드 프로시듀어를 실행한다.
 

 Parameter 객체

 
파라메터 객체는 파라메터를 가지는 쿼리나 스토어드 프로시듀어를 담고있는 커멘드 객체와 함께 사용된다.

 
프로퍼티 설명
Attributes 파라메터의 속성을 나타내며, adParamSigned, adParamNullable, adParamLong과 같은 값들을 혼합하여 지정할 수 있다.
Direction 파라메터가 입력 파라메터인지 출력 파라메터인지 등을 지정한다.
Name 파라메터 객체의 이름을 나타낸다.
NumericScale 숫자형 파라메터에서 소수점 뒷자리수를 결정한다.
Precision 숫자형 파라메터에서 최대 자리수를 결정한다.
Size 파라메터 값의 바이트 수 또는 문자열 수를 지정한다.
Type 파라메터 값의 데이터 형을 지정한다.
Value 파라메터의 값을 나타낸다.

메소드 설명
AppendChunk 긴 문자열이나 바이너리 타입의 파라메터 객체에 데이터를 추가한다.
 

 Recordset 객체

 
프로퍼티 설명
AbsolutePage 레코드의 절대 페이지를 나타낸다.
만약 여기에 새로운 값을 지정하면, 현재 레코드의 위치가 해당 페이지의 첫 레코드로 이동한다.
페이지란 순차적으로 일정 개수만큼 레코드들을 묶어놓은 단위이다.
페이지는 기본 값으로 10개의 레코드를 가진다.
AbsolutePosition 현재 레코드의 절대 위치를 나타낸다.
첫 레코드의 AbsolutePosition은 1이다.
ActiveConnection 현재 레코드셋이 연결된 Connection 객체를 나타낸다.
BOF, EOF BOF는 현재 레코드가 첫 레코드의 이전에 있는지를 나타낸다.
EOF는 현재 레코드가 마지막 레코드의 다음에 있는지를 나타낸다.
Bookmark 레코드셋에서 현재 레코드의 위치를 저장하고 언제라도 그 위치로 이동할 수 있다.
CacheSize 로컬 메모리에 저장할 레코드의 개수를 지정한다.
CacheSize의 기본값은 ForwardOnly 커서를 가진 레코드 셋의 경우 1이고, 그 외의 경우에는 모두 10의 값을 갖는다.
CursorType 레코드 셋에서 사용할 커서의 유형을 정한다.
커서란 레코드 셋에서 현재 레코드를 가리키는 포인터를 말하고, 커서의 유형은 아래와 같은 유형이 있으며 각각 다른 특성을 가진다.
커서 유형 지원 기능
AdOpenForwardOnly None
AdOpenKeyset adBookmark, adHoldRecords, adMovePrevious, adResync
AdOpenDynamic adMovePrevious
AdOpenStatic adBookmark, adHoldRecords, adMovePrevious, adResync
EditMode 현재 레코드의 편집 상태를 나타낸다.
Filter 레코드셋 객체 안에서 선택적으로 레코드들을 화면에 표시할 때 사용한다.
LockType 레코드를 편집하는 동안 설정할 락 유형을 결정한다.
MaxRecords 쿼리 실행후에 리턴될 최대 레코드 수를 지정한다.
PageCount 레코드셋이 포함하고 있는 페이지 수를 지정한다.
PageSize 페이지당 레코드 수를 결정한다.
RecordCount 레코드셋 객체의 총 레코드 수를 리턴한다.
Source 레코드셋 안의 데이터가 어디로부터 왔는지를 나타낸다.
Status 순차적 업데이트또는 기타 작업에 대한 현재 레코드의 상태를 나타낸다.

메소드 설명
AddNew 레코드셋에 새로운 레코드를 생성한다.
CancelBatch 진행중인 순차 업데이트를 취소한다.
CancelUpdate AddNew나 Edit로 변경한 레코드의 업데이트를 취소한다.
Clone 존재하는 레코드셋의 복사하여 새로운 레코드셋을 생성한다.
Close 열려진 레코드셋을 닫는다.
Delete 레코드셋에서 현재 레코드를 삭제한다.
GetRows 레코드셋에서 여러 개의 레코드를 읽어서 배열에 저장한다.
Move 레코드셋에서 현재 레코드를 이동시킨다.
MoveFirst 현재 레코드를 첫 레코드로 이동시킨다.
MoveLast 현재 레코드를 마지막 레코드로 이동시킨다.
MoveNext 현재 레코드를 다음 레코드로 이동시킨다.
MovePrevious 현재 레코드를 이전 레코드로 이동시킨다.
NextRecordset 현재 레코드셋을 종료하고 다음 레코드셋을 리턴한다.
Open 쿼리나 SQL의 실행한 결과를 가져온다.
Requery 쿼리를 다시 실행하여 레코드셋을 최신 정보로 고친다.
Resync 데이터베이스로부터 현재 레코드셋의 데이터를 최신 정보로 갱신한다.
Supports 레코드셋이 특정 기능을 지원하는지를 결정한다.
Update 현재 레코드의 변경사항을 레코드셋 객체에 저장한다.
UpdateBatch 진행중인 모든 순차 업데이트 작업을 디스크로 저장한다.
 

 Field 객체

 
필드 객체는 레코드셋 객체의 각 필드를 표현하는 객체이다.
레코드셋은 필드 객체들의 모임인 Fields 컬렉션을 가진다.
필드 객체는 레코드셋에 저장되어 있는 실질적인 값들에 접근할 수 있는 방법을 제공한다.
필드 객체에 대한 문법은 아래와 같이 다양한다.

Recordset.Fields.Item(0)
Recordset.Fields.Item("Name")
Recordset.Fields(0)
Recordset.Fields("Name")
Recordset(0)
Recordset("Name")
Recordset![Name]

 
프로퍼티 설명
ActualSize 필드 값의 실제 길이를 나타낸다.
Attributes 필드 객체의 속성을 나타낸다.
DefinedSize 필드 객체의 정의된 길이를 나타낸다.
Name 필드의 이름을 나타낸다.
NumericScale 숫자형 필드의 소수점 이하 자리수를 나타낸다.
OriginalValue 필드의 값이 변하기 전에 원래의 값을 나타낸다.
Precision 숫자형 필드의 최대 자리수를 나타낸다.
Type 필드 객체의 데이터 타입을 나타낸다.
UnderlyingValue 데이터베이스 내의 현재 필드의 값을 나타낸다.
Value 필드의 값을 나타낸다.

메소드 설명
AppendChunk 데이터를 긴 문자열이나 바이너리 타입의 필드 객체에 추가한다.
GetChunk 긴 문자열이나 바이너리 타입의 필드 객체에서 전부 또는 일부 내용을 리턴한다.
 

 Property 객체

 
프로퍼티 설명
Attributes 프로퍼티 객체의 속성을 나타낸다.
Name 프로퍼티의 이름을 나타낸다.
Type 프로퍼티의 데이터 타입을 나타낸다.
Value 프로퍼티의 값을 나타낸다.
Posted by skensita
Programming/MFC2008. 9. 6. 16:30

ADO를 이용한 삽입, 삭제, 업뎃



void CTestADODlg::OnButton3()
{
 // 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위치: c:\\TestDb.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");
     
  // INSERT 구문
  try
  {
   // 테이블명(tbltest)에서 필드ID에 200, Checker에 300을 삽입한다.
   _bstr_t bstrQuery("INSERT INTO tbltest(ID,Checker) values('200','300')");
   
   // 0L에서 0은 int형 0L은 long형을 의미한다.
   // long형이 int 보다 더 큰수 저장가능

   _variant_t valValue(0L);


   // 새로운 트랜젝션을 시작한다.
   pConn->BeginTrans();
   pRs = pConn->Execute((_bstr_t)bstrQuery, &valValue, adOptionUnspecified);


   // 현재 트랜젝션에서 일어난 변경을 저장하고 트랜젝션을 닫고
   // 새로운 트랜젝션을 시작한다.
   pConn->CommitTrans();
 
  }
  catch(_com_error& e)
  {
   AfxMessageBox(e.Description());
   AfxMessageBox(e.ErrorMessage());  
  }
 
 
  // UPDATE 구문
  try
  {
   // 필드명 ID의 값이 2인 모든 곳의 필드명 ID, Checker의 필드값을 변경
   _bstr_t bstrQuery2("UPDATE tbltest SET ID = 2000 , Checker = 300 WHERE ID = 2 ");
   _variant_t valValue2(0L);
   pConn->BeginTrans();
   pConn->Execute((_bstr_t)bstrQuery2, &valValue2, adOptionUnspecified);
   pConn->CommitTrans();
 
  }
  catch(_com_error& e)
  {
   AfxMessageBox(e.Description());
   AfxMessageBox(e.ErrorMessage());  
  }
 

  // DELETE 구문
  try
  {
   // ID가 200인 tbltest 테이블 내의 Record를 삭제.
   _bstr_t bstrQuery3("DELETE FROM tbltest WHERE ID = 200 ");
   _variant_t valValue3(0L);


  pConn->BeginTrans();
   pConn->Execute((_bstr_t)bstrQuery3, &valValue3, adOptionUnspecified);
   pConn->CommitTrans();
 
  }
  catch(_com_error& e)
  {
   AfxMessageBox(e.Description());
   AfxMessageBox(e.ErrorMessage());  
  }
 }
}

Posted by skensita
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