3.진보적인 DAO 프로그래밍

ODBC나 DAO 두 개의 사용법은 매우 비슷합니다. 그러나 DAO는 ODBC와 다른 몇가지가 있습니다. ODBC는 데이터베이스를 여러 사용자가 공유하여 사용하고 이용하고 있기 때문에 데이터베이스 안의 기본 구조를 바꾸는 것을 권한권이 없는 사용자가 마음대로 할수 없도록 합니다. 예를 든다면 테이블을 새로 만든다든지 데이터베이스 파일을 새로 만든다든지 필드를 추가한다는 것과 같은 것이 프로그램에서 용이하게 할 수가 없습니다. DAO는 이와 반대로 데이터베이스 파일을 새로 만들 수 있으며 사용도중에 필요한 새로운 필드가 있다면 이것을 생성 또는 기존의 필드를 삭제할수 있고 테이블 또한 새로 만들고 삭제를 할수 있습니다.

본장은 DAO 데이터베이스 파일의 데이블 생성과 삭제 필드의 생성과 삭제 또한 데이터베이스를 만드는 방법에 대해서 설명을 합니다.

대상자: 고급

Chapter 등급: 선택

공부방법:

간단한 데이터베이스를 구동한다고 할경우 본장의 내용은 크게 필요하지 않습니다.

DAO 데이터베이스 파일과 필드를 생성 삭제에 대한 방법을 알고자 할경우 보시기 바랍니다.

1.DAO 클래스들

<1>새로운 데이터베이스 파일 만들기

CDatabase 클래스는 ODBC 에서 데이터파일을 핸들링하는 클래스라고 설명을 하였습니다. 이것과 대응되는 DAO클래스는 CDaoDatabase클래스입니다. 만일 새로운 파일을 만들고자할 경우 그리고 그파일명이 □test.mdb"이고 버전은 3.0일 경우 다음과 같이 합니다.

CString szFilename="test";

int dwOption=0;

dwOptions |= dbVersion30;

CDaoDatabase m_pdb = new CDaoDatabase;

m_pdb->Create(m_strDatabaseName, dbLangGeneral, dwOptions);

간단하게 설명하자면 CDaoDatabase 안에 있는 Create 함수를 이용하여 데이터베이스를 만드는 것입니다.

<2>데이터베이스 파일 열기와 닫기

CDaoDatabase 클래스에서 데이터베이스 파일을 닫는함수는 Close입니다.

m_pdb->Close();

데이터베이스 파일 개방하고자 할 때 사용하는 함수는 Open입니다.

m_pdb->Open();

<2>테이블 만들기

Dao 데이터베이스에새로운 테이블을 만들 경우 CDaoTableDef 클래스를 이용하여 만듭니다. 먼저 CDaoDabase 형을 인자로 다음과 같이 생성합니다.

CDaoTableDef m_pTableDef->new CDaoTableDef(m_pDatabase);

다음 CDaoTableDef의  맴버 함수인 Create 를 이용하여 테이블을 만들면 됩니다.

다음은 □table2"라는 테이브을 만드는 예입니다.

CString table="table2";

m_pTableDef->Create(table);

<3>테이블 열기와 삭제

테이블을 삭제할때에는 CDatTableDef가 아닌 CDaoDatabase의 맴버 함수 DeleteTableDef 에 삭제할 명을 설정하여 삭제합니다.

CString table="table2";

m_pDatabase->DeleteTableDef(table);

특정 테이블을 열고자 할 경우 CDaoTableDef클래스를 사용합니다.

CDaoTabelDef m_pTable =new CDaoTableDef(m_pDatabase);

m_pTable->Open(table);

<4>필드 만들기

Dao 데이터베이스에서 새로운 필드를 만들고자 할경우CDaoFieldInfo 구조체를 이용합니다. CDaoFieldInfo 구조체는 다음과 같습니다.

struct CDaoFieldInfo

{

CString m_strName;           // Primary

short m_nType;               // Primary

long m_lSize;                // Primary

long m_lAttributes;          // Primary

short m_nOrdinalPosition;    // Secondary

BOOL m_bRequired;            // Secondary

BOOL m_bAllowZeroLength;     // Secondary

long m_lCollatingOrder;      // Secondary

CString m_strForeignName;    // Secondary

CString m_strSourceField;    // Secondary

CString m_strSourceTable;    // Secondary

CString m_strValidationRule; // All

CString m_strValidationText; // All

CString m_strDefaultValue;   // All

};

