다음을 통해 공유


DAO 데이터베이스 클래스에 대 한 TN053: 사용자 정의 DFX 루틴

[!참고]

Visual C++ .NET에서는 포함된 DAO 클래스를 아직 사용할 수 있지만 Visual C++ 환경 및 마법사가 더 이상 DAO를 지원하지 않습니다.사용 하는 것이 좋습니다 OLE DB 템플릿 또는 ODBC와 MFC 새 프로젝트.DAO는 기존 응용 프로그램을 유지 관리하는 데만 사용할 수 있습니다.

이 기술 노트는 DAO 레코드 필드 교환 (DFX) 메커니즘을 설명합니다.DFX 루틴에, 무슨 이해를 돕는 DFX_Text 함수 예를 들어 자세히 설명 합니다.이 기술 노트에 정보를 추가 원본으로 코드에 대 한 다른 개별 DFX 함수 확인할 수 있습니다.하면 아마도 사용자 정의 DFX 루틴 자주 (ODBC 데이터베이스 클래스와 함께 사용) 사용자 지정 RFX 루틴을 해야 필요가 없습니다.

이 기술 노트를 포함:

  • DFX 개요

  • 예 DAO 레코드 필드 교환 및 동적 바인딩 사용

  • DFX 작동 방식

  • 사용자 정의 DFX 루틴의 용도

  • Dfx_text의 세부 정보

DFX 개요

DAO 레코드 필드 교환 메커니즘 (DFX) 검색 하 고 사용 하는 경우 데이터를 업데이트 하는 절차를 단순화 하기 위해 사용 되는 CDaoRecordset 클래스입니다.데이터 멤버를 사용 하는 프로세스를 간소화할 수 있는 CDaoRecordset 클래스입니다.파생 하 여 CDaoRecordset에서 파생 된 클래스의 각 필드에 테이블 또는 쿼리를 나타내는 데이터 멤버를 추가할 수 있습니다.이 "정적 바인딩" 메커니즘은 단순 하지만 선택한 데이터 반입/update 메서드는 모든 응용 프로그램에 대 한 수 없습니다.DFX 현재 레코드가 변경 될 때마다 모든 바운드 필드를 검색 합니다.통화 변경 되 면 모든 필드를 페치 하지 않아도 되는 성능에 민감한 응용 프로그램을 개발 하는 경우 "동적 바인딩"을 통해 CDaoRecordset::GetFieldValueCDaoRecordset::SetFieldValue 데이터 액세스 방법을 선택할 수 있습니다.

[!참고]

정적 및 동적 바인딩 사용 하는 혼합을 사용할 수 있도록 DFX와 동적 바인딩은 상호 배타적인 수 없습니다.

예제 1-DAO 레코드 필드 교환만 사용

(가정 CDaoRecordset -파생 클래스 CMySet 이미 열려 있습니다.)

// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();

예제 2-만 동적 바인딩 사용

(사용 가정 CDaoRecordset 클래스, rs, 및 이미 열려)

// Add a new record to the customers table
COleVariant  varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
COleVariant  varFieldValue2  (_T("Microsoft"), VT_BSTRT );
rs.AddNew();
rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs.Update();

예제 3-사용의 DAO 레코드 필드 교환 및 동적 바인딩

(가정 검색 직원 데이터로 CDaoRecordset-파생 클래스 emp)

// Get the employee's data so that it can be displayed
emp.MoveNext();

// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
   emp.GetFieldValue(_T("photo"), varPhoto);

// Display the data
PopUpEmployeeData(emp.m_strFirstName,
    emp.m_strLastName, varPhoto);

DFX 작동 방식

비슷한 방식으로 사용 하 여 MFC ODBC 클래스는 레코드 필드 교환 (RFX) 메커니즘은 DFX 메커니즘을 작동 합니다.RFX와 DFX는 원칙은 동일 하지만 차이가 많은 내부.거의 모든 코드가 개별 DFX 루틴에서 공유 되는 DFX 함수를 디자인이 했습니다.최고 수준의 DFX에만 몇 가지 되지 않습니다.

  • DFX 생성은 SQL 선택 절과 SQL 매개 변수 필요한 경우 절.

  • DFX는 DAO에서 사용 하는 바인딩 구조를 생성 GetRows 함수 (나중에 자세히).

  • DFX (더블 버퍼링 사용 되는 경우) 커밋되지 않은 필드를 검색 하는 데 사용 되는 데이터 버퍼 관리

  • DFX 관리는 NULLDIRTY 상태 배열 및 업데이트에 필요한 경우 값을 설정 합니다.

