레코드 필드 교환: RFX 작동 방식
이 항목에서는 RFX 프로세스에 대해 설명합니다. 다음은 다음을 다루는 고급 항목입니다.
참고 항목
이 항목은 대량 행 페치가 구현되지 않은 CRecordset
에서 파생된 클래스에 적용됩니다. 대량 행 페치를 사용하는 경우 대량 레코드 필드 교환(대량 RFX)이 구현됩니다. 대량 RFX는 RFX와 비슷합니다. 차이점 을 이해하려면 레코드 집합: 대량으로 레코드 가져오기(ODBC)를 참조하세요.
RFX 및 레코드 집합
함께 가져온 레코드 집합 개체의 필드 데이터 멤버는 선택한 레코드 열을 포함하는 편집 버퍼를 구성합니다. 레코드 집합이 처음 열리고 첫 번째 레코드를 읽으려는 경우 RFX는 선택한 각 열을 적절한 필드 데이터 멤버의 주소에 바인딩(연결)합니다. 레코드 집합이 레코드를 업데이트하면 RFX는 ODBC API 함수를 호출하여 드라이버에 SQL UPDATE 또는 INSERT 문을 보냅니다. RFX는 필드 데이터 멤버에 대한 지식을 사용하여 쓸 열을 지정합니다.
프레임워크는 필요한 경우 콘텐츠를 복원할 수 있도록 특정 단계에서 편집 버퍼를 백업합니다. RFX는 새 레코드를 추가하기 전과 기존 레코드를 편집하기 전에 편집 버퍼를 백업합니다. 예를 들어 다음 AddNew
호출 후 편집 버퍼를 Update
복원합니다. 새로 변경된 편집 버퍼를 중단한 경우(예: 호출 Update
하기 전에 다른 레코드로 이동) 편집 버퍼가 복원되지 않습니다.
RFX는 데이터 원본과 레코드 집합의 필드 데이터 멤버 간에 데이터를 교환하는 것 외에도 바인딩 매개 변수를 관리합니다. 레코드 집합을 열면 모든 매개 변수 데이터 멤버가 생성되는 SQL 문의 CRecordset::Open
"?" 자리 표시자 순서로 바인딩됩니다. 자세한 내용은 Recordset: Recordset 매개 변수화(ODBC)를 참조하세요.
레코드 집합 클래스의 재정 DoFieldExchange
의는 모든 작업을 수행하여 양방향으로 데이터를 이동합니다. DDX(대화 상자 데이터 교환)와 마찬가지로 RFX에는 클래스의 데이터 멤버에 대한 정보가 필요합니다. 마법사는 마법사에서 지정한 필드 데이터 멤버 이름 및 데이터 형식에 따라 레코드 집합별 구현 DoFieldExchange
을 작성하여 필요한 정보를 제공합니다.
레코드 필드 교환 프로세스
이 섹션에서는 레코드 집합 개체가 열리고 레코드를 추가, 업데이트 및 삭제할 때 RFX 이벤트의 시퀀스에 대해 설명합니다. 레코드 집합을 여는 동안의 RFX 작업 시퀀스와 이 항목의 스크롤 중 RFX 작업 테이블 시퀀스는 RFX가 레코드 집합에서 명령을 처리 Move
하고 RFX가 업데이트를 관리하는 프로세스를 보여 줍니다. 이러한 프로세스 중에 DoFieldExchange 는 다양한 작업을 수행하기 위해 호출됩니다. m_nOperation
CFieldExchange 개체의 데이터 멤버는 요청된 작업을 결정합니다. 이 자료를 읽기 전에 레코드 집합: 레코드 집합이 레코드를 선택하는 방법(ODBC) 및 레코드 집합: 레코드 집합 업데이트 레코드(ODBC) 를 읽는 것이 유용할 수 있습니다.
RFX: 열 및 매개 변수의 초기 바인딩
다음 RFX 작업은 레코드 집합 개체의 Open 멤버 함수를 호출할 때 표시된 순서대로 발생합니다.
레코드 집합에 매개 변수 데이터 멤버가 있는 경우 프레임워크는 매개 변수를 레코드 집합의 SQL 문 문자열에 있는 매개 변수 자리 표시자에 바인딩하도록 호출
DoFieldExchange
합니다. 매개 변수 값의 데이터 형식 종속 표현은 SELECT 문에 있는 각 자리 표시자에 사용됩니다. 이는 SQL 문이 준비된 후 실행되기 전에 발생합니다. 문 준비에 대한 자세한 내용은::SQLPrepare
ODBC 프로그래머 참조의 함수를 참조하세요.프레임워크는 두 번째로 호출
DoFieldExchange
하여 선택한 열의 값을 레코드 집합의 해당 필드 데이터 멤버에 바인딩합니다. 그러면 레코드 집합 개체가 첫 번째 레코드의 열을 포함하는 편집 버퍼로 설정됩니다.레코드 집합은 SQL 문을 실행하고 데이터 원본은 첫 번째 레코드를 선택합니다. 레코드의 열은 레코드 집합의 필드 데이터 멤버에 로드됩니다.
다음 표에서는 레코드 집합을 열 때의 RFX 작업 시퀀스를 보여 줍니다.
레코드 집합을 여는 동안 RFX 작업 시퀀스
[operationName] | DoFieldExchange 작업 | 데이터베이스/SQL 작업 |
---|---|---|
1. 레코드 집합을 엽니다. | ||
2. SQL 문을 작성합니다. | ||
3. SQL을 보냅니다. | ||
4. 매개 변수 데이터 멤버를 바인딩합니다. | ||
5. 필드 데이터 멤버를 열에 바인딩합니다. | ||
6. ODBC는 이동을 수행하고 데이터를 채웁니다. | ||
7. C++에 대한 데이터를 수정합니다. |
레코드 집합은 ODBC의 준비된 실행을 사용하여 동일한 SQL 문으로 빠르게 다시 쿼리할 수 있도록 합니다. 준비된 실행에 대한 자세한 내용은 ODBC 프로그래머 참조를 참조하세요.
RFX: 스크롤
한 레코드에서 다른 레코드로 스크롤하면 프레임워크는 필드 데이터 멤버에 이전에 저장된 값을 새 레코드의 값으로 바꾸기 위해 호출 DoFieldExchange
합니다.
다음 표에서는 사용자가 레코드에서 레코드로 이동할 때의 RFX 작업 시퀀스를 보여 줍니다.
스크롤하는 동안 RFX 작업 시퀀스
[operationName] | DoFieldExchange 작업 | 데이터베이스/SQL 작업 |
---|---|---|
1. 호출 MoveNext 또는 다른 Move 함수 중 하나입니다. |
||
2. ODBC는 데이터를 이동하고 채웁니다. | ||
3. C++에 대한 데이터를 수정합니다. |
RFX: 새 레코드 추가 및 기존 레코드 편집
새 레코드를 추가하는 경우 레코드 집합은 편집 버퍼로 작동하여 새 레코드의 콘텐츠를 빌드합니다. 레코드를 추가하는 것과 마찬가지로 레코드 편집에는 레코드 집합의 필드 데이터 멤버 값 변경이 포함됩니다. RFX 관점에서 시퀀스는 다음과 같습니다.
레코드 집합의 AddNew 또는 Edit 멤버 함수를 호출하면 RFX가 현재 편집 버퍼를 저장하므로 나중에 복원할 수 있습니다.
AddNew
또는Edit
RFX가 변경된 필드 데이터 멤버를 검색할 수 있도록 편집 버퍼의 필드를 준비합니다.새 레코드에는 새 레코드와
AddNew
비교할 이전 값이 없으므로 각 필드 데이터 멤버의 값을 PSEUDO_NULL 값으로 설정합니다. 나중에 호출Update
할 때 RFX는 각 데이터 멤버의 값을 PSEUDO_NULL 값과 비교합니다. 차이가 있는 경우 데이터 멤버가 설정되었습니다. (PSEUDO_NULL 실제 Null 값이 있는 레코드 열과 동일하지 않으며 C++ NULL과 동일하지도 않습니다.호출
AddNew
과Update
달리 호출Edit
은Update
업데이트된 값을 PSEUDO_NULL 사용하지 않고 이전에 저장된 값과 비교합니다. 차이점은AddNew
비교를 위해 이전에 저장된 값이 없다는 것입니다.편집하려는 값 또는 새 레코드에 대해 채운 필드 데이터 멤버의 값을 직접 설정합니다. 여기에는 호출
SetFieldNull
이 포함될 수 있습니다.업데이트 호출은 2단계에서 설명한 대로 변경된 필드 데이터 멤버를 확인합니다(스크롤하는 동안 RFX 작업의 테이블 시퀀스 참조). 변경된 항목이 없으면 0을
Update
반환합니다. 일부 필드 데이터 멤버가 변경된 경우 레코드의 업데이트된Update
모든 필드에 대한 값을 포함하는 SQL INSERT 문을 준비하고 실행합니다.의 경우
AddNew
호출 전에 현재 레코드의 이전에 저장된 값을 복원하여 마무리합니다AddNew
.Update
따라서Edit
편집된 새 값이 그대로 유지됩니다.
다음 표에서는 새 레코드를 추가하거나 기존 레코드를 편집할 때의 RFX 작업 시퀀스를 보여 줍니다.
AddNew 및 편집 중 RFX 작업 시퀀스
[operationName] | DoFieldExchange 작업 | 데이터베이스/SQL 작업 |
---|---|---|
1. 전화 AddNew 또는 Edit . |
||
2. 편집 버퍼를 백업합니다. | ||
3. 필드 AddNew 데이터 멤버를 "clean" 및 Null로 표시합니다. |
||
4. 레코드 집합 필드 데이터 멤버에 값을 할당합니다. | ||
5. 전화 걸기 Update |
||
6. 변경된 필드를 확인합니다. | ||
7. 에 대한 AddNew SQL INSERT 문 또는 UPDATE 문을 작성합니다Edit . |
||
8. SQL을 보냅니다. | ||
9. 의 경우 AddNew 편집 버퍼를 백업된 내용으로 복원합니다. 의 경우 Edit 백업을 삭제합니다. |
RFX: 기존 레코드 삭제
레코드를 삭제할 때 RFX는 레코드가 삭제되고 레코드에서 이동해야 하므로 모든 필드를 NULL로 설정합니다. 다른 RFX 시퀀스 정보는 필요하지 않습니다.
참고 항목
RFX(레코드 필드 교환)
MFC ODBC 사용
매크로, 전역 함수 및 전역 변수
CFieldExchange 클래스
CRecordset::DoFieldExchange