m_strName란 필드명을 말하고 m_nType는 이 필드의 형을 이야기 합니다. m_lSize는 이필드의 크기를 말하고 m_lAtrributes는 속성을 이야기합니다. m_nOrdinalPositon은 이필드의 위치를 말하는 것입니다.

m_nType에 설정하는 형은 표 1과 같습니다. m_lAttributes에 설정하는 속성값은 다음과 같습니다.

dbFixedField : 필드이 길이를 고정하는 형태입니다.

dbVarialbleField: 필드의 길이가 다변적인 형태입니다.

dbDescending: 현재 필드이 데이터가 올림차순 형태로 정렬되는 형태입니다.

dbUpdatableField: 필드가 수정가능한 형태

(표1) m_nType에 설정값

설정 값	형	설명
dbBoolean	BOOL	TRUE, 또는 FALSE값 설정
dbByte	BYTE	8바이트 형
dbInterger	int	32비트 정수형
dbLong	long	32비트 정수형
dbCurrency		COleCurrency 참조
dbSingle	single	소수형
dbDouble	double	64비트 소수형
dbDate		날짜형
dbText		문자열
dbMemo		메모형

예를들어 필드명이 □name"이고 형은 문자열이고 크기는 50이면서 기본 값은 없을 경우  그리고 이필드가 첫 번째 일 경우 구조체에 다음과 같이 정의할수 있습니다.

CDaoFieldInfo m_FI;

m_FI.m_strName = □name";

m_FI.m_nType = dbText;

m_FI.m_lSize = 50;

m_FI.m_strDefaultValue = "";

m_FI.m_bRequired = FALSE;

m_FI.m_lAttributes = dbUpdatableField;

m_FI.m_nOrdinalPosition=0;

위와 같이 정의한다음 CDaoTableDef 클래스의 CreateField 함수에 m_FI를 넘겨주고 실행하면 됩니다. 위에서 사용한 m_pTableDef를 사용하여 필드를 만들어 보겠습니다.

m_pTableDef->CreateField(m_FI);

필드가 만들어지면 테이블의 정보를 다시 갱신 해야 합니다. 이렇게 갱신을 할 경우 CDaoTableDef의 맴버 함수 Append(); 를 사용합니다.

m_pTableDef->Append();

<5>필드 삭제 하기

필드를 삭제하는 함수는 CDaoTableDef클래스의 맴버 함수 DeleteField 입니다.

위에서 만든 "name"라는 테이블을 삭제하고자 한다면 다음과 같이 합니다.

CString name="name";

m_pTableDef->DeleteField(name);

2.DAO 파일 구조 설정 예제 ExDao2

ExDao2는 DAO파일을 만들거나 테이블을 수정 삭제, 필드를 수정삭제하는 예제 프로그램입니다. 그림 3-3-1은 ExOdb2의 실행 결과입니다.

(그림 3-3-1) ExDao2의 실행 결과

File메뉴에서 Open을 선택하여 데이터베이스 파일을 오픈시키고 New항목을 선택하여 새로운 MDB파일을 만들수가 있습니다.

테이블 추가 버튼을 누르면 현재 설정된 데이터베이스에 새로운 테이블이 설정되고 테이블 삭제를 누르면 현재 설정된 테이블이 삭제과 됩니다. 또한 필드 추가를 누르면 새로운 필드가 추가 되고 필드 삭제를 누르면 현재 설정된 필드가 삭제됩니다.

콤보박스에는 현재 설정된 데이터베이스의 테이블 리스트가 보이고 특정 테이블을 선택하면 해당되는 테이블의 필드리스트가 나타납니다.

본프로그램은 SDI로 제작되면 AppWizard에서 데이터베이스 옵션을 사용하지 않았으며 CExDao2View클래스는 FormView로 설정하였습니다.

(주의)

ExDao2프로그램을 만들 때 StdAfx.h에 다음헤더를 인쿨르드해야 합니다.

#include <afxdao.h>

위의 헤더를 설정하지 않으면 컴파일시 에러가 나옵니다.

(주의끝)

먼저 CExDao2View 클래스이 멤버 변수들을 보면 다음과 같습니다.

CListCtrl	m_listData;//필드 정보를 보여주는 리스트컨트롤클래스

CComboBox	m_listTable;//테이블 리스트가 있는 콤보 박스

BOOL m_bAddColumn;//컬럼을 리스트에 설정하였는가의 정보

CString m_strTableName; //테이블 명

CDaoTableDef * m_pTableDef;	// 테이블 핸들링 클래스

