Configuration des mappages DataTable et DataColumn
Un DataAdapter contient une collection de zéro ou plusieurs objets DataTableMapping dans sa propriété TableMappings. DataTableMapping fournit un mappage principal entre les données retournées d'une requête sur une source de données et un DataTable. Le nom DataTableMapping, au lieu du nom DataTable, peut être passé à la méthode Fill du DataAdapter. L'exemple suivant crée un DataTableMapping nommé AuthorsMapping pour la table MyAuthors.
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors")
[C#]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors");
DataTableMapping vous permet d'utiliser dans un DataTable des noms de colonne différents de ceux de la base de données. Le DataAdapter utilise le mappage pour faire correspondre les colonnes lorsque la table est mise à jour.
Si vous ne spécifiez pas de TableName ni de nom DataTableMapping lors des appels aux méthodes Fill ou Update du DataAdapter, celui-ci recherchera un DataTableMapping nommé « Table ». Si ce DataTableMapping n'existe pas, le TableName du DataTable sera « 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 requête (table Customers de la base de données Northwind) à un ensemble de noms plus conviviaux dans la table Customers Northwind 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 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);
Dans les situations plus évoluées, vous pouvez éventuellement décider que vous voulez que le même DataAdapter prenne en charge le chargement de différentes tables avec différents mappages. Pour cela, ajoutez simplement des objets DataTableMapping supplémentaires.
Lorsqu'une instance d'un DataSet et un nom DataTableMapping sont passés à la méthode Fill, si un mappage avec ce nom existe, il est utilisé, sinon un DataTable portant ce nom est utilisé.
L'exemple suivant crée un DataTableMapping avec un nom Customers et un nom de DataTable BizTalkSchema. L'exemple mappe alors les lignes retournées par l'instruction SELECT au 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");
Remarque 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 seront 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 ».
Il est recommandé d'éviter la convention d'affectation de noms de « SourceColumnN » lorsque vous fournissez un nom de colonne source pour un mappage de colonne ou « SourceTableN » lorsque vous fournissez un nom de table source pour un mappage de table, car le nom que vous donnez peut entrer en conflit avec un nom de mappage de colonne par défaut existant dans ColumnMappingCollection ou le nom de mappage de table dans DataTableMappingCollection. Si le nom fourni existe déjà, une exception sera levée.
Jeux de résultats multiples
Si votre SelectCommand retourne plusieurs tables, Fill générera automatiquement les 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 TableNameN, à commencer par « TableName1 ». Vous pouvez utiliser les mappages de table pour mapper le nom de table généré automatiquement à un nom que vous souhaitez spécifier pour la table dans le DataSet. Par exemple, pour un SelectCommand qui retourne deux tables, Customers et Orders, établissez l'appel suivant à Fill.
custDA.Fill(custDS, "Customers")
Deux tables sont créées dans le **DataSet **: Customers et Customers1. Vous pouvez utiliser les mappages de table pour vous assurer que la deuxième table est 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.
custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")
Voir aussi
Utilisation des fournisseurs de données .NET Framework pour l'accès aux données | DataSet, classe | DataTable, classe | DataTableCollection, classe | DataTableMappingCollection, classe | OleDbDataAdapter, classe | OdbcDataAdapter, classe | SqlDataAdapter, classe