다음을 통해 공유


레코드 집합: 대량 레코드 페치(ODBC)

이 항목은 MFC ODBC 클래스에 적용됩니다.

클래스 CRecordset 는 대량 행 페치를 지원합니다. 즉, 데이터 원본에서 한 번에 하나의 레코드를 검색하는 대신 단일 페치 중에 여러 레코드를 한 번에 검색할 수 있습니다. 파생 CRecordset 클래스에서만 대량 행 페치를 구현할 수 있습니다. 데이터 원본에서 레코드 집합 개체로 데이터를 전송하는 프로세스를 대량 레코드 필드 교환(Bulk RFX)이라고 합니다. -derived 클래스에서 CRecordset대량 행 페치를 사용하지 않는 경우 데이터는 RFX(레코드 필드 교환)를 통해 전송됩니다. 자세한 내용은 RFX(레코드 필드 교환)를 참조 하세요.

이 항목에서는 다음 내용을 설명합니다.

CRecordset에서 대량 행 가져오기를 지원하는 방법

레코드 집합 개체를 열기 전에 멤버 함수를 사용하여 행 집합 크기를 정의할 SetRowsetSize 수 있습니다. 행 집합 크기는 단일 페치 중에 검색해야 하는 레코드 수를 지정합니다. 대량 행 가져오기가 구현되면 기본 행 집합 크기는 25입니다. 대량 행 가져오기가 구현되지 않은 경우 행 집합 크기는 1로 고정된 상태로 유지됩니다.

행 집합 크기를 초기화한 후 Open 멤버 함수를 호출합니다. 여기서 대량 행 페치를 CRecordset::useMultiRowFetch 구현하려면 dwOptions 매개 변수의 옵션을 지정해야 합니다. 옵션을 추가로 설정할 CRecordset::userAllocMultiRowBuffers 수 있습니다. 대량 레코드 필드 교환 메커니즘은 배열을 사용하여 인출 중에 검색된 데이터의 여러 행을 저장합니다. 이러한 스토리지 버퍼는 프레임워크에서 자동으로 할당하거나 수동으로 할당할 수 있습니다. 옵션을 지정하면 CRecordset::userAllocMultiRowBuffers 할당을 수행합니다.

다음 표에서는 대량 행 가져오기를 지원하기 위해 제공하는 CRecordset 멤버 함수를 나열합니다.

멤버 함수 설명
CheckRowsetError 페치하는 동안 발생하는 오류를 처리하는 가상 함수입니다.
DoBulkFieldExchange 대량 레코드 필드 교환을 구현합니다. 데이터 원본에서 레코드 집합 개체로 여러 행의 데이터를 전송하기 위해 자동으로 호출됩니다.
GetRowsetSize 행 집합 크기에 대한 현재 설정을 검색합니다.
GetRowsFetched 지정된 인출 후에 실제로 검색된 행 수를 알려줍니다. 불완전한 행 집합을 가져오지 않는 한 대부분의 경우 행 집합 크기입니다.
GetRowStatus 행 집합 내의 특정 행에 대한 페치 상태를 반환합니다.
RefreshRowset 행 집합 내의 특정 행의 데이터와 상태를 새로 고칩니다.
SetRowsetCursorPosition 커서를 행 집합 내의 특정 행으로 이동합니다.
SetRowsetSize 행 집합 크기에 대한 설정을 지정된 값으로 변경하는 가상 함수입니다.

특별 고려 사항

대량 행 가져오기는 성능 향상이지만 특정 기능은 다르게 작동합니다. 대량 행 페치를 구현하기 전에 다음을 고려합니다.

  • 프레임워크는 자동으로 멤버 함수를 DoBulkFieldExchange 호출하여 데이터 원본에서 레코드 집합 개체로 데이터를 전송합니다. 그러나 데이터는 레코드 집합에서 데이터 원본으로 다시 전송되지 않습니다. AddNew, Edit또는 DeleteUpdate 멤버 함수를 호출하면 어설션이 실패합니다. 현재는 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 CRecordset ODBC API SQLSetPos함수를 사용하여 고유한 함수를 작성할 수 있습니다. 자세한 SQLSetPos내용은 ODBC 프로그래머 참조를 참조하세요.

  • 멤버 함수IsDeleted, IsFieldDirty, IsFieldNullIsFieldNullableSetFieldDirtySetFieldNull 대량 행 페치를 구현하는 레코드 집합에는 사용할 수 없습니다. 그러나 대신, 대신 GetODBCFieldInfo IsFieldNullable에 호출 GetRowStatus IsDeleted할 수 있습니다.

  • 작업은 Move 행 집합별로 레코드 집합의 위치를 변경합니다. 예를 들어 초기 행 집합 크기가 10인 100개의 레코드가 있는 레코드 집합을 여는 경우를 가정해 보겠습니다. Open 는 행 1에서 10까지의 행을 가져오며 현재 레코드는 행 1에 배치됩니다. 다음 행이 아닌 다음 행 집합을 가져오는 호출 MoveNext 입니다. 이 행 집합은 행 11부터 20까지의 행으로 구성되며 현재 레코드는 행 11에 배치됩니다. MoveNext Move( 1 ) 대량 행 페치를 구현할 때는 동일하지 않습니다. Move( 1 ) 는 현재 레코드에서 1행을 시작하는 행 집합을 가져옵니다. 이 예제에서 호출 후 호출 Move( 1 ) Open 하면 현재 레코드가 행 2에 배치된 2~11행으로 구성된 행 집합을 가져옵니다. 자세한 내용은 멤버 이동 함수를 참조하세요.

  • 레코드 필드 교환과 달리 마법사는 대량 레코드 필드 교환을 지원하지 않습니다. 즉, 필드 데이터 멤버를 수동으로 선언하고 대량 RFX 함수에 대한 호출을 작성하여 수동으로 재정 DoBulkFieldExchange 의해야 합니다. 자세한 내용은 클래스 라이브러리 참조의 레코드 필드 교환 함수참조하세요.

