430 likes | 757 Views
데이터베이스 프로그래밍 인터페이스. 전용 (Proprietary) 프로그래밍 인터페이스 각 DBMS 회사마다 제공하는 프로그래밍 인터페이스 속도나 효율면에서 우수하지만 DBMS 에 종속적이기 때문에 , 하나의 프로그램으로 다양한 종류의 DBMS 로 접근하기 어려움 공용 (Universal) 프로그래밍 인터페이스 다양한 DBMS 를 하나의 일관된 인터페이스로 다룰 수 있도록 만든 프로그래밍 인터페이스
E N D
데이터베이스 프로그래밍 인터페이스 • 전용(Proprietary) 프로그래밍 인터페이스 • 각 DBMS 회사마다 제공하는 프로그래밍 인터페이스 • 속도나 효율면에서 우수하지만 DBMS에 종속적이기 때문에, 하나의 프로그램으로 다양한 종류의 DBMS로 접근하기 어려움 • 공용(Universal) 프로그래밍 인터페이스 • 다양한 DBMS를 하나의 일관된 인터페이스로 다룰 수 있도록 만든 프로그래밍 인터페이스 • 하나의 프로그램으로 다양한 DBMS에 접근할 수 있으며, 기반 DBMS를 바꾸더라도 최소한의 코드 수정만으로 동일한 동작을 보장함
윈도우 데이터베이스 프로그래밍 인터페이스 (1/3) • DAO • 마이크로소프트 제트(Jet) 데이터베이스 엔진을 이용하여 데이터베이스에 접근하기 위한 인터페이스 • MFC의 CDaoDatabase 클래스 등을 이용하여 프로그래밍 가능 • ODBC • 하나의 인터페이스로 다양한 종류의 DBMS를 접근할 수 있도록 만든 성공적인 공개 인터페이스 • MFC의 CDatabase 클래스 등을 이용하여 프로그래밍 가능
윈도우 데이터베이스 프로그래밍 인터페이스 (2/3) • RDO • COM 기술을 이용해서 ODBC를 포장한 것 • OLE DB • ODBC의 성공을 바탕으로 만든 새로운 공개 인터페이스 • COM 기술을 이용한 새로운 데이터베이스 프로그래밍 방법 • OLE DB 공급자를 통해 다양한 종류의 DBMS에 접근할 수 있으며, ODBC용 OLE DB 공급자를 사용하여 기존의 ODBC도 지원
윈도우 데이터베이스 프로그래밍 인터페이스 (3/3) • ADO • OLE DB가 제공하는 기능을 좀더 쉽게 사용할 수 있도록 만든 COM 기술 기반의 프로그래밍 인터페이스 • OLE DB에 기반하기 때문에 다양한 종류의 데이터베이스를 다룰 수 있고, 고성능을 냄. 언어 독립적이어서 베이직, C/C++, 자바 등 다양한 언어로 프로그래밍 가능
ODBC 구조 (1/5) • ODBC 구조 응용 프로그램 ODBC API 드라이버 관리자(ODBC32.DLL) ODBC API 드라이버 드라이버 드라이버 데이터 원본 데이터 원본 데이터 원본
ODBC 구조 (2/5) • 응용 프로그램 • ODBC API를 통해 드라이버 관리자와 통신 • 데이터베이스에 연결할 때는 ODBC API를 사용하지만, 실제 데이터를 다룰 때는 관계형 데이터베이스 조작 언어인 SQL을 사용 • 드라이버 관리자 • 응용 프로그램과 특정 DBMS 드라이버를 매개 • 응용 프로그램이 요구한 데이터베이스를 접근할 수 있도록 ODBC 드라이버를 로드하고, 응용 프로그램과 동일한 API를 이용하여 드라이버의 함수를 호출
ODBC 구조 (3/5) • 드라이버 • ODBC API의 구현을 제공하며 특정 DBMS에 종속적임 • DBMS가 자체 엔진을 제공하는 경우, 드라이버는 SQL문을 DBMS에게 전달. 엑셀 파일과 같이 자체 엔진을 제공하지 않는 경우에는 드라이버가 직접 SQL문을 처리 • 데이터 원본 • ODBC에서 데이터베이스에 접근하기 위해 필요한 정보와 데이터베이스 자체를 총칭하는 용어 • 데이터 원본이 있어야만 ODBC를 이용한 데이터베이스 접근 가능
ODBC 구조 (4/5) • ODBC 데이터 원본 관리자
ODBC 구조 (5/5) • 데이터 원본 종류
MFC ODBC 클래스 (1/4) • MFC 클래스 계층도
MFC ODBC 클래스 (2/4) • 데이터베이스 클래스 • CDatabase 클래스는 데이터베이스와의 연결을 나타내며, 이 객체를 통해 해당 데이터베이스를 조작함 • 데이터베이스에 접근하려면 가장 먼저 CDatabase 객체를 만들어야 함 CDatabase db; db.OpenEx(...); ... db.Close();
MFC ODBC 클래스 (3/4) • 레코드셋 클래스 • CRecordSet 클래스는 레코드셋을 나타내며, 데이터를 추가, 삭제, 갱신 등의 작업을 할 때 핵심적인 역할을 함 // 데이터베이스 객체 생성 CDatabase db; db.OpenEx(...); // 레코드셋 객체 생성 CRecordset rs(&db); rs.Open(...); // 데이터 추가, 삭제, 갱신, 검색, ... // 종료 rs.Close(); db.Close();
MFC ODBC 클래스 (4/4) • 예외 처리 클래스 • CDBException 클래스는 데이터베이스를 조작할 때 발생하는 오류를 나타냄 try { // 데이터베이스 조작 } catch(CDBException *e) { e->ReportError(); e->Delete(); }
MFC ODBC 프로그램 - 콘솔 (1/2) • 예제 코드 // ① 데이터베이스 객체 생성 CDatabase db; db.OpenEx("DSN=student", 0); // ② 레코드셋 객체 생성 CRecordset rs(&db); rs.Open(CRecordset::dynaset, "SELECT * FROM Table1"); // ③ 레코드 출력 CString str; while(!rs.IsEOF()){ rs.GetFieldValue(short(0), str); cout << (LPCTSTR)str << " ";
MFC ODBC 프로그램 - 콘솔 (2/2) • 예제 코드 (cont'd) rs.GetFieldValue(short(1), str); cout << (LPCTSTR)str << " "; rs.GetFieldValue(short(2), str); cout << (LPCTSTR)str << " "; rs.GetFieldValue(short(3), str); cout << (LPCTSTR)str << endl; rs.MoveNext(); } // ④ 종료 rs.Close(); db.Close();
주요 함수 (1/7) • 데이터베이스 객체 생성 • lpszConnectString • 사용할 데이터 원본 이름과 ID, 암호 등을 문자열로 넘겨줌. ID와 암호가 없을 경우 생략 가능(예) "DSN=Friends;UID=SA;PWD=abc123" • dwOptions • 비트 매스크로 옵션 지정, 기본값인 0을 사용하면읽기와 쓰기 모드로 데이터베이스를 접근함. BOOL CDatabase::OpenEx ( LPCTSTR lpszConnectString, DWORD dwOptions = 0 );
주요 함수 (2/7) • 레코드셋 객체 생성 • pDatabase • 데이터베이스 객체의 주소 CRecordset::CRecordset (CDatabase* pDatabase = NULL); BOOL CRecordset::Open ( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
주요 함수 (3/7) • 레코드셋 객체 생성 (cont'd) • nOpenType • CRecordset::dynaset, CRecordset::snapshot, CRecordset::dynamic, CRecordset::forwardOnly • lpszSQL • SQL SELECT 문을 사용하면 조건에 맞는 레코드셋을 얻을 수 있음 • dwOptions • 읽기 전용(CRecordset::readOnly), 추가 전용(CRecordset::appendOnly) 등 다양한 옵션
주요 함수 (4/7) • 레코드 출력 • 현재 레코드 변경 함수
주요 함수 (5/7) • 레코드 출력 (cont'd) • 현재 레코드 위치 판단 함수
주요 함수 (6/7) • 레코드 출력 (cont'd) • nIndex • 필드를 나타내는 인덱스(0부터 시작) • strValue • 해당 필드의 데이터가 저장됨 void CRecordset::GetFieldValue ( short nIndex, CString& strValue );
주요 함수 (7/7) • 종료 rs.Open(...); ... rs.Close(); rs.Open(...); // 새로운 레코드셋을 얻는다. ... rs.Close();
MFC ODBC 프로그래밍 - GUI • MFC 클래스 계층도
AppWizard 생성 코드 분석 (1/9) • 클래스 구성
AppWizard 생성 코드 분석 (2/9) • 레코드셋 클래스 class CExODBC2Set : public CRecordset { public: CExODBC2Set(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CExODBC2Set) // Field/Param Data //{{AFX_FIELD(CExODBC2Set, CRecordset) long m_Number; CString m_Name; BOOL m_Man; CString m_Phone; //}}AFX_FIELD ...
AppWizard 생성 코드 분석 (3/9) • 레코드셋 클래스 (cont'd) CExODBC2Set::CExODBC2Set(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CExODBC2Set) m_Number = 0; m_Name = _T(""); m_Man = FALSE; m_Phone = _T(""); m_nFields = 4; //}}AFX_FIELD_INIT m_nDefaultType = snapshot; }
AppWizard 생성 코드 분석 (4/9) • 레코드셋 클래스 (cont'd) CString CExODBC2Set::GetDefaultConnect() { return _T("ODBC;DSN=student"); } CString CExODBC2Set::GetDefaultSQL() { return _T("[Table1]"); }
AppWizard 생성 코드 분석 (5/9) • 레코드셋 클래스 (cont'd) void CExODBC2Set::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CExODBC2Set) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX, _T("[Number]"), m_Number); RFX_Text(pFX, _T("[Name]"), m_Name); RFX_Bool(pFX, _T("[Man]"), m_Man); RFX_Text(pFX, _T("[Phone]"), m_Phone); //}}AFX_FIELD_MAP }
데이터베이스 테이블 현재 레코드 Number Name Man Phone 레코드셋 CExODBC2Set { long m_Number; CString m_Name; BOOL m_Man; CString m_Phone; ... } AppWizard 생성 코드 분석 (6/9) • 레코드셋 클래스 (cont'd) • RFX(Record Field eXchange)
AppWizard 생성 코드 분석 (7/9) • 도큐먼트 클래스 class CExODBC2Doc : public CDocument { protected: // create from serialization only CExODBC2Doc(); DECLARE_DYNCREATE(CExODBC2Doc) // Attributes public: CExODBC2Set m_exODBC2Set; ...
AppWizard 생성 코드 분석 (8/9) • 뷰 클래스 class CExODBC2View : public CRecordView { protected: // create from serialization only CExODBC2View(); DECLARE_DYNCREATE(CExODBC2View) public: //{{AFX_DATA(CExODBC2View) enum{ IDD = IDD_EXODBC2_FORM }; CExODBC2Set* m_pSet; // NOTE: the ClassWizard will add data members here //}}AFX_DATA ...
AppWizard 생성 코드 분석 (9/9) • 뷰 클래스 (cont'd) void CExODBC2View::OnInitialUpdate() { m_pSet = &GetDocument()->m_exODBC2Set; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } CRecordset* CExODBC2View::OnGetRecordset() { return m_pSet; }
데이터베이스 테이블 현재 레코드 Number Name Man Phone 레코드셋 레코드 뷰 CExODBC2Set { long m_Number; CString m_Name; BOOL m_Man; CString m_Phone; ... } IDC_EDIT1 IDC_EDIT2 IDC_EDIT3 IDC_EDIT4 RFX DDX 레코드 다루기 (1/4) • 레코드 표시 • DDX와 RFX
레코드 다루기 (2/4) • 레코드 추가 • 레코드 변경 m_pSet->AddNew(); m_pSet->m_Number = 21195; m_pSet->m_Name = 김성희; m_pSet->m_Man = 0; m_pSet->m_Phone = 789-0987; m_pSet->Update(); m_pSet->Edit(); m_pSet->m_Phone = 789-1256; // 전화번호만 갱신 m_pSet->Update();
레코드 다루기 (3/4) • 레코드 삭제 • CRecordset::Delete()를 호출 삭제가 성공하면 반드시 다른 레코드로 스크롤 • 레코드셋 갱신 • 레코드 추가, 변경, 삭제 후 변경된 레코드 내용이 현재 레코드셋에 반영되게 하려면 CRecordset::Requery()를 호출하여 레코드셋을 새로 만듦
레코드 다루기 (4/4) • 레코드 필터링(검색) • 레코드 정렬 m_pSet->m_strFilter = "NAME = '김성희'"; m_pSet->Requery(); m_pSet->m_strSort = "NAME"; m_pSet->Requery();
ADO 프로그래밍 (1/4) • ADO의 장점 • 언어 독립적. 비주얼 베이직, 비주얼 C++, VB스크립트, 비주얼 J++, J스크립트 등 마이크로소프트가 제공하는 거의 모든 언어로 프로그래밍 가능 • 다양한 데이터에 대한 일관된 인터페이스를 제공. 관계형 데이터베이스는 물론이고 비관계형 데이터베이스나 일반 파일도 일관된 방법으로 다룰 수 있음 • 고성능이며 메모리, 네트워크 트래픽과 같은 자원을 적게 소모하도록 효율적으로 설계됨
ADO 프로그래밍 (2/4) • ADO와 OLE DB 응용 프로그램 ADO OLE DB 데이터
ADO 프로그래밍 (3/4) • 비주얼 C++를 이용한 ADO 프로그래밍 • ADO API를 직접 사용 • ActiveX 컨트롤을 이용 • ADO 관련 컨트롤 • ADO 데이터 컨트롤 • 데이터베이스에 대한 연결과 더불어 질의(Query)를 통해 레코드를 가져오는 역할을 하며, 레코드를 이동할 수 있는 버튼을 유저 인터페이스로 제공 • ADO 데이터 바운드 컨트롤 • 데이터 컨트롤과 연결해야만 사용할 수 있으며, 레코드를 다양한 형태로 화면에 표시
데이터 바운드 컨트롤 데이터 컨트롤 ADO OLE DB 데이터 베이스 ADO 프로그래밍 (4/4) • 데이터 컨트롤과 데이터 바운드 컨트롤