CDaoFieldInfo m_FI;//필드 정보 클래스

short m_nPosition;//현재 테이블의 총 필드수 +1

CString m_strChoField;//선택된 필드면

BOOL m_bOpen;//현재 오픈되어 있나 플러그

CDaoTableDefInfo TableInfo;//테이블 정보 클래스

CDaoDatabase * m_pDatabase;//Dao데이터베이스 클래스

CString	m_strDatabaseName;//데이터베이스 명

위의 변수중에 중요한 변수가 m_pDatabase와 m_pTableDef와 m_FI와 TableInfo입니다. 이것에 대하 설명은 앞에서 이미 하였습니다.

<1>데이터베이스 만들기

메뉴항목에서 New를 선택하면 화면에 데이터베이스 를 설정하는 대화상자가 나타나고 새로운 파일명을 설정하면 버전을 설정하는 대화상자가 그림3-3-2와 같이 나타납니다.

(그림 3-3-2) MDB버전 설정을 하는 대화상자

현재 까지 나와있는 DAO는 3.0까지가 있습니다. 원하는 버전의 형태로 데이터베이스를 만드실수 있습니다. 본대화상자 클래스는 CChooseVerDlg입니다. 지금까지 읽어보신 분은 본 대화상자쯤은 간단하게 만드실수 있을것이라 보고 만드는 법은 생략합니다.   View에서 New항목을 선택하였을 때 함수는

OnFileNew()  입니다. 이내용은 다음과 같습니다.

//새로운 데이터베이스 만들기

void CExDao2View::OnFileNew()

{

//파일 설정 대화상자를 통새서 파일명을 설정하게 하고

CFileDialog	dlg (TRUE, _T("mdb"), NULL, OFN_HIDEREADONLY,

_T("Access Database File (*.mdb)|*.mdb||")	this);

if ( dlg.DoModal()==IDOK)

{

//데이터 베이스 이름을 받는다.

m_strDatabaseName = dlg.GetPathName();

int dwOptions = 0;

//옵션 설정 대화상자를 실행하고

CChooseVerDlg Dlg;

Dlg.DoModal();

//옵션을  설정한다.

switch(Dlg.m_nVersion)

{

case 0: dwOptions |= dbVersion10;

break;

case 1: dwOptions |= dbVersion11;

break;

case 2: dwOptions |= dbVersion20;

break;

case 3: dwOptions |= dbVersion30;

break;

}

//만약 테이블이 선택되어있다면

//해제 한다.

if(m_pTableDef)

{

m_pTableDef->Close();

delete m_pTableDef;

m_pTableDef=NULL;

}

//만약 현재 데이터베이스가 열려져 있다면

if(m_pDatabase)

{

//닫는다.

m_pDatabase->Close();

delete m_pDatabase;

m_pDatabase=NULL;

}

//새로운 데이터베이파일을 만든다.

m_pDatabase= new CDaoDatabase;

m_pDatabase->Create(m_strDatabaseName, dbLangGeneral,

dwOptions);

m_nPosition=0;//필드번호는 0으로 설정

m_bOpen=TRUE;

//테이블추가 버튼만 활성화 하고 나머지는 비활성

GetDlgItem(IDC_ADDTABLE)->EnableWindow(TRUE);

GetDlgItem(IDC_ADDFIELD)->EnableWindow(FALSE);

GetDlgItem(IDC_DELFIELD)->EnableWindow(FALSE);

GetDlgItem(IDC_DELTABLE)->EnableWindow(FALSE);

//현재 리스트박스의 컬럼에 내용이

//설정되어 있지 않다면 컬럼을 삽입한다.

if(!m_bAddColumn)

AddColumn();

}

}

칼럼을 삽입한다는 내용은 리스트박스의 칼럼 제목을 넣는 다는 이야기 입니다. 처음에 실행하면 리스트박스에 칼럼이 삽입되어 있지 않습니다. 처음 데이터베이스를 오픈하는 순간 바로 칼럼이 삽입됩니다. 칼럼의 제목은 □번호,이름,형,크기□가 설정됩니다.

<2>테이블 추가

데이터베이스 파일을 오픈 한후에 현재 테이블에 새로운 테이블을 삽입하고자 하면 테이블 추가 버튼을 클릭합니다. 이때 테이블 명을 물어보는 대화상자가 나타나고 이 대화상자에 테이블 명을 입력하면 새로운 테이블이 만들어집니다.

테이블 버튼을 클릭하였을 때 실행되는 함수는 OnAddtable()  이며 내용은 다음과 같습니다.

