Win32 , C++

[MFC] ADO Recordset 의 값 읽기

김모작자 2008. 7. 31. 15:56
직접적으로 MFC 프로젝트에서 쓸 일은 별로 없긴한데, 가끔 쓸때마다 삽질을 해서 정리함.

1. 현재 레코드의 필드값 가져오기 (서수 번호로)

  spRecordset->Fields->GetItem(CComVariant((short) idx));

Field 번호를 지정해서 가져오는 경우 (short) 로 필드 번호를 기록해 준다. 그렇지 않으면
'800a0bcd', '0x800A0CC1' 등의 예외가 발생한다.

2. 커서 종류를 보고 MoveFirst 를 하자..
 
  Forward only 커서 계통은 MoveNext 만 가능하다.
  역시나 이 부분 때문에 예외가 발생한다.

3. VARIANT 에 대한 처리 확실히 하기

  확인은 안해 봤지만 아래처럼 과감하게 -_-

  CString str;
  switch(var.vt)
  {
  case VT_I8:
   str.Format(_T("%I64d"), var.llVal);
   break;
  case VT_I4:
   str.Format(_T("%d"), var.lVal);
   break;
  case VT_UI1:
   str.Format(_T("%u"), (UINT)var.bVal);
   break;
  case VT_I2:
   str.Format(_T("%d"), var.iVal);
   break;
  case VT_R4:
   str.Format(_T("%f"), var.fltVal);
   break;
  case VT_R8:
   str.Format(_T("%f"), var.dblVal);
   break;
  case VT_BOOL:
   str.Format(_T("%s"), var.boolVal == VARIANT_TRUE ? _T("true") : _T("false"));
   break;
  case VT_BSTR:
   str = (LPTSTR) (_bstr_t( var.bstrVal));
   break;
   case VT_DECIMAL: // oracle 의 숫자필드 등에 쓰이더라
    str.Format(_T("%s%I64u"),((var.decVal.sign & DECIMAL_NEG) == DECIMAL_NEG) ? _T("-") : _T("") , var.decVal.Lo64);
   break;
  case VT_DATE: // 날짜 형태는 적절히 변환해서 쓰는게 좋을듯,
  str = COleDateTime(var).Format();
  break;
  }