Partilhar via


Mapeamentos DataAdapter DataTable e DataColumn

A DataAdapter contém uma coleção de zero ou mais DataTableMapping objetos na sua TableMappings propriedade. A DataTableMapping fornece um mapeamento primário entre os dados devolvidos a partir de uma consulta a uma fonte de dados e um DataTable. O DataTableMapping nome pode ser atribuído em vez do DataTable nome ao Fill método do DataAdapter. O exemplo seguinte cria um DataTableMapping chamado AuthorsMapping para a tabela Authors.

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

A DataTableMapping permite-lhe usar nomes de colunas num DataTable que são diferentes dos que estão na base de dados. DataAdapter utiliza o mapeamento para corresponder às colunas quando a tabela é atualizada.

Se não especificar um nome TableName ou DataTableMapping ao chamar o método Fill ou Update do DataAdapter, o DataAdapter procura por uma DataTableMapping com o nome "Table". Se isso DataTableMapping não existir, o TableName de DataTable é "Tabela". Pode especificar um padrão DataTableMapping criando um DataTableMapping com o nome de "Table".

O exemplo de código seguinte cria um DataTableMapping (a partir do System.Data.Common namespace) e torna-o o mapeamento padrão para o especificado DataAdapter , nomeando-o "Table". O exemplo, em seguida, mapeia as colunas da primeira tabela no resultado da base de dados consultada (a Customers tabela no banco de dados Northwind) para um conjunto de nomes mais fáceis de usar na tabela Northwind Customers. 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, pode decidir que quer o mesmo DataAdapter para suportar o carregamento de diferentes tabelas com diferentes mapeamentos. Para isso, basta adicionar objetos adicionais DataTableMapping .

Quando o Fill método recebe uma instância de uma DataSet e um nome DataTableMapping, se existir um mapeamento com esse nome, é utilizado; caso contrário, a DataTable com esse nome é utilizada.

Os exemplos seguintes criam um DataTableMapping com um nome de Customers e um nome de DataTable de BizTalkSchema. O exemplo então mapeia as linhas devolvidas 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");

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 não for fornecida nenhuma coluna de origem para um mapeamento de colunas, o mapeamento de colunas recebe um nome por defeito incremental de SourceColumnN, começando por SourceColumn1. Se não for fornecido um nome da tabela fonte para um mapeamento de tabela, o mapeamento da tabela recebe um nome padrão incremental de SourceTableN, começando por SourceTable1.

Nota

Recomendamos que evite a convenção de nomenclatura de SourceColumnN para um mapeamento de coluna, ou de SourceTableN para um mapeamento de tabela, porque o nome que você fornecer pode entrar em conflito com um nome de mapeamento de coluna por defeito existente no ColumnMappingCollection ou com o nome de mapeamento de tabela na DataTableMappingCollection. Se o nome fornecido já existir, uma exceção será lançada.

Manipulação de vários conjuntos de resultados

Se o SelectCommand devolver múltiplas tabelas, Fill gera automaticamente nomes de tabelas com valores incrementais para as tabelas no DataSet, começando pelo nome da tabela especificado e continuando na forma TableNameN, a começar por NomeTabela1. 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 devolve duas tabelas, Customers e Ordens, emite a seguinte chamada para Preencher.

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

São criadas duas tabelas no DataSet: Customers e Customers1. Pode usar mapeamentos de tabela para garantir que a segunda tabela é nomeada Orders em vez de Clientes1. Para isso, mapeie a tabela fonte de Clientes1 para a DataSet tabela Ordens, como mostrado no exemplo seguinte.

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

Consulte também