//테이블 추가 버튼을 클릭하였을경우

void CExDao2View::OnAddtable()

{

//테이블 명을 입력받는 대화상자 생성

CAddTableDlg Dlg;

if(Dlg.DoModal()!=IDOK)

return;

//테이블 면을 받는다.

CString szTable;

szTable=Dlg.m_strTableName;

//새로운 테이블을 만든다.

createNewTableDef(szTable);

//새로운 테이블의 NUMBER이라는 기본

//필드를 만들기 위해 필드 정보 구조체에 값을

//설정한다.

m_FI.m_strName = _T("NUMBER");

m_FI.m_nType = dbLong;

m_FI.m_lSize = 4;

m_FI.m_strDefaultValue = _T("");

m_FI.m_bRequired = FALSE;

m_FI.m_lAttributes = dbUpdatableField;

m_FI.m_nOrdinalPosition=0;

#if _MFC_VER == 0x400

m_FI.m_bAllowZeroLength = TRUE;

#else

m_FI.m_bAllowZeroLength = FALSE;

#endif;

m_FI.m_strValidationRule = _T("");

m_FI.m_strValidationText = _T("");

//새로운 필드를 만든다.

createNewField();

//테이블 정보를 다시 갱신한다.

appendTableDef();

//콤보 박스에 다시 테이블 리스트를 넣는다.

AddTableList();

//현재 필드의 수를 설정

m_nPosition++;

}

테이블 추가를 설정하면 새로운 테이블을 만들고 난후에 기본적인 한 개의 필드를 만듭니다. 이렇게 필드를 만든후에 테이블 정보를 갱신하여 줍니다. 그런다음 테이블 리스트를 콤보박스에 설정하여 줍니다. 이제 각각의 부함수들을 보겠습니다.

먼저 새로운 테이블을 만드는 함수 createNewTableDef 다음과 같습니다.

//새로운 테이블 만들기

BOOL CExDao2View::createNewTableDef(CString strTableName)

{

//테이블이 존재 하는 가 확인

if (IsExistentTable(strTableName))

{

AfxMessageBox(_T("테이블이 이미 존재합니다."));

return FALSE;

}

BOOL bCreate = TRUE;

//현재 테이블이 설정되어잇으면 해제하고

if(m_pTableDef)

{

m_pTableDef->Close();

delete m_pTableDef;

}

//새로운 테이블을 설정한다음

m_pTableDef = new CDaoTableDef(m_pDatabase);

TRY

{

//새로운 테이블만들기 시도

m_pTableDef->Create(strTableName);

}

CATCH (CDaoException, e) //실패하였을경우

{

bCreate=FALSE;

}

AND_CATCH (CMemoryException, e)

{

bCreate=FALSE;

}

END_CATCH

return bCreate;

}

여기서 우리가 궁금해 하는 것은 IsExistentTable 함수가 어떻게 생겼나와 TRY가 무엇인가 입니다. TRY{ } CATCH {} AND_CATCH{}END_CATCH는 예외 적용의 매크로 기능입니다. 쉽게 설명하면 황당한 경우나 허무한 경우를 당했을 경우 입니다. 방귀를 뀔려고 했는데 아뿔사 이런경우와 아뿔사 할려고 하였는데 방귀만 나오는 경우 즉 어떤 문제를 시도할려고 했는데 이상한 예외가 발생하는 경우에 사용합니다. 위의 내용에서 보면 Create 함수를 만들고자 시도 하였는데 황당하게 데이터베이스 에러가 나온다든지 허무하게 메모리 문제 때문에 에러가 나오면 이것을 모두 잡아 내라는 이야기 이지요. 이런 예외 적용을 할수 있는 함수들이 있습니다.그런 함수는 어떻게 알수 있는가 create함수를 보면 다음과 같이 나올것입니다.

virtual void Create( LPCTSTR lpszName, long lAttributes = 0, LPCTSTR	lpszSrcTable = NULL, LPCTSTR lpszConnect = NULL );

throw( CDaoException, CMemoryException );

위에서 throw란 본 함수는 예외가 적용되는데 데이터베이스 예외와 메모리 예외가 적용된다는 이야기 입니다. 이렇게 예외적용이 되면 시도할 경우 잘못되었을 때 이 예외를 감지 할수 있는 것입니다.

두 번째 궁금점 IsExistentTable 함수는 다음과 같습니다.

//현재 strTableName로 테이블이 존재 하는가?

BOOL CExDao2View::IsExistentTable(CString strTableName)

