Recordset: Dinamicamente vinculação colunas de dados (ODBC)

Este tópico se aplica a classes MFC ODBC.

Conjuntos de registros gerenciar colunas de tabela de ligação que você especificar em tempo de design, mas há casos em que talvez você queira vincular colunas foram desconhecidas para você em tempo de design.Este tópico explica:

  • Quando você talvez queira vincular colunas dinamicamente a um conjunto de registros.

  • Como ligar colunas dinamicamente em tempo de execução.

ObservaçãoObservação

Este tópico se aplica aos objetos derivados de CRecordset em qual linha em massa buscando não foi implementada.As técnicas descritas geralmente não são recomendadas se você estiver usando em massa linha buscando.Para obter mais informações sobre a busca de linha em massa, consulte Recordset: buscar registros em massa (ODBC).

Quando você pode ligar colunas dinamicamente

Em tempo de design, o Assistente de aplicativo do MFC ou Assistente de consumidor ODBC MFC (de Add Class) cria classes de conjunto de registros com base em tabelas conhecidas e colunas na fonte de dados.Bancos de dados podem alterar entre quando você cria-las e posterior quando o aplicativo usa essas tabelas e colunas em tempo de execução.Você ou outro usuário pode adicionar ou soltar uma tabela ou adicionar ou soltar colunas de uma tabela depende do conjunto de registros do aplicativo.Isso provavelmente não é uma preocupação para todos os aplicativos de acesso a dados, mas se ele for seu, como pode você lidar com as alterações no esquema do banco de dados diferente de reprojetar e recompilar?O objetivo deste tópico é responder essa pergunta.

Este tópico descreve o caso mais comum no qual você pode ligar colunas dinamicamente — tendo começado com um conjunto de registros com base em um esquema de banco de dados conhecidos, que você deseja manipular colunas adicionais em tempo de execução.Ainda mais o tópico pressupõe que mapeiam colunas adicionais para CString campo membros de dados, caso mais comum, embora sugestões são fornecidas para ajudar a gerenciar outros tipos de dados.

Com uma pequena quantidade de código extra, você pode:

  • Determinar quais colunas estão disponíveis em tempo de execução.

  • Vincular colunas adicionais a seu recordset dinamicamente, em tempo de execução.

Registros ainda contém membros de dados para as colunas que soubessem em tempo de design.Ele também contém uma pequena quantidade de código extra dinamicamente determina se quaisquer novas colunas foram adicionadas à sua tabela de destino e, em caso afirmativo, liga essas novas colunas para armazenamento alocado dinamicamente (em vez de membros de dados do conjunto de registros).

Este tópico não aborda outros casos de vinculação dinâmica, como queda de tabelas ou colunas.Nesses casos, você precisará usar chamadas API ODBC mais diretamente.Para obter informações, consulte o SDK do ODBC referência do programador de no CD do Biblioteca MSDN.

Como ligar colunas dinamicamente

Ligar colunas dinamicamente, você deve saber (ou ser capaz de determinar) os nomes das colunas adicionais.Você deve alocar armazenamento para os membros de dados de campo adicional, especifique seus nomes e seus tipos e especifique o número de colunas que você está adicionando.

Discussão a seguir menciona dois diferentes conjuntos de registros.O primeiro é o conjunto principal que seleciona os registros da tabela de destino.O segundo é um conjunto de registros coluna especial usado para obter informações sobre as colunas da tabela de destino.

wewhtz77.collapse_all(pt-br,VS.110).gifProcesso geral

Nível mais geral, que você siga estas etapas:

  1. Construa o objeto recordset principal.

    Opcionalmente, passe um ponteiro para uma abertura CDatabase objeto ou ser capaz de fornecer informações de conexão para o conjunto de registros de coluna de alguma forma.

  2. Etapas para adicionar colunas dinamicamente.

    Consulte o processo descrito em Adicionando colunas abaixo.

  3. Abra seu recordset principal.

    O conjunto de registros seleciona registros e usa o registro campo exchange (RFX) para ligar as colunas estáticas (aqueles mapeados para membros de dados de campo de conjunto de registros) e colunas dinâmicas (mapeadas para o armazenamento extra que você alocar).

wewhtz77.collapse_all(pt-br,VS.110).gifAdicionando colunas

