Condividi tramite


Mapping di DataAdapter, DataTable e DataColumn

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

Una classe SqlDataAdapter contiene una raccolta di zero o più oggetti DataTableMapping nella proprietà TableMappings. Un oggetto DataTableMapping fornisce un mapping principale tra i dati restituiti da una query eseguita su un'origine dati e una classe DataTable. Al posto del nome della classe 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");

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.

Nota

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". Il nome TableName di DataTable è "Table" se tale DataTableMapping non esiste. È 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.

// 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);

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 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.

// 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);

Nota

Se non viene indicato un nome di colonna di origine per il mapping di una colonna, verranno automaticamente generati nomi predefiniti. Al mapping della colonna viene assegnato il nome predefinito incrementale SourceColumn N, che inizia con SourceColumn1, se non viene indicato il nome della colonna di origine.

Nota

Se non viene indicato un nome di tabella di origine per il mapping di una tabella, verranno automaticamente generati nomi predefiniti. Al mapping della tabella viene assegnato il nome predefinito incrementale SourceTable N, che inizia con SourceTable1, se non viene indicato il nome della tabella di origine.

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.

Gestire 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");

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.

// 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");

Vedi anche