메커니즘은 DFX의 핵심 되는 CDaoRecordset 파생 클래스의 DoFieldExchange 함수.이 함수는 작업을 적절 한 형식의 개별 DFX 함수 호출을을 디스패치합니다.호출 하기 전에 DoFieldExchange 내부 MFC 함수는 작업 종류를 설정 합니다.다음은 다양 한 작업 종류와 간단한 설명을 보여 줍니다.

작업

설명

AddToParameterList

매개 변수 절을 작성합니다.

AddToSelectList

SELECT 절을 빌드

BindField

바인딩 구조를 설정합니다.

BindParam

매개 변수 값을 설정합니다.

픽스업

NULL 상태를 설정합니다.

AllocCache

더티 검사에 대 한 캐시를 할당합니다.

StoreField

현재 레코드를 캐시에 저장합니다.

LoadField

멤버 값을 복원 캐시

FreeCache

캐시를 해제합니다.

SetFieldNull

집합 상태 필드 & null 값

MarkForAddNew

의사 NULL 그렇지 않으면 커밋되지 않은 데이터 필드를 표시합니다.

MarkForEdit

표시 필드 커밋되지 않은 경우 캐시를 일치 하지 않습니다.

SetDirtyField

집합 값 더티로 표시 필드

다음 단원에서는 각 작업에 대해 자세히 설명 합니다 DFX_Text.

사용 하도록 DAO 레코드 필드 교환 프로세스에 대 한 이해 하는 데 가장 중요 한 기능입니다의 GetRows 의 함수는 CDaoRecordset 개체입니다.DAO는 GetRows 함수에 여러 가지 방법으로 작업할 수 있습니다.이 기술 노트만 간략하게 표시 됩니다 GetRows 이 기술 노트의 범위를 벗어난 것입니다.

DAO GetRows 에서 여러 가지 방법으로 작업할 수 있습니다.

  • 이 기록과 여러 필드의 데이터를 여러 번 페치할 수 있습니다.이 문제를 처리 하는 큰 데이터 구조 및 각 필드에 적절 한 오프셋으로 빠른 데이터 액세스 및 데이터 구조에 있는 각 레코드에 대 한 있습니다.MFC이 여러 레코드를 페치 메커니즘 활용 하지 않습니다.

  • 또 다른 방법은 GetRows 수 있습니다 작업입니다 프로그래머가 검색된 된 데이터의 데이터 레코드의 각 필드에 대해 바인딩 주소를 지정할 수 있도록 합니다.

  • DAO는 또한 "가변 길이 열에 대 한 호출자에 호출자가 메모리를 할당할 수 있도록 콜백" 합니다.두 번째 기능은이 클래스의 멤버에 직접 데이터 저장 하는 허용 뿐만 아니라 데이터 복사본의 수를 최소화 하는 이점이 있습니다 (해당 CDaoRecordset 클래스를 파생).이 두 번째 메커니즘을 MFC를 사용 하 여 데이터 멤버에 바인딩하는 방법입니다 CDaoRecordset 클래스를 파생 합니다.

사용자 정의 DFX 루틴의 용도

가장 중요 한 작업은 DFX 함수에서 구현에 필요한 데이터 구조를 성공적으로 호출 하려면 설정할 수 있어야이 토론에서 명백한입니다 GetRows.DFX 함수를 지원 해야 하는 다른 작업이 있지만 없음으로 중요 하거나 제대로 준비로 복잡 한 여러 가지는 GetRows 를 호출 합니다.

DFX 사용 온라인 설명서에 설명 되어 있습니다.기본적으로 두 가지 요구 사항이 있습니다.먼저 구성원을 추가 해야는 CDaoRecordset 클래스의 각 바인딩된 필드와 매개 변수를 파생 합니다.다음이 CDaoRecordset::DoFieldExchange 를 재정의 해야 합니다.데이터 멤버의 형식이 중요 합니다.데이터베이스의 필드 로부터 데이터를 일치 하거나 해당 형식으로 변환할 수 사용할 최소한 해야 합니다.예를 들어 long 정수를 같은 데이터베이스에서 숫자 필드 항상 텍스트로 변환 및 연결 수는 CString 구성원, 하지만 텍스트 필드는 데이터베이스에 있습니다 반드시 정수 (long)와 같은 숫자 표현, 변환한 후 정수 (long) 멤버에 바인딩할.DAO와 Microsoft Jet 데이터베이스 엔진은 변환 (대신 MFC) 담당합니다.