Vinculação dinâmica adicionado colunas em tempo de execução requer as seguintes etapas:

  1. Tempo de execução, determine quais são colunas na tabela de destino.Extrai informações uma lista das colunas que foram adicionados à tabela como sua classe de conjunto de registros foi projetado.

    Uma boa abordagem é usar uma classe de conjunto de registros coluna projetada para consultar a fonte de dados para informações de coluna para a tabela de destino (como o tipo de dados e o nome da coluna).

  2. Fornece armazenamento para os novos membros de dados de campo.Porque a classe principal do conjunto de registros não tem membros de dados de campo para colunas desconhecidos, você deve fornecer um local para armazenar nomes, valores de resultado e, possivelmente informações de tipo de dados (se as colunas forem diferentes tipos de dados).

    Uma abordagem é criar uma ou mais listas dinâmicas, um para nomes de novas colunas, outra para os valores de resultado e um terceiro para seus tipos de dados (se necessário).Essas listas, especialmente a lista de valores, fornecem as informações e o armazenamento necessários para ligação.A figura a seguir ilustra a criação de listas.

    Criando listas de colunas para vincular dinamicamente

    Criar listas de colunas vincular dinamicamente

  3. Adicionar uma chamada de função RFX no seu recordset principal DoFieldExchange função para cada coluna de adicionado.Essas chamadas RFX fazem o trabalho de buscar um registro, incluindo as colunas adicionais e vinculação de colunas para membros de dados do conjunto de registros ou para seu armazenamento dinamicamente fornecido para eles.

    Uma abordagem é adicionar um loop ao seu recordset principal DoFieldExchange função percorre a lista de novas colunas, chamando a função RFX apropriada para cada coluna na lista.Em cada chamada RFX, passe um nome de coluna da lista de nome de coluna e um local de armazenamento no membro correspondente da lista de valores de resultado.

wewhtz77.collapse_all(pt-br,VS.110).gifListas de colunas

Quatro listas com que precisam trabalhar são mostradas na tabela a seguir.

  • Atual-tabela de colunas (lista 1 na ilustração)
    Uma lista de colunas atualmente na tabela na fonte de dados.Nesta lista pode coincidir com a lista de colunas atualmente ligados de registros.

  • Vinculado a Recordset-colunas (lista 2 na ilustração)
    Uma lista das colunas acoplado de registros.Essas colunas já tem instruções de RFX seu DoFieldExchange função.

  • Colunas-para-Bind-dinamicamente (lista 3 na ilustração)
    Uma lista de colunas na tabela, mas não no seu conjunto de registros.Essas são as colunas que você deseja vincular dinamicamente.

  • Dinâmico-coluna-valores (lista 4 na ilustração)
    Uma lista contendo o armazenamento para os valores recuperados das colunas que vincular dinamicamente.Elementos desta lista correspondem às colunas-para-Bind-dinamicamente, um para um.

wewhtz77.collapse_all(pt-br,VS.110).gifCriação de listas

Com uma estratégia geral em mente, você pode ativar os detalhes.Os procedimentos no restante deste tópico mostram como criar listas mostradas na Lista de colunas.Os procedimentos de orientação-lo:

  • Determinando os nomes das colunas não de registros.

  • Fornecendo armazenamento dinâmico das colunas recentemente adicionadas à tabela de.

  • Adicionar dinamicamente RFX chama para novas colunas.

wewhtz77.collapse_all(pt-br,VS.110).gifDeterminando quais colunas da tabela não são de registros

Criar uma lista (ligado-Recordset-colunas, como em lista 2 a ilustração) que contém uma lista das colunas já vinculado de registros principal.Em seguida, crie uma lista (colunas-para-Bind-dinamicamente, derivado de colunas da tabela atual e colunas do conjunto de limite) que contém nomes de coluna na tabela na fonte de dados, mas não no seu recordset principal.

