conjunto de registros: Busca de registros em massa (ODBC)
Este tópico se aplica a classes MFC ODBC.
De classeCRecordset Fornece suporte para busca de linha em massa, que significa que vários registros podem ser recuperados por vez durante uma única busca, em vez de recuperar um registro por vez da fonte de dados. Você pode implementar em massa linha buscar apenas em um derivado CRecordset classe. O processo de transferência de dados da fonte de dados para o objeto de conjunto de registros é chamado de troca de campo de registro em massa (Bulk RFX).Observe que, se você não estiver usando em massa linha buscando um CRecordset-classe derivada, dados é transferido por meio de troca de campo de registro (RFX). Para obter mais informações, consulte Registro de campo Exchange (RFX).
Este tópico explica:
Como CRecordset oferece suporte ao buscar a linha em massa.
Algumas considerações especiais ao usar em massa buscar linha.
Como implementar a troca de campo de registro em massa.
Antes de abrir o objeto conjunto de registros, você pode definir um dimensionar de conjunto de linhas com o SetRowsetSize função de membro. O dimensionar do conjunto de linhas Especifica quantos registros devem ser recuperados durante uma única busca.Quando buscar a linha em massa é implementado, o dimensionar do conjunto de linhas padrão é 25.Se não for implementada buscar a linha em massa, o dimensionar do conjunto de linhas permanece fixo em 1.
Depois que tiver inicializado o dimensionar do conjunto de linhas, telefonar o em abertofunção de membro .Aqui, você deve especificar o CRecordset::useMultiRowFetch opção da dwOptions parâmetro para implementar a busca de linha em massa.Além disso, você pode conjunto o CRecordset::userAllocMultiRowBuffers opção.O mecanismo de troca de campo de registro em massa usa matrizes para armazenar várias linhas de dados recuperados durante uma busca.Esses buffers de armazenamento podem ser alocados automaticamente pela estrutura ou você pode alocá-las manualmente.Especificando o CRecordset::userAllocMultiRowBuffers opção significa que você faça a alocação.
A tabela a seguir lista as funções de membro fornecidas pelo CRecordset para oferecer suporte a busca de linha em massa.
Função de membro |
Descrição |
---|---|
Função virtual que trata os erros que ocorrem durante a busca. |
|
Implementa em massa a troca de campo de registro.Chamado automaticamente para transferências de várias linhas de dados da fonte de dados para o objeto de conjunto de registros. |
|
Recupera a configuração corrente para o dimensionar do conjunto de linhas. |
|
Informa quantas linhas foram realmente recuperadas após uma determinado busca.Na maioria dos casos, este é o dimensionar do conjunto de linhas, a menos que um conjunto de linhas incompleto foi encontrado. |
|
Retorna um status de busca para uma linha específica dentro de um conjunto de linhas. |
|
Atualiza os dados e o status de uma linha específica dentro de um conjunto de linhas. |
|
Move o cursor para uma linha específica dentro de um conjunto de linhas. |
|
Função virtual que altera a configuração para o dimensionar do conjunto de linhas para o valor especificado. |
Embora em massa linha buscando um ganho de desempenho, determinados recursos operam de forma diferente.Antes de decidir implementar buscar a linha em massa, considere o seguinte:
A estrutura chama automaticamente o DoBulkFieldExchange função de membro transferência dados da fonte de dados para o objeto de conjunto de registros. No entanto, dados não são transferidos do conjunto de registros para fonte de dados.Chamando o AddNew, edição, Excluir, or Atualizaçãofunções de membro resultados em uma declaração com falha.Embora CRecordset no momento não fornece um mecanismo para a atualização em massa linhas de dados, você pode escrever suas próprias funções utilizando a função de API do ODBC SQLSetPos.Para obter mais informações sobre o SQLSetPos, see the Referência do programador de ODBC SDK na documentação do MSDN.
O membro funções IsDeleted, IsFieldDirty, IsFieldNull, IsFieldNullable, SetFieldDirty, e SetFieldNull não pode ser usado em conjuntos de registros que implementam a busca de linha em massa. No entanto, você pode chamar GetRowStatus em vez de IsDeleted, e GetODBCFieldInfo em vez de IsFieldNullable.
The Mover operações reposiciona o conjunto de registros por conjunto de linhas.Por exemplo, suponha que você em em aberto um conjunto de registros tem 100 registros com um dimensionar inicial do conjunto de linhas de 10.em aberto busca linhas 1 a 10, com o registro corrente posicionado na linha 1.Uma telefonar para MoveNext busca o próximo conjunto de linhas, a próxima linha. Este conjunto de linhas consiste em linhas 11 a 20, com o registro corrente posicionadas na linha 11.Observe que MoveNext e Mover (1) não são equivalentes quando buscar a linha em massa é implementada.Mover (1) extrai o conjunto de linhas que começa a partir de 1 linha o registro corrente.Neste exemplo, chamar Mover (1) após chamar em aberto busca o conjunto de linhas que consiste em linhas 2 a 11, com o registro corrente posicionadas na linha 2.Para obter mais informações, consulte o Moverfunção de membro .
Ao contrário de troca de campo de registro, os assistentes não oferecem suporte a troca de campo de registro em massa.Isso significa que você deve declarar seus membros de campo de dados manualmente e substituir manualmente DoBulkFieldExchange escrevendo chamadas a funções RFX em massa. Para obter mais informações, consulte Registro campo Exchange funções in the Referência da biblioteca de classes.
Troca de campo de registro em massa transfere um conjunto de linhas de dados da fonte de dados para o objeto de conjunto de registros.sistema autônomo funções em massa RFX usar matrizes para armazenar esses dados, bem sistema autônomo matrizes para armazenar o comprimento de cada item de dados no conjunto de linhas.Definição de classe, você deve definir seus membros de dados do campo sistema autônomo ponteiros para acesso matrizes de dados.Além disso, você deve definir um conjunto de ponteiros para acessar os conjuntos de comprimentos.Quaisquer membros de dados do parâmetro não devem ser declarados sistema autônomo ponteiros; declarar membros de dados de parâmetro ao usar a troca de campo de registro em massa é igual a declará-los ao usar a troca de campo de 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;
.
.
.
}
Você pode alocar esses buffers de armazenamento manualmente ou ter a estrutura de fazer a alocação.Para alocar os buffers, você deve especificar o CRecordset::userAllocMultiRowBuffers opção de do dwOptions parâmetro a em abertofunção de membro .Certifique-se de definir os tamanhos dos arrays de pelo menos igual ao dimensionar do conjunto de linhas.Se desejar ter a estrutura faça a alocação, você deve inicializar os ponteiros para NULO. Isso é concluído no construtor do objeto 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 o DoBulkFieldExchange função de membro. Para os membros de dados do campo, telefonar funções Bulk RFX; para quaisquer membros de dados do parâmetro, telefonar funções RFX.Se você tiver em aberto o conjunto de registros, passando uma demonstrativo SQL ou procedimento armazenado para em aberto, a ordem na qual você fazer chamadas em massa RFX deve corresponder à ordem de colunas no conjunto de registros; da mesma forma, a ordem das chamadas RFX parâmetros deve corresponder à ordem de parâmetros na demonstrativo 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 o Fechar função de membro antes de seu derivada CRecordset classe sai do escopo. Isso garante que qualquer memória alocada pela estrutura sejam liberados.É recomendável chamar sempre explicitamente prática de programaçãoFechar, independentemente de se você implementou a busca de linha em massa. |
Para obter mais informações sobre a troca de campo de registro (RFX), consulte Intercâmbio de campo do registro: Como RFX trabalha.Para obter mais informações sobre como usar parâmetros, consulte CFieldExchange::SetFieldType and conjunto de registros: Parametrização um conjunto de registros (ODBC).