TN043: RFX 루틴
[!참고]
온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.
이 참고가 레코드 필드 교환 (RFX) 아키텍처에 설명합니다.또한 작성 방법 설명에 RFX_ 프로시저입니다.
레코드 필드 교환 개요
모든 레코드 집합 필드 함수 C++ 코드로 이루어집니다.매직 매크로 없거나 특수 리소스입니다.메커니즘의 핵심에는 모든 파생된 레코드 집합 클래스에서 재정의 되는 가상 함수입니다.항상이 형태로 찾을 수 있습니다.
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
AFX 특수 형식 주석을 Classwizard이이 함수 내의 코드를 편집할 수 있습니다.외부의 특수 형식 주석은 클래스 마법사와 호환 되지 않는 코드를 넣어야 합니다.
위의 예제에서 <recordset_exchange_field_type_call> 폼에 다음과 같습니다.
pFX->SetFieldType(CFieldExchange::outputColumn);
및 <recordset_exchange_function_call> 폼에 다음과 같습니다.
RFX_Custom(pFX, "Col2", m_Col2);
대부분의 RFX_ 함수의 세 가지 인수를 위와 같이 있지만 일부 (예: 한RFX_Text및 RFX_Binary) 선택적 인수를 추가 해야 합니다.
둘 이상의 RFX_ 에서 각각 포함 될 수 있습니다 DoDataExchange 함수.
'Afxdb.h' MFC와 함께 제공 된 모든 레코드 필드 교환 루틴 목록을 참조 하십시오.
레코드 집합 필드 호출 된 필드 데이터를 저장할 메모리 위치 (일반적으로 데이터 멤버)를 등록 하는 방법에 CMySet 클래스입니다.
참고
Recordset 필드 함수 에서만 작동 하도록 설계 되는 CRecordset 클래스입니다.다른 MFC 클래스에서 일반적으로 사용할 수 없습니다.
데이터의 초기 값은 일반적으로 블록을 표준 C++ 생성자에서 설정 됩니다 //{{AFX_FIELD_INIT(CMylSet) 및 //}}AFX_FIELD_INIT 설명 합니다.
각 RFX_ 함수에 이르기까지 필드 편집 필드에 대 한 준비를 보관 하려면 필드의 변경 상태를 반환 하는 다양 한 작업을 지원 해야 합니다.
각 함수 호출 DoFieldExchange (예를 들어 SetFieldNull, IsFieldDirty), 자체 초기화 호출을 해결 하지 DoFieldExchange.
어떻게 작동 합니까?
레코드 필드 교환을 사용 하려면 다음을 이해 하지 않아도 됩니다.그러나 이것도 배후 도와 이해 exchange 프로시저를 직접 작성 합니다.
DoFieldExchange 멤버 함수인 유사는 Serialize 멤버 함수-을 가져오거나 데이터 설정 / / 클래스에서 멤버 데이터에서는 외부 형태로 (ODBC 쿼리 결과에서이 사례 열)에서 담당 합니다.pFX 매개 변수 데이터 교환 작업을 수행 하는 것과 유사 합니다는 CArchive 매개 변수에 CObject::Serialize.pFX (에 CFieldExchange 개체)에 비슷한 작업 표시기 있지만의 일반화가는 CArchive 방향 플래그.RFX 함수는 다음과 같은 작업을 지원 할 수 있습니다.
BindParam -나타내는 ODBC 매개 변수 데이터가 검색 합니다
BindFieldToColumn -나타내는 곳 ODBC 해야 검색/예금 outputColumn 데이터
픽스업 — 설정 CByteArray CString/ 길이, NULL 상태 비트를 설정 합니다.
MarkForAddNew -마크 더러운 AddNew 호출 이후에 값이 변경 된 경우
MarkForUpdate -마크 더러운 편집 호출 이후에 값이 변경 된 경우
이름 -볼륨은 더티로 표시 필드의 필드 이름 추가
NameValue -추가 "< 열 이름 > =?" 볼륨은 더티로 표시 필드
값 -추가 "?" 뒤 구분자로, 마음 ',' 또는 ' '
SetFieldDirty-상태 비트가 커밋되지 않은 데이터 (예: 설정변경 된) 필드
SetFieldNull-필드에 null 값을 나타내는 상태 비트를 설정 합니다.
IsFieldDirty-상태를 더티 비트의 값을 반환 합니다.
IsFieldNull-Null 상태 비트의 값을 반환 합니다.
IsFieldNullable-필드 NULL 값을 가질 수 있는 경우 TRUE 반환
StoreField -보관 필드 값
LoadField -다시 로드 보관 필드 값
GetFieldInfoValue -필드 일반 정보 반환
GetFieldInfoOrdinal -필드 일반 정보 반환
사용자 확장
기본 RFX 메커니즘을 확장 하는 방법은 여러 가지가 있습니다.옵션
새 데이터 형식을 추가 합니다.예를 들면 다음과 같습니다.
CBookmark
새 exchange 절차 (RFX_???)를 추가 합니다.
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName, BIGINT& value);
가 DoFieldExchange 멤버 함수를 조건부로 포함 RFX 호출 추가 또는 다른 유효한 C++ 문.
while (posExtraFields != NULL) { RFX_Text(pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues)); }
[!참고]
이러한 코드 클래스 마법사에서 편집할 수 없습니다 및 특수 형식 설명 밖에 사용 해야 합니다.
RFX는 사용자 지정 작성
사용자 고유의 사용자 지정 RFX 함수를 작성 하려면 기존 RFX 함수를 복사 하 고 목적에 맞도록 수정 하는 것이 좋습니다.복사 하 여 오른쪽 RFX 선택 작업을 훨씬 쉽게 만들 수 있습니다.일부 RFX 함수를 복사를 결정할 때 고려해 야 하는 일부 고유 속성 있습니다.
RFX_Long 및 RFX_Int:
이러한 간단한 RFX 함수입니다.데이터 값에 어떠한 특별 한 해석 하지 않아도 및 데이터 크기가 고정 되어 있습니다.RFX_Single 및 RFX_Double:
RFX_Long 및 RFX_Int 위, 이러한 함수 간단 하 고 수의 기본 구현에 광범위 하 게 사용 합니다.그러나 dbflt.cpp, dbrfx.cpp 대신 런타임에서 명시적으로 참조 된 경우에 부동 소수점 라이브러리를 로드할 수 있도록 저장 됩니다.RFX_Text 및 RFX_Binary:
이러한 두 가지 기능 문자열/이진 정보를 보유 하는 정적 버퍼 미리 할당 하 고 이러한 버퍼를 등록 및 값 대신 ODBC Sqlbindcol을 등록 해야 합니다.이 인해 이러한 두 함수는 많은 코드를 따로 있습니다.RFX_Date:
ODBC 날짜 및 시간 정보가 자신의 TIMESTAMP_STRUCT 데이터 구조를 반환합니다.이 기능은 동적으로 TIMESTAMP_STRUCT는 "프록시"로 날짜 시간 데이터 송수신 할당 합니다.다양 한 작업을 C++ 사이의 날짜 및 시간 정보를 전송 해야 CTime 개체 및 TIMESTAMP_STRUCT 프록시 합니다.이 함수가이 상당히 복잡해 집니다 하지만 데이터 전송에 대 한 프록시를 사용 하는 방법의 좋은 예입니다.RFX_LongBinary:
이 유일한 클래스 라이브러리 데이터를 주고 받을 수는 열 바인딩을 사용 하지 않는 RFX 함수입니다.이 함수 BindFieldToColumn 작업을 무시 하 고 대신 수정 작업 중 SQL_LONGVARCHAR 또는 SQL_LONGVARBINARY 들어오는 데이터를 보유 하는 스토리지 할당 다음 저장소에 할당 된 값을 검색 하 여 SQLGetData 호출을 수행.데이터 소스 (예: 작업) NameValue 및 값 데이터 값을 다시 보낼 준비 되 면이 함수는 ODBC의 DATA_AT_EXEC 기능을 사용 합니다.참조 기술 참고 45 SQL_LONGVARCHARs 및 SQL_LONGVARBINARY 작업에 대 한 자세한 내용은.
직접 쓸 때 RFX_ 함수를 자주 됩니다 사용할 수 CFieldExchange::Default 특정된 작업을 구현 합니다.요청한 작업에 대 한 기본 구현에 살펴봅니다.작업을 수행 하는 경우에 작성 해야 할 것 사용자 RFX_ 대리자를 함수는 CFieldExchange::Default. 전화의 예를 볼 수 있습니다 CFieldExchange::Default dbrfx.cpp에서
호출 하는 것이 중요 IsFieldType 시작 RFX 함수 및 즉시 FALSE를 반환 하는 경우 반환 합니다.이 메커니즘에서 수행 중인 작업이 매개 변수를 유지 outputColumns, 그 반대의 (전화 처럼 BindParam 에 있는 outputColumn).또한, IsFieldType 의 수를 자동으로 추적 outputColumns (m_nFields) 및 매개 변수 (m_nParams).