1998.9.2 조경민

  ODBC 파일 등록하기

  내컴퓨터-> 제어판 -> ODBC

  mdb 인경우는 파일 안에서 자체적으로 Multi-Table을 지원하므로
  등록할때 파일을 선택을 함으로써 등록을 하게 되지만
  dbf 같은 옛 DB파일은 하나의 파일이 곧 하나의 Table을 의미하므로
  등록할때는 dbf파일들이 있는 디렉토리를 선택함으로써 ODBC파일을
  등록하게 된다.

  *Field
   데이타베이스에서 하나의 항목 즉, 이름, 학교 그런 목록에 대한
   칸을 의미한다.

  *Record
   DB에서 필드등으로 묶어진 하나의 완성된 의미 있는 화일을 의미한다.

  *Table
   테이블은 레코드의 집합으로 완성된 DB라 할수 있다.

  Muti-Table DB ---------------------------

  먼저 프로젝트를 ODBC without file surport로 선택을 한다.
  그리고 아래 Option에서

   ODBC 란의 원하는 파일을 선택을 한다.
   만일 mdb인 경우는 Multi-Table을 지원함으로 ok를 누르면 새로운
   다이얼로그창에서 원하는 테이블을 선택하라고 나오는데 여기서
   일반적으로 기준이되는 테이블을 선택하는것이 좋다. 만일 모든
   테이블을 선택하면 코드가 어려워진다.... 문제도 있고

   만일 dbf인 경우는 현(ODBC 등록시) 디렉토리의 dbf들을 하나의
   테이블로 보고 테이블 선택 창이 뜨는데 역시 기준이 되는 테이블
   하나를 선택하고 ok를 누른다.

  하나의 테이블은 하나의 CRecordSet을 의미한다.
  즉 여러 테이블 구현시에는 각각 ClassWizard를 이용해서 Add Class
  를 하여 베이스 클래스는 CRecordSet으로 하고 각 테이블을 선택하여서
  여러 테이블을 구현하는 방법을 쓸수 있다.

  여러 테이블 시 여러 폼을 구성해야 하는가?
  그건 마음이다 그러나 일반적인 방법으로는 CDocument헤더에다가
  각 RecordSet형 테이블 변수를 마련하고 테이블 수에 맞는 뷰 폼과
  뷰 클래스를 만들어 이용한다. 즉 각 뷰의 InitialUpdate라는 뷰 처음
  시작하는 곳에다가 GetDocument를 이용하여 다큐먼트가 지니고 있는
  레코드 셋 포인터를 뷰 의 레코드 셋 포인터에 주어 연결을 하여야 한다.

  CDatabase와 CRecordset의 관계
  CDatabase 객체는 CRecordset이 가리켜야 할 DB파일들 DSN (Data Source Name)
  을 갖는 경로에 해당하는 객체이다. 레코드셋 객체는 이 데아타베이스 객체의
  경로를 얻어서 실제 데이타베이스 연결이 이루어진다.

  다음은 실제 어떻게 쓰는가에 대한 코드이다.

          CDatabase odbc;
        odbc.OpenEx(_T("DSN=data;UID=Bro"),CDatabase::openReadOnly);
        CPostset *post = new CPostset(&odbc);

       < 레코드 셋 생성하기 >

  데이타베이스 객체를 만들고 이 객체에서 제어판 DB등록에서 DSN이 data인
  database를 ID bro로 접근을 시도한다.
  이 경로를 레코드 셋 post가 생성자에서 얻으므로서 가능하게 된다.
    
  

  테이블 생성하기

        CDatabase odbc;
        odbc.OpenEx(_T("DSN=data;UID=Bro"),CDatabase::openReadOnly);
        
        CString strCmd = "CREATE TABLE NEW ( IDAY CHAR(30), DADA CHAR(10));";

        TRY
        {
                odbc.ExecuteSQL( strCmd );
        }        
        CATCH(CDBException, e)
        {
                // The error code is in e->m_nRetCode
                MessageBox(e->m_strError);
        }        
        END_CATCH



테이블 전체 삭제 ( 테이블 자체도 )
        CDatabase odbc;
        odbc.OpenEx(_T("DSN=data;UID=Bro"),0);
                //CDatabase::openReadOnly);
        
        //CString strCmd = "DELETE NEW";
        CString strCmd = "DROP TABLE NEW";

        
        TRY
        {
                odbc.ExecuteSQL( strCmd );
        }        
        CATCH(CDBException, e)
        {
                // The error code is in e->m_nRetCode
                MessageBox(e->m_strError);
        }        
        END_CATCH        



DELETE NEW 는 테이블은 놔두고 속의 레코드 전체를 지운다.



Error 노하우
=========================================

" CRecordset is undefined "

만일 App위자드에서 폼 기반으로 한다음 클래스 위자드에서

BaseClass를 CRecordset으로 해서 어떤 DB set을 만들었다고

할때 컴파일하면 VC 5.0에서는 저런 에러가 난다.

이럴때는 StdAfx.h에다가 CRecordset이 정의된 헤더를 추가

써줘야 한다.
    
#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>                        // MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>                        // MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT

이렇게 하면 에러가 사라진다.

'KB > MFC/Win32' 카테고리의 다른 글

Unleashed Visual C++ 5.0 ????  (0) 2004.03.19
[db] sql  (0) 2004.03.19
dll 설명  (0) 2004.03.19
[api] 폰트크기,프린트  (0) 2004.03.19
텍스트 크기 알기  (0) 2004.03.19

+ Recent posts