ODBC &DAO 안명상
ODBC 개념 ODBC ODBC 등록 예제 database: namecard Open Database Connectivity DBMS엔진들과 연결하여 데이타베이스 응용 프로그램을 작성하는 API ODBC 등록 제어판-> ODBC 데이터 원본 관리자 예제 database: namecard Table: persons create table persons ( id int auto_increment, name varchar(10) primary key, tel varcahr(15), address varchar(50), bigo varchar(50) );
Project: NameCard Which database support Data source Recordset Type None Header file only Database view without file support Database view with file support Data source ODBC DAO Recordset Type Snapshot : 데이타베이스 이용이 끝난 다음 갱신내용 저장 Dynaset: 갱신이 되는 순간 바로 수정 Class 생성 CNameCardView의 base class 는 CRecordView CNameCardSet 클래스 추가로 생성 , Crecordset 상속
Project: NameCard CNameCardView CRecordset CObject CCmdTarget CWnd CView SCrollView CFormView CRecordView CNameCardView CRecordset을 상속받은 CNameCardSet 을 멤버변수로 가진다. CNameCardSet* m_pSet; CRrecordset 은 ODBC를 조작하기 위한 클래스이다. CNameCardView 는 FormView처럼 대화 상자 자원을 가지며, 데이타베이스를 컨트롤 할 수 있는 Crecordset 를 멤버변수로 가진다. CRecordset 데이타베이스를 로드하고, 데이타베이스의 레코드를 관리하는 클래스 테이블의 각각의 필드을 클래스의 멤버변수로 가지며, DoFieldExchange()함수를 이용하여 실제 테이블 필드와 연결 GetDefaultConnect() ->데이타베이스 연결 GetDefaultSQL() -> 연결된 데이타베이스의 특정 테이블과 연결 m_nDefaultType = snapshot;
Project: NameCard CRecordset 함수 리스트 함수명 내용 MoveFirst/Last 제일 처음/마지막 레코드로 이동 MoveNext/Prev 다음/이전 레코드로 이동 SetBookmark 북마크 AddNew 새로운 필드 추가 Delete 현재 레코드 삭제 Edit 데이타베이스 수정 가능상태 Update Crecordset의 멤버데이타 내용을 DB로 update Requery SQL 또는 함수로 설정된 것을 새롭게 query IsEOF 파일의 마지막 isBOF 파일의 처음 getRecordCout 레코드 수 m_strFilter SQL을 저장하는 변수 m_pDatabase Cdatabase형의 멤버로 실제 DB 컨트로 클래스
Project: NameCard CRecordView 자원과 Crecordset의 연결 컴파일 / 런 Resource: IDD_NAMECARD_FORM 이름, 전화번호, 주소, 비고에 대응하는 Edit 상자 설정 , 각 Edit 상자와 Crecordset 의 멤버변수와의 연결 예) IDC_NAME : m_pSet->m_name .. DoDataExchange() 함수는 위 설정을 유지 DDX_FieldText(pDX, IDC_NAME, m_pSet->m_name, m_pSet); 컴파일 / 런
Project: NameCard 데이터 입력 메뉴-> 레코드 입력 (IDD_INSERT) void CNameCardView::OnInsert() 생성 void CNameCardView::OnInsert() { m_pSet->MoveLast(); // 마지막 레코드로 이동 m_pSet->AddNew(); // 빈 레코드 하나 추가 UpdateData(TRUE); // 자원에 있는 데이타를 m_pSet으로 전송 m_pSet->Update(); //Crecordset(m_pSet)의 멤버 데이타 내용을 DB로 전송 m_pSet->Requery() ;// 변경 사항을 데이타베이스에 반영 m_pSet->MoveFirst(); UpdateData(FALSE); //m_pSet의 데이타를 자원으로 전송 } 문제점 : 현재 데이터를 특히 ( 주키 데이터를 변경 후 입력 입력하여야 함 )
Project:NameCard 데이터 수정 메뉴-> 레코드 입력 (IDD_MODERATE) oid CNameCardView::OnModerate() { // TODO: Add your command handler code here m_pSet->Edit(); // 현재 레코드를 를 수정가능 상태로 전환 UpdateData(TRUE); //자원에 있는 데이타를 m_pSet으로 전송 m_pSet->Update(); m_pSet->Requery(); m_pSet->MoveFirst(); UpdateData(FALSE); //m_pSet의 데이타를 자원으로 전송 }
Project:NameCard 데이터 검색 메뉴-> 레코드 검색 (IDD_SEEKNAME) m_pSet->m_strFilter 에 질의 설정 후 Requery 실행 void CNameCardView::OnSeekname() { UpdateData(TRUE); //자원에 있는 데이타를 m_pSet으로 전송 m_pSet->m_strFilter.Format("name='%s'",m_pSet->m_name); m_pSet->Requery(); UpdateData(FALSE); }
Project:NameCard CRecordView 와 document의 관계 public class CNameCardDoc: public Cdocument { … public: CNameCardSet m_nameCardSet; } void CNameCardView::OnInitialUpdate() { m_pSet = &GetDocument()->m_nameCardSet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } CNameCardSet* m_pSet; // 멤버변수
Project:NameCardDAO DAO CNameCardDAOView CNameCardDAOset 단일 컴퓨터용 데이타베이스 라이브러리 Data Source 선택: DAO CNameCardDAOView CDaoRecordView를 상속 CRecordView 와 기능이 거의 같으며 단 CDaoRecordView DAO를 핸들링하는 CDaoRecordset을 m_pSet으로 가짐 CNameCardDAOset CDaoRecordset 를 상속
Program improvement 검색시 다이얼로그 실행 다이얼로그 IDD_SNAME 생성 , Edit_Box을 m_search_name으로 매핑 void CNameCardView::OnSeekname() { CIDD_SNAME *pdlg=new CIDD_SNAME; if( pdlg->DoModal()==IDOK) m_pSet->m_strFilter.Format("name='%s'",pdlg->m_search_name); m_pSet->Requery(); UpdateData(FALSE); }