Partilhar via


Conjunto de registros: Obtendo registros em massa (ODBC)

Este tópico se aplica às classes ODBC do MFC.

Class CRecordset fornece suporte para busca de linha em massa, o que significa que vários registros podem ser recuperados de uma só vez durante uma única busca, em vez de recuperar um registro de cada vez da fonte de dados. Pode implementar a extração de linhas em massa apenas numa classe derivada CRecordset . O processo de transferência de dados da fonte de dados para o objeto do conjunto de registos é denominado "Bulk Record Field Exchange" (troca de campo de registo em massa, Bulk RFX). Note que, se não estiver a usar a extração em bloco numa classe derivada de CRecordset, os dados são transferidos via RFX (troca de campos de registo). Para obter mais informações, consulte Record Field Exchange (RFX).

Este tópico explica:

Como o CRecordset suporta a obtenção de linhas em massa

Antes de abrir o objeto do conjunto de registos, pode definir um tamanho de conjunto de linhas com a função membro SetRowsetSize. O tamanho do conjunto de linhas especifica quantos registros devem ser recuperados durante uma única busca. Quando a busca de linha em massa é implementada, o tamanho padrão do conjunto de linhas é 25. Se a busca de linha em massa não for implementada, o tamanho do conjunto de linhas permanecerá fixo em 1.

Depois de inicializar o tamanho do conjunto de linhas, chame a função membro Abrir. Aqui deves especificar a opção CRecordset::useMultiRowFetch do parâmetro dwOptions para implementar a busca de linhas em massa. Além disso, você pode definir a CRecordset::userAllocMultiRowBuffers opção. O mecanismo de troca de campo de registro em massa usa matrizes para armazenar as várias linhas de dados recuperados durante uma busca. Esses buffers de armazenamento podem ser alocados automaticamente pela estrutura ou você pode alocá-los manualmente. Especificar a CRecordset::userAllocMultiRowBuffers opção significa que você fará a alocação.

A tabela a seguir lista as funções de membro para suporte à extração de linhas em massa fornecidas por CRecordset.

Função de membro Descrição
CheckRowsetError Função virtual que lida com quaisquer erros que ocorram durante a busca.
DoBulkFieldExchange Implementa a troca em massa de campos de registo. Chamado automaticamente para transferir várias linhas de dados da fonte de dados para o objeto do conjunto de registros.
GetRowsetSize Recupera a configuração atual para o tamanho do conjunto de linhas.
GetRowsFetched Informa quantas linhas foram realmente recuperadas após uma busca específica. Na maioria dos casos, esse é o tamanho do conjunto de linhas, a menos que um conjunto de linhas incompleto tenha sido buscado.
GetRowStatus Retorna um status de busca para uma linha específica dentro de um conjunto de linhas.
RefreshRowset Atualiza os dados e o status de uma linha específica dentro de um conjunto de linhas.
SetRowsetCursorPosition Move o cursor para uma linha específica dentro de um conjunto de linhas.
SetRowsetSize Função virtual que altera a configuração do tamanho do conjunto de linhas para o valor especificado.

Considerações especiais

