Mapeamentos de DataTable e de DataColumn do DataAdapter

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

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

Um DataTableMapping permite que você use nomes de colunas em um DataTable que sejam diferentes daqueles do banco de dados. O DataAdapter usa o mapeamento para corresponder as colunas quando a tabela é atualizada.

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

O exemplo de código a seguir cria um DataTableMapping (do namespace System.Data.Common) e o transforma no mapeamento padrão para o DataAdapter especificado, nomeando-o como "Table". Em seguida, o exemplo mapeia as colunas da primeira tabela no resultado da consulta (a tabela Customers do banco de dados Northwind) para um conjunto de nomes mais amigáveis na tabela Northwind Customers no 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 que o mesmo DataAdapter dê suporte ao carregamento de diferentes tabelas com diferentes mapeamentos. Para fazer isso, basta adicionar mais objetos DataTableMapping.

Quando o método Fill recebe uma instância de DataSet e um nome de DataTableMapping, se existir um mapeamento com esse nome, ele será usado. Caso contrário, um DataTable com esse nome será usado.

Os exemplos a seguir criam um DataTableMapping com um nome de Customers e um nome de DataTable de BizTalkSchema. Em seguida, o exemplo mapeia as linhas retornadas pela instrução SELECT ao 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 receberá um nome padrão incremental de SourceColumnN, começando com SourceColumn1. Se nenhuma nome de tabela for fornecido para um mapeamento de tabela, o mapeamento de tabela receberá um nome padrão incremental de SourceTableN, começando com SourceTable1.

Observação

É recomendável evitar a convenção de nomenclatura SourceColumnN para um mapeamento de coluna ou SourceTableN para um mapeamento de tabela, porque o nome que você fornecer poderá entrar em conflito com um nome padrão de mapeamento de coluna existente no ColumnMappingCollection ou um nome de mapeamento de tabela existente no DataTableMappingCollection. Se o nome fornecido já existir, será gerada uma exceção.

Manipulando vários conjuntos de resultados

Se o SelectCommand retornar várias tabelas, o Fill vai gerar automaticamente nomes de tabelas com valores incrementais para as tabelas do DataSet, começando com o nome da tabela especificado e continuando no formato 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 retorne duas tabelas, Customers e Orders, emita a seguinte chamada para Fill.

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 que a segunda tabela seja denominada Orders em vez de Customers1. Para fazer isso, mapeie a tabela de origem de Customers1 para a tabela do DataSetOrders, 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