Mapeamentos de DataTable e de DataColumn do DataAdapterDataAdapter DataTable and DataColumn Mappings

Um DataAdapter contém uma coleção de zero ou mais DataTableMapping objetos em sua propriedade TableMappings .A DataAdapter contains a collection of zero or more DataTableMapping objects in its TableMappings property. Um DataTableMapping fornece um mapeamento mestre entre os dados retornados de uma consulta em relação a uma fonte de dados DataTablee um.A DataTableMapping provides a master mapping between the data returned from a query against a data source, and a DataTable. O nome de DataTableMapping pode ser passado no lugar do nome DataTable para o método Fill do DataAdapter.The DataTableMapping name can be passed in place of the DataTable name to the Fill method of the DataAdapter. O exemplo a seguir cria um DataTableMapping chamado AuthorsMapping para a tabela Authors .The following example creates a DataTableMapping named AuthorsMapping for the Authors table.

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

Um DataTableMapping permite que você use nomes de coluna em uma DataTable que são diferentes daquelas no banco de dados.A DataTableMapping enables you to use column names in a DataTable that are different from those in the database. O DataAdapter usa o mapeamento para corresponder as colunas quando a tabela é atualizada.The DataAdapter uses the mapping to match the columns when the table is updated.

Se você não especificar um nome de tabela ou de DataTableMapping ao chamar o método Fill ou Update do DataAdapter, o DataAdapter procurará um DataTableMapping chamado "Table".If you do not specify a TableName or a DataTableMapping name when calling the Fill or Update method of the DataAdapter, the DataAdapter looks for a DataTableMapping named "Table". Se esse DataTableMapping não existir, o TableName da DataTable será "Table".If that DataTableMapping does not exist, the TableName of the DataTable is "Table". Você pode especificar um DataTableMapping padrão criando um DataTableMapping com o nome "Table".You can specify a default DataTableMapping by creating a DataTableMapping with the name of "Table".

O exemplo de código a seguir cria um DataTableMapping ( System.Data.Common do namespace) e o torna o mapeamento padrão para o DataAdapter especificado, nomeando-o como "Table".The following code example creates a DataTableMapping (from the System.Data.Common namespace) and makes it the default mapping for the specified DataAdapter by naming it "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 DataSet Customers da Northwind no.The example then maps the columns from the first table in the query result (the Customers table of the Northwind database) to a set of more user-friendly names in the Northwind Customers table in the DataSet. Para colunas que não são mapeadas, o nome da coluna na fonte de dados é usado.For columns that are not mapped, the name of the column from the data source is used.

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 tabelas diferentes com mapeamentos diferentes.In more advanced situations, you may decide that you want the same DataAdapter to support loading different tables with different mappings. Para fazer isso, basta adicionar outros objetos DataTableMapping .To do this, simply add additional DataTableMapping objects.

Quando o método Fill passa uma instância de um conjunto de um DataSet e um nome DataTableMapping , se um mapeamento com esse nome já existir, ele será usado; caso contrário, será usada uma DataTable com esse nome.When the Fill method is passed an instance of a DataSet and a DataTableMapping name, if a mapping with that name exists it is used; otherwise, a DataTable with that name is used.

Os exemplos a seguir criam um DataTableMapping com um nome de Customers e um nome DataTable de BizTalkSchema.The following examples create a DataTableMapping with a name of Customers and a DataTable name of BizTalkSchema. Em seguida, o exemplo mapeia as linhas retornadas pela instrução SELECT para a DataTable BizTalkSchema .The example then maps the rows returned by the SELECT statement to the 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");  

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.If a source column name is not supplied for a column mapping or a source table name is not supplied for a table mapping, default names will be automatically generated. 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.If no source column is supplied for a column mapping, the column mapping is given an incremental default name of SourceColumn N, starting with 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.If no source table name is supplied for a table mapping, the table mapping is given an incremental default name of SourceTable N, starting with SourceTable1.

Observação

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, pois o nome que você fornece pode entrar em conflito com um nome de mapeamento de coluna padrão existente no ColumnMappingcollection ou nome de mapeamento de tabela no DataTableMappingCollection.We recommend that you avoid the naming convention of SourceColumn N for a column mapping, or SourceTable N for a table mapping, because the name you supply may conflict with an existing default column mapping name in the ColumnMappingCollection or table mapping name in the DataTableMappingCollection. Se o nome fornecido já existir, será gerada uma exceção.If the supplied name already exists, an exception will be thrown.

Manipulando vários conjuntos de resultadosHandling Multiple Result Sets

Se o SelectCommand retornar várias tabelas, Fill gerará automaticamente nomes de tabela com valores incrementais para as tabelas no conjuntode valores, começando com o nome da tabela especificada e continuando no formato TableName N, começando com TableName1.If your SelectCommand returns multiple tables, Fill automatically generates table names with incremental values for the tables in the DataSet, starting with the specified table name and continuing on in the form TableName N, starting with TableName1. Você pode usar mapeamentos de tabela para mapear o nome de tabela gerado automaticamente para um nome que você deseja especificar para a tabela no DataSet.You can use table mappings to map the automatically generated table name to a name you want specified for the table in the DataSet. Por exemplo, para um SelectCommand que retorna duas tabelas, Customers e Orders, emita a seguinte chamada para Fill.For example, for a SelectCommand that returns two tables, Customers and Orders, issue the following call to Fill.

adapter.Fill(customersDataSet, "Customers")  

Duas tabelas são criadas no conjunto de conjuntos: Clientes e Customers1.Two tables are created in the DataSet: Customers and Customers1. Você pode usar mapeamentos de tabela para garantir que a segunda tabela seja denominada Orders em vez de Customers1.You can use table mappings to ensure that the second table is named Orders instead of Customers1. Para fazer isso, mapeie a tabela de origem de Customers1 para os pedidosde tabela de conjunto de tabelas, conforme mostrado no exemplo a seguir.To do this, map the source table of Customers1 to the DataSet table Orders, as shown in the following example.

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

Consulte tambémSee also