대량 레코드 필드 교환을 구현하는 방법

대량 레코드 필드 교환은 데이터 원본에서 레코드 집합 개체로 데이터의 행 집합을 전송합니다. Bulk RFX 함수는 배열을 사용하여 이 데이터를 저장하고 배열을 사용하여 행 집합에 각 데이터 항목의 길이를 저장합니다. 클래스 정의에서 필드 데이터 멤버를 포인터로 정의하여 데이터 배열에 액세스해야 합니다. 또한 길이 배열에 액세스하려면 포인터 집합을 정의해야 합니다. 매개 변수 데이터 멤버는 포인터로 선언해서는 안 됩니다. 대량 레코드 필드 교환을 사용할 때 매개 변수 데이터 멤버를 선언하는 것은 레코드 필드 교환을 사용할 때 선언하는 것과 같습니다. 다음 코드는 간단한 예제를 보여줍니다.

class MultiRowSet : public CRecordset
{
public:
   // Field/Param Data
      // field data members
      long* m_rgID;
      LPSTR m_rgName;

      // pointers for the lengths
      // of the field data
      long* m_rgIDLengths;
      long* m_rgNameLengths;

      // input parameter data member
      CString m_strNameParam;

   .
   .
   .
}

이러한 스토리지 버퍼를 수동으로 할당하거나 프레임워크에서 할당을 수행하게 할 수 있습니다. 버퍼를 직접 할당하려면 멤버 함수에서 CRecordset::userAllocMultiRowBuffers dwOptions 매개 변수 Open 옵션을 지정해야 합니다. 배열의 크기를 행 집합 크기와 적어도 동일하게 설정해야 합니다. 프레임워크가 할당을 수행하도록 하려면 NULL에 대한 포인터를 초기화해야 합니다. 이 작업은 일반적으로 레코드 집합 개체의 생성자에서 수행됩니다.

MultiRowSet::MultiRowSet( CDatabase* pDB )
   : CRecordset( pDB )
{
   m_rgID = NULL;
   m_rgName = NULL;
   m_rgIDLengths = NULL;
   m_rgNameLengths = NULL;
   m_strNameParam = "";

   m_nFields = 2;
   m_nParams = 1;

   .
   .
   .
}

마지막으로 멤버 함수를 재정의 DoBulkFieldExchange 해야 합니다. 필드 데이터 멤버의 경우 Bulk RFX 함수를 호출합니다. 매개 변수 데이터 멤버에 대해 RFX 함수를 호출합니다. SQL 문 또는 저장 프로시저를 Open전달하여 레코드 집합을 연 경우 대량 RFX 호출을 만드는 순서는 레코드 집합의 열 순서에 해당해야 합니다. 마찬가지로 매개 변수에 대한 RFX 호출 순서는 SQL 문 또는 저장 프로시저의 매개 변수 순서에 해당해야 합니다.

void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
   // call the Bulk RFX functions
   // for field data members
   pFX->SetFieldType( CFieldExchange::outputColumn );
   RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                  &m_rgID, &m_rgIDLengths );
   RFX_Text_Bulk( pFX, _T( "[colName]" ),
                  &m_rgName, &m_rgNameLengths, 30 );

   // call the RFX functions for
   // for parameter data members
   pFX->SetFieldType( CFieldExchange::inputParam );
   RFX_Text( pFX, "NameParam", m_strNameParam );
}

참고 항목

파생 클래스가 Close 범위를 벗어나기 전에 멤버 함수를 CRecordset 호출해야 합니다. 이렇게 하면 프레임워크에서 할당한 모든 메모리가 해제됩니다. 대량 행 페치를 구현했는지 여부에 관계없이 항상 명시적으로 호출 Close하는 것이 좋은 프로그래밍 방법입니다.

RFX(레코드 필드 교환)에 대한 자세한 내용은 레코드 필드 교환: RFX 작동 방식을 참조 하세요. 매개 변수 사용에 대한 자세한 내용은 CFieldExchange::SetFieldTypeRecordset: 레코드 집합 매개 변수화(ODBC)를 참조하세요.

참고 항목

레코드 집합(ODBC)
CRecordset::m_nFields
CRecordset::m_nParams