Para determinar os nomes das colunas não no conjunto de registros (colunas-para-Bind-dinamicamente)

  1. Crie uma lista (colunas de conjunto de registros ligado) das colunas já ligado no seu recordset principal.

    Uma abordagem é criar colunas do conjunto de limite em tempo de design.Você pode examinar visualmente as chamadas de função RFX no conjunto de registros DoFieldExchange função para obter esses nomes.Em seguida, configure a lista como uma matriz inicializada com os nomes.

    Por exemplo, o ilustração mostra vinculado a Recordset-colunas (lista 2) com três elementos.Colunas do conjunto de limite está faltando a coluna telefone mostrada na atual-tabela de colunas (lista 1).

  2. Compare colunas da tabela atual e colunas do conjunto de limite para criar uma lista (colunas-para-Bind-dinamicamente) das colunas não estiver acoplado de registros principal.

    Uma abordagem é percorrer a lista de colunas na tabela em tempo de execução (colunas de tabela atual) e a lista de colunas já vinculado no conjunto de registros (colunas de conjunto de registros ligado) em paralelo.Em colunas-para-Bind-dinamicamente coloca todos os nomes atuais-tabela-colunas que não aparecem nas colunas do conjunto de limite.

    Por exemplo, o ilustração mostra colunas-para-Bind-dinamicamente (lista 3) com um elemento: a coluna de telefone encontrada no atual-tabela de colunas (lista 1) mas não no limite Recordset-colunas (lista 2).

  3. Criar uma lista de valores de coluna dinâmicos (como na lista 4 o ilustração) para armazenar os valores de dados correspondentes a cada nome de coluna armazenado na sua lista de colunas para vincular dinamicamente (colunas-para-Bind-dinamicamente).

    Os elementos desta lista desempenham a função de conjunto de registros novos membros de dados de campo.Eles são os locais de armazenamento ao qual as colunas dinâmicas são vinculadas.Para obter descrições das listas, consulte Lista de colunas.

wewhtz77.collapse_all(pt-br,VS.110).gifFornecimento de armazenamento para novas colunas

Em seguida, configure os locais de armazenamento para as colunas a ser vinculado dinamicamente.A idéia é fornecer um elemento de lista para armazenar o valor de cada coluna.Esses locais de armazenamento paralelo as variáveis de membro do recordset, armazenam as colunas normalmente acopladas.

Para fornecer armazenamento dinâmico para novas colunas (valores de coluna dinâmicos)

  • Compilação dinâmico-coluna-valores, paralelos para colunas-para-Bind-dinamicamente, para conter o valor dos dados em cada coluna.

    Por exemplo, o ilustração mostra dinâmico-coluna-valores (lista 4) com um elemento: um CString objeto que contém o número de telefone real para o registro atual: "555-1212".

    No caso mais comum, valores de coluna dinâmico tem elementos do tipo CString.Se você estiver lidando com colunas de variados tipos de dados, você precisa uma lista pode conter elementos de uma variedade de tipos.

O resultado dos procedimentos anteriores é duas listas principais: colunas-para-Bind-dinamicamente que contém os nomes de colunas e dinâmico-coluna-valores contendo os valores das colunas no registro atual.

DicaDica

Se novas colunas não são todos do mesmo tipo de dados, convém um paralelo extra que contém itens de alguma forma, definir o tipo de cada elemento correspondente na lista de colunas de lista.(Você pode usar os valores AFX_RFX_BOOL, AFX_RFX_BYTEe assim por diante, este se você deseja.Essas constantes são definidas no AFXDB.H.) Escolha um tipo de lista com base em como representam os tipos de dados da coluna.

wewhtz77.collapse_all(pt-br,VS.110).gifAdicionando chamadas RFX para ligar as colunas

Finalmente, providenciar a vinculação dinâmica ocorra colocando RFX chama para novas colunas no seu DoFieldExchange função.

Para adicionar dinamicamente RFX chama para novas colunas

  • O conjunto principal DoFieldExchange membro função, adicione código percorre a lista de novas colunas (colunas-para-Bind-dinamicamente).Em cada loop, extrai um nome de coluna de colunas-para-Bind-dinamicamente e um valor de resultado para a coluna de valores de coluna dinâmicos.Passe esses itens para uma chamada de função RFX apropriado ao tipo de dados da coluna.Para obter descrições das listas, consulte Lista de colunas.

No caso comum, no seu RFX_Text extrair de chamadas de função CString objetos listas, como as seguintes linhas de código, onde colunas-para-Bind-dinamicamente é um CStringList chamado m_listName e valores de coluna dinâmico é um CStringList chamado m_listValue:

RFX_Text( pFX, 
            m_listName.GetNext( posName ), 
            m_listValue.GetNext( posValue ));

Para obter mais informações sobre as funções RFX, consulte Macros e Globals na Referência de biblioteca de classe.

DicaDica

Se novas colunas diferentes tipos de dados, use uma instrução switch em seu loop para chamar a função RFX apropriada para cada tipo.

Quando a estrutura chama DoFieldExchange durante o Abrir processo vincular colunas no conjunto de registros, as chamadas RFX para as colunas estáticas vincular essas colunas.O loop repetidamente chama funções RFX para as colunas dinâmicas.

Consulte também

Conceitos

Conjunto de registros (ODBC)

Recordset: Trabalhando com itens grandes de dados (ODBC)