Dfx_text의 세부 정보

앞서 언급 했 듯이 DFX 작동 하는 방식을 설명 하는 가장 좋은 방법은 예를 통해 작동 하는 것.내부 구조를 통해 이동이 목적에 대 한 DFX_Text 적어도 기본적인 이해가 DFX 제공 하는 데 도움이 되는 아주 잘 작동 합니다.

  • AddToParameterList
    이 작업은 SQL 빌드 매개 변수가 절 ("Parameters <param name>, <param type> ... ;") Jet가 필요 합니다.각 매개 변수에 이름이 지정 되 고 (로 RFX 호출에서 지정 된)을 입력 합니다.함수를 참조 하십시오. CDaoFieldExchange::AppendParamType 함수는 개별 형식 이름을 참조 하십시오.경우 DFX_Text에서 사용 되는 형식인 text.

  • AddToSelectList
    빌드는 SQL 선택 절.이 단순히 DFX 호출에서 지정한 열 이름이 있는 그대로 꽤 똑바로 앞으로 추가 됩니다 ("SELECT <column name>, ...").

  • BindField
    가장 복잡 한 작업입니다.이 DAO 바인딩 구조를 사용 하 여 위에서 설명한 대로 GetRows 설정 됩니다.코드에서 볼 수 있듯이 DFX_Text 구조에 있는 정보의 유형을 사용 하는 DAO 형식을 포함 (DAO_CHAR 또는 DAO_WCHARDFX_Text).또한 사용 되는 바인딩 유형은 설정 됩니다.이전 단원에서 GetRows 간략하게만 설명 했지만 항상 MFC에서 사용 하는 바인딩 유형을 직접 주소 바인딩 임을 설명 하기에 충분 했습니다 (DAOBINDING_DIRECT).또한 가변 길이 열 바인딩 위한 (같은 DFX_Text) 콜백 바인딩은 사용 MFC 메모리 할당을 제어 하 고 주소 길이를 지정할 수 있도록 합니다.이 mfc 의미 항상 DAO 멤버 변수 바인딩을 직접 하므로 데이터를 넣으려면 "where" 알 수 있습니다.바인딩 구조의 나머지 주소 유형 열 바인딩 (바인딩 열 이름으로) 및 메모리 할당 콜백 함수 등으로 채워집니다.

  • BindParam
    이 호출 하는 간단한 작업입니다. SetParamValue 구성원 매개 변수에서 지정 된 매개 변수 값을 사용 합니다.

  • 픽스업
    NULL 각 필드에 대 한 상태입니다.

  • SetFieldNull
    이 작업으로 각 필드의 상태를 표시만 NULL 멤버 변수 값 설정 하 고 PSEUDO_NULL.

  • SetDirtyField
    호출 SetFieldValue 볼륨은 더티로 표시 하는 각 필드에 대해.

만 남은 모든 작업은 데이터 캐시를 사용 하 여 처리 합니다.데이터 캐시는 뭔가가 더 단순하게 만들기 위해 사용 되는 현재 레코드에 있는 데이터의 추가 버퍼입니다.예를 들어, "더티" 필드를 자동으로 검색할 수 있습니다.온라인 설명서에서 설명한 대로 완전히 또는 필드 수준에서 해제할 수 있습니다.버퍼의 구현을 지도 이용합니다.이 맵 "바인딩된" 필드의 주소를 동적으로 할당 된 데이터 복사본을 일치 시키는 데 사용 됩니다 (또는 CDaoRecordset 데이터 멤버를 파생).

  • AllocCache
    동적으로 캐시 된 필드 값을 할당 하 고 맵에 추가 합니다.

  • FreeCache
    캐시 된 필드 값을 삭제 하 고 지도에서 제거 됩니다.

  • StoreField
    현재 필드 값은 데이터 캐시에 복사합니다.

  • LoadField
    캐시 된 값에는 필드 멤버를 복사합니다.

  • MarkForAddNew
    현재 필드의 값이 아닌 인지 확인-NULL 및 필요한 경우 커밋되지 않은 데이터를 표시 합니다.

  • MarkForEdit
    데이터 캐시의 현재 필드 값을 비교 하 고 필요 하면 커밋되지 않은 데이터를 표시 합니다.

팁

표준 데이터 형식에 대 한 기존 DFX 루틴에서 사용자 정의 DFX 루틴을 모델링 합니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트