Mapeamentos de DataAdapter, DataTable e DataColumn
Aplicável a: .NET Framework .NET .NET Standard
Um SqlDataAdapter contém uma coleção de zero ou mais objetos DataTableMapping na propriedade TableMappings. Um DataTableMapping fornece um mapeamento mestre 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");
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.
Observação
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". O TableName do DataTable será "Table" se aquele DataTableMapping não existir. 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.
// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", connection);
DataTableMapping mapping =
custAdapter.TableMappings.Add("Table", "NorthwindCustomers");
mapping.ColumnMappings.Add("CompanyName", "Company");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");
custAdapter.Fill(custDataSet);
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, adicione outros 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 DataTable do BizTalkSchema.
// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", connection);
// The DataTableMapping is implemented ITableMapping.
ITableMapping mapping =
custAdapter.TableMappings.Add("Table", "BizTalkSchema");
mapping.ColumnMappings.Add("CustomerID", "ClientID");
mapping.ColumnMappings.Add("CompanyName", "ClientName");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIP");
custAdapter.Fill(custDataSet);
Observação
Se um nome de coluna de origem não for fornecido para um mapeamento de coluna, os nomes padrão serão gerados automaticamente. O mapeamento de coluna recebe um nome padrão incremental de SourceColumn N, começando com SourceColumn1 se nenhuma coluna de origem for fornecida para o mapeamento de coluna.
Observação
Se um nome de tabela de origem não for fornecido para um mapeamento de tabela, os nomes padrão serão gerados automaticamente. O mapeamento de tabela recebe um nome padrão incremental de SourceTable N, começando com SourceTable1 se nenhum nome de tabela de origem for fornecido ao mapeamento de tabela.
Observação
É recomendável evitar a convenção de nomenclatura de SourceColumn N para um mapeamento de coluna ou SourceTable N para um mapeamento de tabela, porque o nome que você fornece pode 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.
Gerenciar vários conjuntos de resultados
Se o comando 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 TableName N, 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");
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.
// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT * FROM dbo.Customers; SELECT * FROM dbo.Orders;";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataSet customersDataSet = new DataSet();
adapter.TableMappings.Add("Customers1", "Orders");
adapter.Fill(customersDataSet, "Customers");