Mappages de DataAdapter, DataTable et DataColumn
S'applique à : .NET Framework .NET .NET Standard
Un SqlDataAdapter contient une collection de zéro ou plusieurs objets DataTableMapping dans sa propriété TableMappings. Un DataTableMapping fournit un mappage principal entre les données retournées depuis une requête sur une source de données et un objet DataTable. Le nom du DataTableMapping peut être passé à la place du nom de la DataTable à la méthode Fill du DataAdapter. L’exemple suivant crée un DataTableMapping nommé AuthorsMapping pour la table Authors.
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");
Un DataTableMapping vous permet d’utiliser des noms de colonne d’une DataTable différents de ceux de la base de données. Le DataAdapter utilise le mappage pour faire correspondre les colonnes quand la table est mise à jour.
Notes
Si vous ne spécifiez pas un TableName ni un nom de DataTableMapping lors de l’appel de la méthode Fill ou Update du DataAdapter, le DataAdapter recherche un DataTableMapping nommé « Table ». Le TableName du DataTable est « Table » si ce DataTableMapping n’existe pas. Vous pouvez spécifier un DataTableMapping par défaut en créant un DataTableMapping avec le nom « Table ».
L’exemple de code suivant crée un DataTableMapping (de l’espace de noms System.Data.Common) et en fait le mappage par défaut pour le DataAdapter spécifié en le nommant « Table ». L’exemple mappe ensuite les colonnes de la première table du résultat de la requête (la table Customers de la base de données Northwind) à un ensemble de noms plus conviviaux dans la table Northwind Customers du DataSet. Pour les colonnes qui ne sont pas mappées, le nom de la colonne de la source de données est utilisé.
// 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);
Dans des situations plus avancées, vous pouvez décider que vous voulez que le même DataAdapter prenne en charge le chargement de différentes tables avec des mappages différents. Pour cela, ajoutez des objets DataTableMapping supplémentaires.
Quand une instance d’un DataSet et un nom de DataTableMapping sont passés à la méthode Fill, si un mappage de ce nom existe déjà, il est utilisé ; sinon une DataTable de ce nom est utilisée.
Les exemples suivants créent un DataTableMapping avec le nom Customers et BizTalkSchema comme nom de la DataTable. L’exemple mappe alors les lignes retournées par l’instruction SELECT à la 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);
Remarque
Si un nom de colonne source n’est pas fourni pour un mappage de colonnes, les noms par défaut sont générés automatiquement. Le mappage de colonnes reçoit le nom incrémentiel par défaut SourceColumn N, en commençant par SourceColumn1, si un nom de colonne source n’est pas fourni pour un mappage de colonnes.
Remarque
Si un nom de table source n’est pas fourni pour un mappage de tables, les noms par défaut sont générés automatiquement. Le mappage de tables reçoit le nom incrémentiel par défaut SourceTable N, en commençant par SourceTable1, si un nom de table source n’est pas fourni pour un mappage de tables.
Remarque
Nous vous recommandons d’éviter la convention de nommage SourceColumn N pour un mappage de colonnes ou SourceTable N pour un mappage de tables, car le nom que vous fournissez peut être en conflit avec un nom de mappage de colonnes par défaut existant dans la ColumnMappingCollection ou avec un nom de mappage de tables dans la DataTableMappingCollection. Si le nom fourni existe déjà, une exception sera levée.
Gérer plusieurs jeux de résultats
Si votre SelectCommand retourne plusieurs tables, Fill génère automatiquement des noms de table avec des valeurs incrémentielles pour les tables dans le DataSet, en commençant par le nom de table spécifié et en continuant sous la forme TableName N, en commençant par TableName1. Vous pouvez utiliser les mappages de tables pour mapper le nom de table généré automatiquement à un nom que vous voulez spécifier pour la table dans le DataSet. Par exemple, pour une SelectCommand qui retourne deux tables, Customers et Orders, effectuez l’appel suivant à Fill.
adapter.Fill(customersDataSet, "Customers");
Deux tables sont créées dans le DataSet : Customers et Customers1. Vous pouvez utiliser les mappages de tables pour faire en sorte que la deuxième table soit nommée Orders au lieu de Customers1. Pour cela, mappez la table source de Customers1 à la table Orders du DataSet, comme le montre l’exemple suivant.
// 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");