{

BOOL bFound = TRUE;

//테이블 정보 클래스를 만들고

CDaoTableDefInfo tableInfo;

TRY

{  //strTableName를 찾는다 없으면 예외적용으로 넘어감

m_pDatabase->GetTableDefInfo(strTableName, tableInfo);

}

CATCH (CDaoException, e)//없는경우

{

bFound=FALSE;

}

AND_CATCH (CMemoryException, e)

{

bFound=FALSE;

}

END_CATCH

return bFound;

}

GetTableDefInfo 함수는 현재 설정된 데이터베이스에서 테이블 정보를 넘겨주는 함

수입니다. 현재 설정된 정보가 없으면 FALSE를 리턴하게 되지요.

다음은 AddTableList 함수입니다. 이것은 현재 데이터베이스에 설정된 테이블 리스트를 얻어서 콤보박스에 입력하는 함수입니다.

//테이블 이름을 얻어서 콤보박스에 넣는다.

void CExDao2View::AddTableList()

{

int index = 0;

//콤보박스안에 내용을 모두 지우고

m_listTable.ResetContent();

//테이블 정보를 얻은다음

while (getTableInfo( index ))

{

//콤보박스에 삽입한다.

if (!(TableInfo.m_lAttributes & dbSystemObject)

&& !(TableInfo.m_lAttributes & dbHiddenObject))

m_listTable.AddString(TableInfo.m_strName);

index += 1;

}

}

<3>테이블 삭제

테이블 삭제를 클릭하면 현재 설정된 테이블이 삭제됩니다. 이때 실행되는 함수는

OnDeltable()  함수입니다. 내용은 다음과 같습니다.

//테이블 삭제

void CExDao2View::OnDeltable()

{

//콤보 박스에 선택된 데이터를 얻는다.

int num=m_listTable.GetCurSel();

if(num<0)

return;

CString szTable;

m_listTable.GetLBText(num,szTable);

//현재 선택된 데이터 테이블이 존재하면

if (IsExistentTable(szTable))

{

char temp[80];

sprintf(temp,"%s 테이블을 지울까요?",szTable);

if (AfxMessageBox(temp, MB_YESNO)==IDYES)

{

//테이블을 지운다.

deleteTable(m_strTableName);

m_listTable.SetCurSel(-1);

}

}

}

위에서 사용한 deleteTable함수는 다음과 같습니다.

//테이블 삭제 함수

void CExDao2View::deleteTable(CString strTableName)

{

//테이블이 존재 하지 않으면 리턴

if (!IsExistentTable(strTableName))

return;

//테이블을 삭제 한다.

m_pDatabase->DeleteTableDef(strTableName);

return;

}

<4>필드 추가

필드 추가 버튼을 클릭하면 실행되는 함수는 OnAddfield() 함수입니다. 필드 추가 버튼을 클릭하면 그림 3-3-3과 같은 대화상자 나타나면서 필드명과  형  크기 등을 입력받아서 필드정보 클래스 m_FI에 설정합니다.

(그림 3-3-3) 추가되는 필드 정보 입력 대화상자

OnAddfield()함수는 다음과 같습니다.

//필드 추가

void CExDao2View::OnAddfield()

{

//추가 될 필드 정보를 입력받는다.

CAddNewFieldDlg Dlg;

Dlg.m_nPosition=m_nPosition;

if(Dlg.DoModal()!=IDOK)

return;

//형을 설정한다.

switch(Dlg.m_nType)

{

case 0:

m_FI.m_nType=dbBoolean;

break;

case 1:

m_FI.m_nType=dbByte;

break;

case 2:

m_FI.m_nType=dbInteger;

break;

case 3:

m_FI.m_nType=dbLong;

break;

case 4:

m_FI.m_nType=dbSingle;

break;

case 5:

m_FI.m_nType=dbCurrency;

break;

case 6:

m_FI.m_nType=dbDate;

break;

case 7:

m_FI.m_nType=dbDouble;

break;

case 8:

m_FI.m_nType=dbText;

break;

case 9:

m_FI.m_nType=dbLongBinary;

break;

case 10:

m_FI.m_nType=dbMemo;

break;

}

//기타 필드 정보 값을 설정한다.

m_FI.m_strName = Dlg.m_strFieldName;

m_FI.m_lSize = Dlg.m_nSize;

m_FI.m_strDefaultValue = _T("");

m_FI.m_bRequired = FALSE;

m_FI.m_lAttributes = dbUpdatableField;

m_FI.m_nOrdinalPosition=m_nPosition;

#if _MFC_VER == 0x400

m_FI.m_bAllowZeroLength = TRUE;

#else

m_FI.m_bAllowZeroLength = FALSE;

#endif;

m_FI.m_strValidationRule = _T("");

m_FI.m_strValidationText = _T("");

//새로운 필드를 만들고

createNewField();

AddFieldInfo();

m_nPosition++;

}

