Mapping di DataAdapter, DataTable e DataColumn
Un oggetto DataAdapter contiene una raccolta di zero o più oggetti DataTableMapping nella proprietà TableMappings. Un DataTableMapping fornisce un mapping primario tra i dati restituiti da una query eseguita su un'origine dati e un oggetto DataTable. Al posto del nome della DataTable è possibile passare il nome di DataTableMapping al metodo Fill di DataAdapter. L'esempio seguente crea un oggetto DataTableMapping denominato AuthorsMapping per la tabella Authors.
workAdapter.TableMappings.Add("AuthorsMapping", "Authors")
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");
Un oggetto DataTableMapping consente di usare in una classe DataTable nomi di colonne diversi da quelli presenti nel database. L'oggetto DataAdapter usa 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 oggetto DataTableMapping denominato "Table". Se tale DataTableMapping non esiste, il TableName di DataTable sarà "Table". È possibile specificare un oggetto DataTableMapping predefinito creando un oggetto DataTableMapping con il nome "Table".
L'esempio di codice seguente crea un oggetto DataTableMapping (dallo spazio dei nomi System.Data.Common) che viene impostato come mapping predefinito per la classe DataAdapter specificata denominandolo "Table". Viene quindi eseguito il mapping delle colonne della prima tabella nel set di risultati della query, ovvero la tabella Customers del database Northwind, a un set di nomi più semplici nella tabella Northwind Customers dell'oggetto DataSet. Per le colonne di cui non viene eseguito il mapping, viene usato il nome della colonna nell'origine dati.
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);
In un contesto più avanzato, può essere necessario che lo stesso oggetto DataAdapter supporti il caricamento di diverse tabelle con mapping diversi. A tale scopo è sufficiente aggiungere altri oggetti DataTableMapping.
Quando al metodo Fill vengono passati un'istanza di DataSet e un nome di DataTableMapping, viene usato un mapping con tale nome, se esistente. In caso contrario, viene usata una classe DataTable con tale nome.
L'esempio seguente crea un oggetto DataTableMapping con il nome Customers e viene assegnato il nome BizTalkSchema a una classe DataTable. Viene quindi eseguito il mapping delle righe restituite dall'istruzione SELECT alla classe DataTable BizTalkSchema.
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 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 nomi predefiniti. Se non viene indicato il nome della colonna di origine, al mapping della colonna viene assegnato il nome predefinito incrementale SourceColumn N, a partire da SourceColumn1. Se non viene indicato il nome della tabella di origine, al mapping della tabella viene assegnato il nome predefinito incrementale SourceTable N, a partire da SourceTable1.
Nota
Si consiglia di evitare la convenzione di denominazione di SourceColumn N per il mapping di una colonna o di SourceTable N per il mapping di una tabella, perché 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.
Gestione di più set di risultati
Se SelectCommand restituisce più tabelle, Fill genera automaticamente nomi di tabella con valori incrementali per le tabelle contenute in DataSet, che iniziano con il nome specificato e proseguono nel formato TableName N, che inizia con TableName1. È possibile eseguire il mapping del nome della tabella generato automaticamente al nome che si vuole specificare per la tabella in DataSet. Per un oggetto SelectCommand che restituisce le due tabelle Customers e Orders, ad esempio, si esegue la chiamata seguente a Fill.
adapter.Fill(customersDataSet, "Customers")
adapter.Fill(customersDataSet, "Customers");
Vengono create due tabelle nell'oggetto DataSet: Customers e Customers1. È possibile usare i mapping di tabelle per fare in modo che il nome della seconda tabella sia Orders invece di Customers1. A tale scopo, eseguire il mapping della tabella di origine di Customers1 alla tabella Orders di DataSet, come illustrato nell'esempio seguente.
adapter.TableMappings.Add("Customers1", "Orders")
adapter.Fill(customersDataSet, "Customers")
adapter.TableMappings.Add("Customers1", "Orders");
adapter.Fill(customersDataSet, "Customers");