Impostazione dei mapping di DataTable e DataColumn

Un DataAdapter contiene un insieme di zero o più oggetti DataTableMapping nella proprietà TableMappings. Un DataTableMapping fornisce un mapping master tra i dati restituiti da una query eseguita su un'origine dati e un DataTable. Al posto del nome del DataTable è possibile passare il nome di DataTableMapping al metodo Fill di DataAdapter. Nell'esempio seguente viene creato un DataTableMapping denominato AuthorsMapping per la tabella MyAuthors.

workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors")
[C#]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors");

Un DataTableMapping consente di utilizzare in un DataTable nomi di colonne diversi da quelli nel database. DataAdapter utilizza il mapping per mantenere la corrispondenza delle colonne quando la tabella viene aggiornata.

Se non si specifica un nome TableName o DataTableMapping quando si chiama il metodo Fill o Update di DataAdapter, DataAdapter cercherà un DataTableMapping denominato "Table". Se un DataTableMapping così denominato non esiste, il TableName di DataTable sarà "Table". È possibile specificare un DataTableMapping predefinito creando un DataTableMapping con il nome "Table".

Nell'esempio di codice seguente viene creato un DataTableMapping, dallo spazio dei nomi System.Data.Common, che viene impostato come il mapping predefinito per il DataAdapter specificato con nome "Table". Viene quindi eseguito il mapping delle colonne della prima tabella nel gruppo di risultati della query, ovvero la tabella Customers del database Northwind, su un gruppo di nomi più semplici nella tabella Northwind Customers nel DataSet. Per le colonne di cui non viene eseguito il mapping, viene utilizzato il nome della colonna nell'origine dati.

Dim custMap As DataTableMapping = custDA.TableMappings.Add("Table", "NorthwindCustomers")
custMap.ColumnMappings.Add( "CompanyName", "Company")
custMap.ColumnMappings.Add( "ContactName", "Contact")
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode")

custDA.Fill(custDS)
[C#]
DataTableMapping custMap = custDA.TableMappings.Add("Table", "NorthwindCustomers");
custMap.ColumnMappings.Add( "CompanyName", "Company");
custMap.ColumnMappings.Add( "ContactName", "Contact");
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode");

custDA.Fill(custDS);

In un contesto più avanzato, può essere necessario che lo stesso DataAdapter supporti il caricamento di diverse tabelle con diversi mapping. Per effettuare questa operazione, aggiungere semplicemente altri oggetti DataTableMapping.

Quando al metodo Fill vengono passati un'istanza di un DataSet e un nome di DataTableMapping, viene utilizzato un mapping con quel nome, se esiste, altrimenti viene utilizzato un DataTable con quel nome.

Nell'esempio seguente viene creato un DataTableMapping con il nome Customers e viene assegnato il nome BizTalkSchema a un DataTable. Viene quindi eseguito il mapping delle righe restituite dall'istruzione SELECT sul DataTable BizTalkSchema.

Dim bizMap As ITableMapping = custDA.TableMappings.Add("Customers", "BizTalkSchema")
bizMap.ColumnMappings.Add( "CustomerID", "ClientID")
bizMap.ColumnMappings.Add( "CompanyName", "ClientName")
bizMap.ColumnMappings.Add( "ContactName", "Contact")
bizMap.ColumnMappings.Add( "PostalCode", "ZIP")

custDA.Fill(custDS, "Customers")
[C#]
ITableMapping bizMap = custDA.TableMappings.Add("Customers", "BizTalkSchema");
bizMap.ColumnMappings.Add( "CustomerID", "ClientID");
bizMap.ColumnMappings.Add( "CompanyName", "ClientName");
bizMap.ColumnMappings.Add( "ContactName", "Contact");
bizMap.ColumnMappings.Add( "PostalCode", "ZIP");

custDA.Fill(custDS, "Customers");

Nota   Se non viene indicato il nome della colonna di origine per il mapping di una colonna o il nome della tabella di origine per il mapping di una tabella, vengono generati automaticamente i nomi predefiniti. Se non viene indicato il nome della colonna di origine, al mapping della colonna viene assegnato il nome predefinito incrementale SourceColumnN, che inizia con "SourceColumn1". Se non viene indicato il nome della tabella di origine, al mapping della tabella viene assegnato il nome predefinito incrementale SourceTableN, che inizia con "SourceTable1".

È consigliabile evitare la convenzione di denominazione "ColonnaOrigineN", quando si indica il nome di una colonna di origine per il mapping di una colonna, o "TabellaOrigineN", quando si indica il nome di una tabella di origine per il mapping di una tabella, in quanto il nome indicato può entrare in conflitto con il nome predefinito esistente del mapping di una colonna in ColumnMappingCollection o con il nome del mapping di una tabella in DataTableMappingCollection. Se il nome specificato esiste già, verrà generata un'eccezione.

Gruppi di risultati multipli

Se SelectCommand restituisce più tabelle, Fill genera automaticamente nomi di tabella con valori incrementali per le tabelle contenute nel DataSet, che iniziano con il nome specificato e proseguono nel formato NomeTabellaN che inizia con "NomeTabella1". È possibile eseguire il mapping del nome della tabella generato automaticamente sul nome che si desidera specificare per la tabella nel DataSet. Per un SelectCommand che restituisce le due tabelle Customers e Orders, ad esempio, si esegue la chiamata seguente a Fill.

custDA.Fill(custDS, "Customers")

Nel DataSet vengono create due tabelle: Customers e Customers1. È possibile utilizzare i mapping di tabelle per fare in modo che il nome della seconda tabella sia Orders anziché Customers1. Per effettuare questa operazione, eseguire il mapping della tabella di origine di Customers1 sulla tabella Orders del DataSet, come mostrato nell'esempio riportato di seguito.

custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")

Vedere anche

Utilizzo di provider di dati .NET Framework per accedere ai dati | Classe DataSet | Classe DataTable | Classe DataTableCollection | Classe DataTableMappingCollection | Classe OleDbDataAdapter | Classe OdbcDataAdapter | Classe SqlDataAdapter