Compartilhar via


Conjunto de registros: recuperando registros em massa (ODBC)

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

A classe CRecordset oferece suporte a linha em massa que pesquisa, o que significa que vários registros podem ser recuperados imediatamente durante uma única busca, em vez de recuperar um registro de cada vez da fonte de dados. Você pode implementar a linha em massa que busca somente em uma classe derivada de CRecordset . O processo de transferência de dados da fonte de dados ao objeto do conjunto de registros é chamado de troca em massa do campo de registro (RFX em massa). Observe que se você não estiver usando a linha em massa que pesquisa em CRecordset- a classe derivada, dados são administrados pela troca do campo de registro (RFX). Para obter mais informações, consulte Exchange campo de registro (RFX).

Este tópico explica:

  • Como buscar a linha do volume da suporte de CRecordset.

  • Algumas considerações especiais ao usar à busca em massa de linha.

  • Como implementar a troca em massa do campo de registro.

Como buscar a linha do volume da suporte de CRecordset

Antes de abrir o objeto do conjunto de registros, você pode definir um tamanho de conjunto de linhas com a função de membro de SetRowsetSize . O tamanho do conjunto de linhas especifica quantos registros devem ser recuperados durante uma única busca. Ao buscar em massa de linha é implementado, o tamanho padrão do conjunto de linhas é 25. Se buscar em massa de linha não é implementado, o tamanho do conjunto de linhas permanece fixo em 1.

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

A tabela a seguir lista as funções de membro fornecida por CRecordset à busca de linhas do volume de suporte.

Função de membro

Descrição

CheckRowsetError

Função virtual que trata todos os erros que ocorrem durante a busca.

DoBulkFieldExchange

Troca do campo de registro em massa das ferramentas. Chamado automaticamente a várias linhas das transferências de dados da fonte de dados ao conjunto de registros objeto.

GetRowsetSize

Recupera a configuração atual do tamanho do conjunto de linhas.

GetRowsFetched

Informa quantas linhas foram realmente recuperadas depois que uma busca determinado. Na maioria dos casos, esse é o tamanho do conjunto de linhas, a menos que um conjunto de linhas incompleto for buscado.

GetRowStatus

Retorna um status de busca para uma linha específica em um conjunto de linhas.

RefreshRowset

Atualiza os dados e o status de uma linha específica em um conjunto de linhas.

SetRowsetCursorPosition

Move o cursor para uma linha específica em um conjunto de linhas.

SetRowsetSize

Função virtual que alterar a configuração para o tamanho do conjunto de linhas com o valor especificado.

Considerações especiais

Embora à busca em massa de linhas seja um ganho de desempenho, determinados recursos funcionam de forma diferente. Antes que você decida implementar a linha em massa que pesquisa, considere o seguinte:

  • A estrutura chama automaticamente a função de membro de DoBulkFieldExchange para transferir dados da fonte de dados ao objeto do conjunto de registros. No entanto, os dados não forem transferidos do conjunto de registros de volta à fonte de dados. Chamando AddNew, Editar, Excluir, as funções de membro de Atualizar resultam em uma asserção com falha. Embora CRecordset atualmente não fornece um mecanismo para atualizar linhas em massa de dados, você pode escrever suas próprias funções usando a função SQLSetPosde ODBC API. Para obter mais informações sobre SQLSetPos, consulte Referência do programador de ODBC SDK na documentação do MSDN.

  • As funções de membro IsDeleted, IsFieldDirty, IsFieldNull, IsFieldNullable, SetFieldDirty, e SetFieldNull não podem ser usadas nos conjuntos de registros que implementam à busca em massa de linha. No entanto, você pode chamar GetRowStatus em vez disso IsDeleted, e GetODBCFieldInfo em vez disso IsFieldNullable.

  • As operações de Mover reposicionam o conjunto de registros pelo conjunto de linhas. Por exemplo, suponha que você abrir um conjunto de registros com 100 registros com um tamanho inicial do conjunto de linhas de 10. Abrir busca as linhas 1 a 10, com o registro atual posicionado na linha 1. Uma chamada para MoveNext busca o próximo conjunto de linhas, não a próxima linha. Esse 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 ao buscar em massa da linha é implementado. Move( 1 ) busca o conjunto de linhas que inicia 1 linha do registro atual. Neste exemplo, chamando Move( 1 ) depois de chamar Abrir busca o conjunto de linhas que consiste em linhas 2 a 11, com o registro atual posicionado na linha 2. Para obter mais informações, veja a função de membro de Movimentação .

  • Ao contrário de troca do campo de registro, os assistentes não oferecem suporte à troca em massa do campo de registro. Isso significa que você deve declarar manualmente os membros de dados do campo e manualmente substituição DoBulkFieldExchange gravando chamadas para funções de volume RFX. Para obter mais informações, consulte Funções do Exchange do campo de registrona referência da biblioteca da classe.

Como implementar o campo de registro em massa Exchange

A troca em massa do campo de registro transfere um conjunto de linhas de dados da fonte de dados ao objeto do conjunto de registros. As funções do volume RFX 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 do campo como ponteiros para acessar as matrizes de dados. Além disso, você deve definir um conjunto de ponteiros para acessar as matrizes de comprimento. Membros de dados do parâmetro não deve ser declarado como ponteiros; declare membros de dados do parâmetro ao usar a troca em massa do campo de registro é o mesmo que declarando ao usar a troca de campo do registro. 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;

   .
   .
   .
}

É possível atribuir esses buffers de armazenamento manualmente ou para que a estrutura faça a alocação. Para atribuir os buffers você mesmo, você deve especificar a opção de CRecordset::userAllocMultiRowBuffers do parâmetro de dwOptions na função de membro de Abrir . Defina os tamanhos das matrizes pelo menos igual ao tamanho do conjunto de linhas. Se você deseja ter a estrutura faça a alocação, você deve inicializar os ponteiros a NULL. Isso é feito normalmente 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ê deverá substituir a função de membro de DoBulkFieldExchange . Para os membros de dados do campo, chame as funções do volume RFX; para todos os membros de dados do parâmetro, chame as funções de RFX. Se você abriu o conjunto de registros passando uma instrução SQL ou um procedimento armazenado a Abrir, a ordem na qual você faz chamadas em massa RFX devem corresponder à ordem das colunas no conjunto de registros; de maneira semelhante, a ordem das chamadas de RFX para parâmetros deve corresponder à ordem de 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 );
}

Dica

Você deve chamar a função de membro de Fechar antes da sua classe derivada de CRecordset saia do escopo.Isso garante que toda a memória alocada pela estrutura seja liberada.É uma boa prática para sempre chamar explicitamente Fechar, independentemente de você implementou buscar em massa de linha.

Para obter mais informações sobre a troca do campo de registro (RFX), consulte Exchange campo do registro: Como funciona RFX. Para obter mais informações sobre como usar parâmetros, consulte CFieldExchange::SetFieldType e Conjunto de registros: A parametrização de um conjunto de registros (ODBC).

Consulte também

Referência

CRecordset::m_nFields

CRecordset::m_nParams

Conceitos

Conjunto de registros (ODBC)