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가 이 함수 내에서 코드를 찾아 편집할 수 있습니다. 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
)에는 추가 선택적 인수가 있습니다.
각 DoDataExchange
함수에 둘 이상의 RFX_ 포함될 수 있습니다.
MFC와 함께 제공되는 모든 레코드 집합 필드 교환 루틴 목록은 'afxdb.h'를 참조하세요.
레코드 집합 필드 호출은 메모리 위치(일반적으로 데이터 멤버)를 등록하여 클래스의 CMySet
필드 데이터를 저장하는 방법입니다.
주의
레코드 집합 필드 함수는 클래스에서 CRecordset
만 작동하도록 설계되었습니다. 일반적으로 다른 MFC 클래스에서는 사용할 수 없습니다.
데이터의 초기 값은 표준 C++ 생성자에서 설정되며, 일반적으로 주석과 //}}AFX_FIELD_INIT
함께 //{{AFX_FIELD_INIT(CMylSet)
블록에 설정됩니다.
각 RFX_ 함수는 필드의 더티 상태 반환하는 것부터 필드 편집을 준비하기 위한 필드 보관에 이르기까지 다양한 작업을 지원해야 합니다.
호출 DoFieldExchange
하는 각 함수(예: SetFieldNull
) IsFieldDirty
는 호출에 대한 자체 초기화를 수행합니다 DoFieldExchange
.
작동 방식
레코드 필드 교환을 사용하려면 다음을 이해할 필요가 없습니다. 그러나 이 작업이 백그라운드에서 어떻게 작동하는지 이해하면 사용자 고유의 교환 절차를 작성하는 데 도움이 됩니다.
DoFieldExchange
멤버 함수는 멤버 함수와 매우 유사 Serialize
합니다. 이 함수는 클래스의 멤버 데이터에서 외부 형식(이 경우 ODBC 쿼리의 결과에서 열)으로 데이터를 가져오거나 설정하는 작업을 담당합니다. pFX 매개 변수는 데이터 교환을 수행하기 위한 컨텍스트이며 CArchive 매개 변수CObject::Serialize
와 비슷합니다. pFX(CFieldExchange
개체)에는 CArchive 방향 플래그의 일반화와 유사한 작업 표시기가 있습니다. RFX 함수는 다음 작업을 지원해야 할 수 있습니다.
BindParam
— ODBC에서 매개 변수 데이터를 검색할 위치를 나타냅니다.BindFieldToColumn
— ODBC에서 outputColumn 데이터를 검색/입금해야 하는 위치를 나타냅니다.Fixup
- 길이 설정CString/CByteArray
, NULL 상태 비트 설정MarkForAddNew
- AddNew 호출 이후 값이 변경된 경우 더티 표시MarkForUpdate
— 편집 호출 이후 값이 변경된 경우 더티 표시Name
— 더티 표시된 필드의 필드 이름 추가NameValue
— 더티 표시된 필드에 "<column name>="을 추가합니다.Value
— ""를 추가한 다음 구분 기호(예: ',' 또는 ')를 추가합니다.SetFieldDirty
— 상태 비트 더티 설정(즉, 변경됨) 필드SetFieldNull
— 필드의 null 값을 나타내는 상태 비트 설정IsFieldDirty
— 더티 상태 비트의 반환 값IsFieldNull
— null 상태 비트의 반환 값IsFieldNullable
- 필드에 NULL 값을 저장할 수 있으면 TRUE를 반환합니다.StoreField
— 보관 필드 값LoadField
— 보관된 필드 값 다시 로드GetFieldInfoValue
- 필드에 대한 일반 정보 반환GetFieldInfoOrdinal
- 필드에 대한 일반 정보 반환
사용자 확장
기본 RFX 메커니즘을 확장하는 방법에는 여러 가지가 있습니다. 다음을 수행할 수 있습니다
새 데이터 형식을 추가합니다. 예시:
CBookmark
새 교환 프로시저(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)); }
참고 항목
이러한 코드는 ClassWizard에서 편집할 수 없으며 특수 형식 주석 외부에서만 사용해야 합니다.
사용자 지정 RFX 작성
사용자 지정 RFX 함수를 작성하려면 기존 RFX 함수를 복사하여 사용자 고유의 용도로 수정하는 것이 좋습니다. 복사할 올바른 RFX를 선택하면 작업이 훨씬 쉬워질 수 있습니다. 일부 RFX 함수에는 복사할 항목을 결정할 때 고려해야 하는 몇 가지 고유한 속성이 있습니다.
RFX_Long
및 RFX_Int
: 가장 간단한 RFX 함수입니다. 데이터 값은 특별한 해석이 필요하지 않으며 데이터 크기가 고정됩니다.
RFX_Single
및 RFX_Double
: 위의 RFX_Long 및 RFX_Int 마찬가지로 이러한 함수는 간단하며 기본 구현을 광범위하게 사용할 수 있습니다. 그러나 명시적으로 참조되는 경우에만 런타임 부동 소수점 라이브러리를 로드할 수 있도록 dbrfx.cpp 대신 dbflt.cpp에 저장됩니다.
RFX_Text
및 RFX_Binary
: 이러한 두 함수는 문자열/이진 정보를 보유하기 위해 정적 버퍼를 미리 할당하고 이러한 버퍼를 등록하는 대신 ODBC SQLBindCol에 등록해야 합니다. 이 때문에 이러한 두 함수에는 많은 특수한 대/소문자 코드가 있습니다.
RFX_Date
: ODBC는 고유한 TIMESTAMP_STRUCT 데이터 구조에서 날짜 및 시간 정보를 반환합니다. 이 함수는 날짜 시간 데이터를 보내고 받기 위한 "프록시"로 TIMESTAMP_STRUCT 동적으로 할당합니다. 다양한 작업에서 C++ CTime
개체와 TIMESTAMP_STRUCT 프록시 간에 날짜 및 시간 정보를 전송해야 합니다. 이렇게 하면 이 함수가 상당히 복잡해지지만 데이터 전송에 프록시를 사용하는 방법의 좋은 예입니다.
RFX_LongBinary
: 열 바인딩을 사용하여 데이터를 수신하고 보내지 않는 유일한 클래스 라이브러리 RFX 함수입니다. 이 함수는 BindFieldToColumn 작업을 무시하고 대신 Fixup 작업 중에 들어오는 SQL_LONGVARCHAR 또는 SQL_LONGVARBINARY 데이터를 저장할 스토리지를 할당한 다음 SQLGetData 호출을 수행하여 할당된 스토리지로 값을 검색합니다. 데이터 값을 데이터 원본으로 다시 보낼 준비를 하는 경우(예: NameValue 및 Value 작업) 이 함수는 ODBC의 DATA_AT_EXEC 기능을 사용합니다. SQL_LONGVARBINARY 및 SQL_LONGVARCHARs 작업에 대한 자세한 내용은 Technical Note 45를 참조하세요.
고유한 RFX_ 함수를 작성할 때 지정된 작업을 구현하는 데 사용할 CFieldExchange::Default
수 있는 경우가 많습니다. 해당 작업의 기본값 구현을 확인합니다. 작업을 수행하는 경우 RFX_ 함수에서 작성할 작업을 위임할 CFieldExchange::Default
수 있습니다. dbrfx.cpp에서 호출 CFieldExchange::Default
의 예를 볼 수 있습니다.
RFX 함수의 시작 부분에 호출 IsFieldType
하고 FALSE를 반환하는 경우 즉시 반환하는 것이 중요합니다. 이 메커니즘은 outputColumns에서 매개 변수 작업이 수행되지 않도록 하고 그 반대의 경우도 마찬가지입니다(예: outputColumn 호출 BindParam
). 또한 outputColumns(m_nFields) 및 매개 변수(m_nParams)의 수를 자동으로 추적합니다. IsFieldType