Mappages de DataAdapter DataTable et DataColumn

Un DataAdapter 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 d’une requête sur une source de données et un objet DataTable. Le nom DataTableMapping, à la place du nom DataTable, peut être passé à la méthode Fill du DataAdapter. L’exemple suivant crée un DataTableMapping nommé AuthorsMapping pour la table Authors.

workAdapter.TableMappings.Add("AuthorsMapping", "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.

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 ». Si ce DataTableMapping n’existe pas, le TableName du DataTable est « Table ». 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é.

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

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 ce faire, ajoutez simplement 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 à BIzTalkSchemaDataTable.

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

Notes

Si aucun nom de colonne source n'est fourni pour un mappage de colonne ou aucun nom de table source n'est fourni pour un mappage de table, les noms par défaut sont automatiquement générés. Si aucune colonne source n’est fournie pour un mappage de colonne, celui-ci reçoit un nom incrémentiel par défaut de SourceColumnN,, commençant par SourceColumn1. Si aucun nom de table source n’est fourni pour un mappage de table, celui-ci reçoit un nom incrémentiel par défaut de SourceTableN, commençant par SourceTable1.

Notes

Nous vous recommandons d’éviter la convention de nommage SourceColumnN pour un mappage de colonnes ou SourceTableN 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 ColumnMappingCollection ou avec un nom de mappage de tables dans DataTableMappingCollection. Si le nom fourni existe déjà, une exception sera levée.

Gestion de jeux de résultats multiples

Si votre SelectCommand retourne plusieurs tables, Fill génère automatiquement des noms de table avec des valeurs incrémentielles pour les tables dans DataSet, en commençant par le nom de table spécifié et en continuant avec le format TableNameN, à partir de 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")  
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.

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

Voir aussi