Embora a busca de linhas em massa seja um ganho de desempenho, certos recursos operam de forma diferente. Antes de decidir implementar a extração em massa de linhas, considere o seguinte:

  • A estrutura chama automaticamente a função membro DoBulkFieldExchange para transferir dados da fonte de dados para o objeto recordset. No entanto, os dados não são transferidos do conjunto de registros de volta para a fonte de dados. Chamar as funções membro AddNew, Edit, Delete ou Update resulta numa afirmação com falha. Embora CRecordset atualmente não forneça um mecanismo para atualizar linhas em massa de dados, você pode escrever suas próprias funções usando a função SQLSetPosODBC API . Para obter mais informações sobre SQLSetPos, consulte a Referência do Programador ODBC.

  • As funções IsDeletedde membro , IsFieldDirty, IsFieldNull, IsFieldNullable, SetFieldDirtye SetFieldNull não podem ser usadas em conjuntos de registros que implementam a busca de linhas em massa. No entanto, você pode ligar GetRowStatus no lugar de IsDeleted, e GetODBCFieldInfo no lugar de IsFieldNullable.

  • As Move operações reposicionam seu conjunto de registros por conjunto de linhas. Por exemplo, suponha que você abra um conjunto de registros que tenha 100 registros com um tamanho inicial de conjunto de linhas de 10. Open busca as linhas de 1 a 10, com o registro atual posicionado na linha 1. Uma chamada para MoveNext buscar o próximo conjunto de linhas, não a próxima linha. Este conjunto de linhas consiste nas linhas 11 a 20, com o registro atual posicionado na linha 11. Observe que MoveNext e Move( 1 ) não são equivalentes quando a busca de linha em massa é implementada. Move( 1 ) Busca o conjunto de linhas que inicia 1 linha do registro atual. Neste exemplo, chamar Move( 1 ) depois de chamar Open busca o conjunto de linhas que consiste nas linhas 2 a 11, com o registro atual posicionado na linha 2. Para obter mais informações, consulte a função-membro Mover.

  • Ao contrário da troca de campos de registro, os assistentes não oferecem suporte à troca de campos de registro em massa. Isso significa que você deve declarar manualmente os membros de dados do campo e substituir manualmente o DoBulkFieldExchange escrevendo chamadas para as funções Bulk RFX. Para obter mais informações, consulte Funções de troca de campo de registro na Referência da biblioteca de classes.

Como implementar o Bulk Record Field Exchange

A troca de campos de registro em massa transfere um conjunto de linhas de dados da fonte de dados para o objeto do conjunto de registros. As funções RFX em massa usam matrizes para armazenar esses dados, bem como matrizes para armazenar o comprimento de cada item de dados no conjunto de linhas. Em sua definição de classe, você deve definir seus membros de dados de campo como ponteiros para acessar as matrizes de dados. Além disso, você deve definir um conjunto de ponteiros para acessar as matrizes de comprimentos. Os membros de dados de parâmetros não devem ser declarados como ponteiros; declarar membros de dados de parâmetros ao usar a troca de campos de registo em massa é equivalente à sua declaração ao usar a troca de campos de registo. O código a seguir mostra um exemplo simples:

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;

   .
   .
   .
}

Você pode alocar esses buffers de armazenamento manualmente ou fazer com que a estrutura faça a alocação. Para alocar os buffers por conta própria, você deve especificar a CRecordset::userAllocMultiRowBuffers opção do parâmetro dwOptions na Open função membro. Certifique-se de definir os tamanhos das matrizes pelo menos iguais ao tamanho do conjunto de linhas. Se você quiser que a estrutura faça a alocação, você deve inicializar seus ponteiros para NULL. Isso geralmente é feito no construtor do objeto do conjunto de registros:

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;

   .
   .
   .
}

Finalmente, você deve substituir a DoBulkFieldExchange função de membro. Para os membros de dados de campo, chame as funções RFX em massa; para quaisquer membros de dados de parâmetro, chame as funções RFX. Se você abriu o conjunto de registros passando uma instrução SQL ou procedimento armazenado para Open, a ordem em que você faz as chamadas RFX em massa deve corresponder à ordem das colunas no conjunto de registros, da mesma forma, a ordem das chamadas RFX para parâmetros deve corresponder à ordem dos parâmetros na instrução SQL ou procedimento armazenado.

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 );
}

Observação

Você deve chamar a Close função de membro antes que sua classe derivada CRecordset saia do escopo. Isso garante que qualquer memória alocada pela estrutura seja liberada. É uma boa prática de programação sempre chamar Closeexplicitamente , independentemente de você ter implementado a busca de linha em massa.

Para obter mais informações sobre a troca de campos de registro (RFX), consulte Troca de campos de registro: como funciona a RFX. Para obter mais informações sobre como usar parâmetros, consulte CFieldExchange::SetFieldType e Recordset: Parametrizando um conjunto de registros (ODBC).

Ver também

Conjunto de registros (ODBC)
CRecordset::m_nFields
CRecordset::m_nParams