Mapeamentos DataAdapter DataTable e DataColumn
Um DataAdapter contém uma coleção de zero ou mais DataTableMapping objetos em sua propriedade TableMappings . Um DataTableMapping fornece um mapeamento primário entre os dados retornados de uma consulta em relação a uma fonte de dados e um DataTablearquivo . O nome DataTableMapping pode ser passado no lugar do nome DataTable para o método Fill 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 são diferentes daqueles no banco de dados. O DataAdapter usa o mapeamento para corresponder às 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, o DataAdapter procurará um DataTableMapping chamado "Table". Se esse DataTableMapping não existir, o TableName do DataTable é "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 System.Data.Common namespace) e o torna o mapeamento padrão para o DataAdapter especificado nomeando-o "Table". 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 da 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 ofereça suporte ao carregamento de tabelas diferentes com mapeamentos diferentes. Para fazer isso, basta adicionar outros objetos DataTableMapping .
Quando o método Fill é passado uma instância de um DataSet e um nome DataTableMapping , se existir um mapeamento com esse nome, ele é usado, caso contrário, um DataTable com esse nome é usado.
Os exemplos a seguir criam um DataTableMapping com um nome de Customers e um nome DataTable de BizTalkSchema. O exemplo, em seguida, mapeia as linhas retornadas pela instrução SELECT para o BizTalkSchema DataTable.
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");
Nota
Se um nome de coluna de origem não for fornecido para um mapeamento de coluna ou um nome de 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 SourceColumn N, começando com SourceColumn1. Se nenhum nome de tabela de origem for fornecido para um mapeamento de tabela, o mapeamento de tabela receberá um nome padrão incremental de SourceTable N, começando com SourceTable1.
Nota
Recomendamos que você evite a convenção de nomenclatura de SourceColumn N para um mapeamento de coluna ou SourceTable N para um mapeamento de tabela, porque o nome fornecido pode entrar em conflito com um nome de mapeamento de coluna padrão existente no ColumnMappingCollection ou nome de mapeamento de tabela no DataTableMappingCollection. Se o nome fornecido já existir, uma exceção será lançada.
Manipulação de vários conjuntos de resultados
Se seu 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 especificada e continuando no formato TableName N, começando com TableName1. Você pode usar mapeamentos de tabela para mapear o nome da tabela gerada automaticamente para um nome que você deseja especificar para a tabela no DataSet. Por exemplo, para um SelectCommand que retorna 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 garantir que a segunda tabela seja denominada Pedidos em vez de Clientes1. Para fazer isso, mapeie a tabela de origem de Customers1 para a tabela DataSet Orders, conforme mostrado no exemplo a seguir.
adapter.TableMappings.Add("Customers1", "Orders")
adapter.Fill(customersDataSet, "Customers")
adapter.TableMappings.Add("Customers1", "Orders");
adapter.Fill(customersDataSet, "Customers");