Compartilhar via


Mapeamentos de DataTable e de DataColumn do DataAdapter

Um DataAdapter contém uma coleção de zero ou mais DataTableMapping objetos em sua TableMappings propriedade. Um DataTableMapping fornece um mapeamento primário entre os dados retornados de uma consulta em uma fonte de dados e um DataTable. O DataTableMapping nome pode ser passado no lugar do DataTable nome para o Fill método do DataAdapter. O exemplo a seguir cria um DataTableMapping chamado AuthorsMapping para a tabela Authors.

workAdapter.TableMappings.Add("AuthorsMapping", "Authors")
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");

Um DataTableMapping permite que você use nomes de coluna em um DataTable que seja diferente daqueles no banco de dados. O DataAdapter usa o mapeamento para alinhar as colunas quando a tabela é atualizada.

Se você não especificar um nome TableName ou DataTableMapping ao chamar o método Fill ou Update do DataAdapter, DataAdapter procurará por um DataTableMapping chamado "Table". Se isso DataTableMapping não existir, o TableName do DataTable será "Table". Você pode especificar um padrão DataTableMapping criando um DataTableMapping com o nome de "Tabela".

O exemplo de código a seguir cria um DataTableMapping (do System.Data.Common namespace) e o torna o mapeamento padrão para o especificado DataAdapter nomeando-o como "Tabela". Em seguida, o exemplo mapeia as colunas da primeira tabela no resultado da consulta (a tabela da base de dados Northwind) para um conjunto de nomes mais fáceis de usar na tabela Northwind Customers em DataSet. Para colunas que não são mapeadas, o nome da coluna na fonte de dados é usado.

Dim mapping As DataTableMapping = _
  adapter.TableMappings.Add("Table", "NorthwindCustomers")
mapping.ColumnMappings.Add("CompanyName", "Company")
mapping.ColumnMappings.Add("ContactName", "Contact")
mapping.ColumnMappings.Add("PostalCode", "ZIPCode")

adapter.Fill(custDS)
DataTableMapping mapping =
  adapter.TableMappings.Add("Table", "NorthwindCustomers");
mapping.ColumnMappings.Add("CompanyName", "Company");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");

adapter.Fill(custDS);

Em situações mais avançadas, você pode decidir que deseja o mesmo DataAdapter para dar suporte ao carregamento de tabelas diferentes com mapeamentos diferentes. Para fazer isso, basta adicionar objetos adicionais DataTableMapping .

Quando uma instância de DataSet e um nome de DataTableMapping são fornecidos ao método Fill, se um mapeamento com esse nome existir, ele é usado; caso contrário, um DataTable com esse nome é usado.

Os exemplos a seguir criam um DataTableMapping chamado Customers e um DataTable chamado BizTalkSchema. Em seguida, o exemplo mapeia as linhas retornadas pela instrução SELECT para a BizTalkSchemaDataTable.

Dim mapping As ITableMapping = _
  adapter.TableMappings.Add("Customers", "BizTalkSchema")
mapping.ColumnMappings.Add("CustomerID", "ClientID")
mapping.ColumnMappings.Add("CompanyName", "ClientName")
mapping.ColumnMappings.Add("ContactName", "Contact")
mapping.ColumnMappings.Add("PostalCode", "ZIP")

adapter.Fill(custDS, "Customers")
ITableMapping mapping =
  adapter.TableMappings.Add("Customers", "BizTalkSchema");
mapping.ColumnMappings.Add("CustomerID", "ClientID");
mapping.ColumnMappings.Add("CompanyName", "ClientName");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIP");

adapter.Fill(custDS, "Customers");

Observação

Se o nome de uma coluna de origem não for fornecido para um mapeamento de coluna ou se o nome de uma tabela de origem não for fornecido para um mapeamento de tabela, os nomes padrão serão gerados automaticamente. Se nenhuma coluna de origem for fornecida para um mapeamento de coluna, o mapeamento de coluna recebe um nome padrão incremental de SourceColumnN, começando com SourceColumn1. Se nenhum nome de tabela de origem for fornecido para um mapeamento de tabela, o mapeamento de tabela recebe um nome padrão incremental de SourceTableN, começando com SourceTable1.

Observação

Recomendamos que você evite a convenção de nomenclatura de SourceColumn para um mapeamento de coluna ou SourceTableN para um mapeamento de tabela, pois o nome fornecido pode entrar em conflito com um nome de mapeamento de coluna padrão existente no ColumnMappingCollection nome de mapeamento de tabela ou dataTableMappingCollection. Se o nome fornecido já existir, será gerada uma exceção.

Manipulando vários conjuntos de resultados

Se você SelectCommand retornar várias tabelas, Fill gerará automaticamente nomes de tabela com valores incrementais para as tabelas no DataSet, começando com o nome da tabela especificado e continuando no formulário TableNameN, começando com TableName1. Você pode usar mapeamentos de tabela para mapear o nome de tabela gerado automaticamente para um nome que você deseja especificado para a tabela no DataSet. Por exemplo, para um SelectCommand que retorna duas tabelas Customers e Pedidos, emita a chamada a seguir para Preencher.

adapter.Fill(customersDataSet, "Customers")
adapter.Fill(customersDataSet, "Customers");

Duas tabelas são criadas no DataSet: Customers e customers1. Você pode usar mapeamentos de tabela para garantir que a segunda tabela seja nomeada Orders em vez de Customers1. Para fazer isso, mapeie a tabela de origem de Customers1 para a DataSet tabela Pedidos, conforme mostrado no exemplo a seguir.

adapter.TableMappings.Add("Customers1", "Orders")
adapter.Fill(customersDataSet, "Customers")
adapter.TableMappings.Add("Customers1", "Orders");
adapter.Fill(customersDataSet, "Customers");

Confira também