createNewField는 m_FI에 설정된 값에 의해서 새로운 필드를 만드는 함수입니다.

내용은 다음과 같습니다.

//새로운 필드 만들기

BOOL CExDao2View::createNewField()

{

if (IsExistentField(m_FI.m_strName))

{

AfxMessageBox(_T("필드가 이미 존재 합니다."));

return FALSE;

}

m_pTableDef->CreateField(m_FI);

return TRUE;

}

IsExistentField는 현재 필드가 존재하는가를 검색하는 함수입니다. 내용은 다음과 같습니다.

//현재 필드가 존재하는가

BOOL CExDao2View::IsExistentField(CString strFieldName)

{

CDaoFieldInfo fieldInfo;

BOOL bFind;

bFind=TRUE;

TRY

{

//필드 정보를 얻고자 하는데

m_pTableDef->GetFieldInfo(strFieldName, fieldInfo);

}

//얻지 못하는 경우가 존재 안함

CATCH (CDaoException, e)

{

bFind=FALSE;

}

AND_CATCH (CMemoryException, e)

{

bFind=FALSE;

}

END_CATCH

return bFind;

}

<5>필드 삭제

필드 삭제 버튼을 클릭하면 현재 설정된 필드를 삭제합니다. 이때 수행되는 함수는OnDelfield() 입니다. 내용은 다음과 같습니다.

//필드 삭제

void CExDao2View::OnDelfield()

{

if(m_strChoField.GetLength()==0)

return;

if (IsExistentField(m_strChoField))

{

char temp[80];

sprintf(temp,"%s 필드를 지울까요?",m_strChoField);

if (AfxMessageBox(temp, MB_YESNO)==IDYES)

{

//필드을 삭제 한다.

deleteField(m_strChoField);

getFieldInfo(0);

AddFieldInfo();

}

}

}

deleteField함수는 다음과 같습니다.

//필드를 삭제한다.

BOOL CExDao2View::deleteField(CString strFieldName)

{

BOOL bSuccess = TRUE;

TRY

{

m_pTableDef->DeleteField(strFieldName);

}

CATCH (CDaoException, e)

{

bSuccess=FALSE;

}

AND_CATCH (CMemoryException, e)

{

bSuccess=FALSE;

}

END_CATCH

return bSuccess;

}

<6>특정 테이블 선택시 정보 출력

콤보 박스에서 특정 테이블을 선택하면 리스트 컨트롤에 해당 테이블의 정보가 나타납니다. 이때 실행되는 함수는 OnSelchangeTablelist 입니다. 소스는 다음과 같습니다.

//특정 테이블을 선택하였을경우

void CExDao2View::OnSelchangeTablelist()

{

//필드 정보를 리스트박스에 설정한다.

AddFieldInfo();

//필드 수를 하나 증가시켜 전체 필드수로 설정

m_nPosition++;

GetDlgItem(IDC_DELTABLE)->EnableWindow(TRUE);

}

AddFieldInfo함수는 현재 설정된 테이블의 정보를 리스트 컨트롤에 삽입하는 함수입니다. 소스는 다음과 같습니다.

//선택된 테이블 정보 리스트박스에 삽입

int CExDao2View::AddFieldInfo()

{

char temp[80];

int num=m_listTable.GetCurSel();

//리스트컨트롤의 모든데이터를 지운다

m_listData.DeleteAllItems();

if(num>=0)

{

m_listTable.GetLBText(num,temp);

m_strTableName=temp;

}

else

{

m_strTableName="";

return FALSE;

}

//테이블 존재 안하면 탈출

if(!IsExistentTable( m_strTableName))

return FALSE;

//테이블 정보를 개방하지 못했을경우 탈출

if (!openTableDef(m_strTableName))

return FALSE;

for(int i=0;;i++)

{

//필드 정보를 받아서

if (!getFieldInfo(i))

break;

//리스트 컨트롤에 삽입한다.

InsertFieldInfo(i);

}

return TRUE;

}

이제 ExDao2의 기본적이 내용을 모두 설명하였습니다. 나머지는 제공되느 CD의 에제 소스를 보시면서 이해를 하세요.