이 기술 노트에서는 DAO 레코드 필드 교환 (DFX) 메커니즘을 설명합니다. DFX 루틴에서 무슨 일이 일어나는가 이해 하려면 DFX_Text 함수 예제로 자세히 설명 하겠습니다. 이 기술 노트 정보의 추가 원본으로 검사할 수 있습니다 단순히 코드를 다른 개별 DFX 함수.당신은 아마 필요 하지 않습니다 사용자 정의 DFX 루틴 자주 사용자 지정 RFX 루틴 (ODBC 데이터베이스 클래스와 함께 사용) 할 수도 있습니다.
이 기술 노트 포함:
DFX 개요
DAO 레코드 필드 교환 메커니즘 (DFX) 검색 및 CDaoRecordset 클래스를 사용 하는 경우 데이터를 업데이트 하는 절차를 단순화 하기 위해 사용 됩니다. 프로세스는 CDaoRecordset 클래스의 데이터 멤버의 사용을 통해 간소화 됩니다. CDaoRecordset에서 파생 하 여 파생된 클래스를 나타내는 테이블 또는 쿼리의 각 필드에 데이터 멤버를 추가할 수 있습니다. 이 "정적 바인딩" 메커니즘은 간단 합니다, 하지만 그것은 모든 응용 프로그램에 대 한 선택의 데이터 반입/update 메서드 되지 않을 수 있습니다. DFX는 현재 레코드가 변경 될 때마다 모든 바운드 필드를 검색 합니다. 통화 변경 될 때 모든 필드를 가져오는 필요로 하지 않는 성능에 민감한 응용 프로그램을 개발 하는 경우 있을 수 있습니다 "동적 바인딩" CDaoRecordset::GetFieldValue 와 CDaoRecordset::SetFieldValue 를 통해 데이터 액세스 선택 방법。
메모nbsp;??DFX와 동적 바인딩 되지 상호 배타적인 정적 및 동적 바인딩 사용 하는 하이브리드를 사용할 수 있습니다(&N).
(가정 CDaoRecordset -파생된 클래스 CMySet 이미 열려)
/ / Customers 테이블에 새 레코드를 추가
myset입니다.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset입니다.해쉬
예제 2-사용만 동적 바인딩
(가정 CDaoRecordset 클래스를 사용 하 여 rs , 그것은 이미 열려)
/ / Customers 테이블에 새 레코드를 추가
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / 참고: VT_BSTRT 기본 유니코드 대신 ANSI로 string 형식 플래그
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
rs입니다.AddNew();
rs입니다.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs입니다.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs입니다.해쉬(&N)
예제 3-DAO 레코드 필드 교환 및 동적 바인딩 사용
(검색 직원 데이터로 CDaoRecordset가정-파생 클래스 emp )
/ / 표시 될 수 있도록 직원의 데이터를 얻을
emp입니다.MoveNext();
/ / 사용자가 직원의 사진을 보고 싶어 하는 경우
/ / 그것을 인출
COleVariant varPhoto;
경우 (bSeePicture)
emp입니다.GetFieldValue(_T("photo"), varPhoto);
/ / 데이터 표시
PopUpEmployeeData (emp.m_strFirstName,
emp.m_strLastName, varPhoto)
DFX 메커니즘 활용 하는 MFC ODBC 클래스에 의해 레코드 필드 RFX (교환) 메커니즘을 비슷한 방식으로 작동 합니다. RFX와 DFX priciples 동일 하지만 수많은 내부 차이점이 있습니다. DFX 함수 디자인 개별 DFX 루틴에 의해 공유 되는 사실상 모든 코드 등 이었다. 최고 수준의 DFX만 않습니다 몇 가지。
DFX의 핵심 메커니즘 CDaoRecordset 파생 클래스의 DoFieldExchange 함수입니다. 이 함수는 적절 한 작업 유형의 개별 DFX 함수를 호출을 디스패치합니다. 내부 MFC DoFieldExchange 를 호출 하기 전에 함수 작업 유형을 설정 합니다. 다음 목록은 다양 한 작업 종류 및 간단한 설명。
| 작업 | 설명 |
| AddToParameterList | 매개 변수 절을 빌드 |
| AddToSelectList | 빌드 SELECT 절 |
| BindField | 바인딩 구조를 설정 |
| BindParam | 매개 변수 값 설정 |
| 수정 | NULL 상태 설정 |
| AllocCache | 더러운 검사에 대 한 캐시를 할당 |
| StoreField | 현재 레코드가 캐시에 저장 |
| LoadField | 멤버 값을 복원 캐시 |
| FreeCache | 캐시를 해제 |
| SetFieldNull | 설정 필드 상태 amp; NULL 값(&A) |
| MarkForAddNew | 표시 필드 더러운 아니라면 의사 NULL |
| MarkForEdit | 표시 필드 더러운 경우 캐시를 일치 하지 않습니다. |
| SetDirtyField | 설정 필드 커밋되지 않은 것으로 표시 하는 값 |
다음 섹션에서 각 작업 설명 하겠습니다 자세히 DFX_Text 에 대 한。
DAO 레코드 필드 교환 프로세스에 대 한 이해를 가장 중요 한 기능은 ICDaoRecordset 개체의 GetRows 함수를 사용 합니다. DAO GetRows 함수는 여러 가지 방법으로 작업할 수 있습니다. 이 기술 노트는 간략하게만 설명 GetRows 이 기술 노트의 범위를 벗어났습니다.
DAO getrows에서는 여러 가지 방법으로 작업할 수 있습니다.
그것은 DFX 함수에서 구현 하는 가장 중요 한 작업은 성공적으로 GetRows를 호출 하려면 필요한 데이터 구조를 설정 하는 기능 해야 합니다.이 토론에서 명백한. DFX 함수 뿐만 아니라, 지원 해야 하는 다른 작업의 번호 하지만 아무도 중요 한도 제대로 GetRows 에 대 한 준비로 복잡 한으로 전화。
DFX 사용 하 여 온라인 설명서에 설명 되어 있습니다. 기본적으로, 거기에 2 요구 사항. 첫째, 각 바인딩된 필드 및 매개 변수 CDaoRecordset 파생 클래스에 멤버를 추가 해야 합니다. 다음이 CDaoRecordset::DoFieldExchange 재정의 해야 합니다. 데이터 멤버의 형식을 유의 하는 것이 중요 합니다. 그것은 데이터베이스에 있는 필드의 데이터와 일치 해야 또는 적어도 해당 유형에 convertable 될. Long integer와 같은 데이터베이스의 예를 들어 숫자 필드를 텍스트로 변환 하 고 CString 멤버에 바인딩된 항상 수 하지만 데이터베이스의 텍스트 필드 정수 (long)와 같은 숫자 표현으로 변환 하 고 long 정수를 멤버에 바인딩된 반드시 있습니다. DAO와 Microsoft Jet 데이터베이스 엔진은 변환 (대신 MFC)에 대 한 책임이。
앞에서 설명 했 듯이, 아마 DFX 작동 하는 방법을 설명 하는 가장 좋은 방법은 단순히 예를 통해 작동 하는. 이 목적을 위해 DFX_Text 내부를 통과 해야 아주 잘 작동 DFX의 적어도 기본적인 이해를 제공 하는 데。
AddToParameterList
이 작업은 SQL 매개 변수 절 빌드 (" Parameters lt;param name>, <param type> ... ; ") Jet에 필요한. 각 매개 변수 라는 이며 RFX 호출에 지정 된) (로 형식화 됩니다. 개별 형식 이름 참조를 CDaoFieldExchange::AppendParamType 함수 함수를 참조 하십시오. DFX_Text의 경우에 사용 되는 형식이text。
AddToSelectList
선택 SQL 절을 작성합니다. 이것은 꽤 곧장 앞으로 DFX 호출 하 여 지정 된 열 이름은 단순히 추가 (" SELECT lt;column name>, ... ")。
BindField
-지금까지 대부분의 작업의 복잡 한. 듯이 이것이 GetRows 에서 사용 하는 DAO 바인딩 구조를 설정 됩니다. DFX_Text 코드에서 볼 수 있는 종류의 정보 구조를 DAO 유형이 포함 사용 (DAO_CHAR 또는 DAO_WCHAR DFX_Text의 경우). 또한, 사용 하는 바인딩의 종류는 또한 설정 됩니다. 이전 섹션에서 GetRows 는 간략하게만 설명 했다 하지만 MFC에서 사용 하는 바인딩 유형을 직접 주소 바인딩 (DAOBINDING_DIRECT)은 항상 설명 하기에 충분 했다. 또한 ( DFX_Text)와 같은 가변 길이 열 바인딩 MFC 메모리 할당을 제어 하 고 올바른 길이의 주소를 지정할 수 있도록 콜백 바인딩이 사용 됩니다. 이 의미는 MFC가 DAO "where" 따라서 멤버 변수에 직접 바인딩할 수 있도록 데이터를 넣어 말할 항상 수 있습니다. 바인딩 구조의 나머지 메모리 할당 콜백 함수 주소 열 바인딩 (바인딩 열 이름)의 종류 같은 것 들으로 가득。
BindParam
이것은 매개 변수 멤버에 지정 된 매개 변수 값과 함께 SetParamValue 를 호출 하는 간단한 작업。
수정
각 필드에 대 한 NULL 상태에서 채우기。
SetFieldNull
이 작업만 NULL 로 각 필드의 상태를 표시 하 고 PSEUDO_NULL 을 멤버 변수의 값으로 설정。
SetDirtyField
각 필드에 대 한 호출 SetFieldValue 더러운 표시。
모든 남은 작업만 데이터 캐시를 사용 하 여 처리 합니다. 데이터 캐시는 특정 것 들을 간단 하 게 하는 데 사용 하는 현재 레코드에 있는 데이터의 추가 버퍼입니다. 예를 들어 "더러운" 필드 자동으로 검색 될 수 있습니다. 온라인 설명서에서 설명한 대로 완전히 또는 필드 수준에서 해제 되어 있을 수 있습니다. 지도 사용 하는 버퍼의 구현. 이 지도 "바운드" 필드 (또는 CDaoRecordset derieved 데이터 멤버)의 주소와 함께 데이터의 동적으로 할당 된 복사본을 일치 시키는 데 사용。
AllocCache
동적으로 캐시 된 필드 값을 할당 하 고 지도 추가。
FreeCache
캐시 된 필드 값을 삭제 하 고 지도에서 제거。
StoreField
현재 필드 값이 데이터 캐시에 복사。
LoadField
캐시 된 값이 필드 멤버에 복사。
MarkForAddNew
현재 필드 값이 아닌 경우 확인-NULL 및 필요한 경우 더러운 마크。
MarkForEdit
데이터 캐시를 사용 하 여 현재 필드 값을 비교 하 고 필요한 경우 더러운 표시。
팁nbsp;??사용자 정의 DFX 루틴 표준 데이터 형식에 대 한 기존 DFX 루틴에 모델(&N)。
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)