"DataTable" und "DataColumn"-Zuordnungen mit "DataAdapter"

Ein DataAdapter enthält eine Auflistung von null oder mehr Objekten in der TableMappings-Eigenschaft . Ein DataTableMapping stellt eine primäre Zuordnung zwischen den Daten bereit, die von einer Abfrage für eine Datenquelle zurückgegeben werden, und einer . Der DataTableMapping-Name kann anstelle des DataTable-Namens an die Fill-Methode von DataAdapter übergeben werden. Im folgenden Beispiel wird eine DataTableMapping-Klasse mit dem Namen AuthorsMapping für die Tabelle Authors erstellt.

workAdapter.TableMappings.Add("AuthorsMapping", "Authors")  
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");  

Mit einer DataTableMapping-Klasse können Sie in einer DataTable-Klasse andere Spaltennamen als in der Datenbank verwenden. Die DataAdapter-Klasse gleicht beim Aktualisieren der Tabelle mithilfe der Zuordnung die Spalten miteinander ab.

Wenn Sie beim Aufrufen der Fill-Methode oder der Update-Methode der DataAdapter-Klasse die TableName-Eigenschaft oder den DataTableMapping-Namen nicht angeben, sucht die DataAdapter-Klasse nach einer DataTableMapping-Klasse mit dem Namen Table. Wenn dataTableMapping nicht vorhanden ist, lautet der TableName der DataTable "Table". Sie können eine Standard-DataTableMapping-Klasse angeben, indem Sie eine DataTableMapping-Klasse mit dem Namen Table erstellen.

Im folgenden Codebeispiel wird ein DataTableMapping (aus dem Namespace) erstellt und als Standardzuordnung für den angegebenen DataAdapter festgelegt, indem es "Table" genannt wird. Im Beispiel werden dann die Spalten aus der ersten Tabelle im Abfrageergebnis (die Customers-Tabelle der Northwind-Datenbank ) einer Gruppe benutzerfreundlicherer Namen in der Northwind Customers-Tabelle in der zugeordnet. Für Spalten, die nicht zugeordnet werden, wird der Name der Spalte in der Datenquelle verwendet.

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 komplexeren Situationen möchten Sie möglicherweise mit dieser DataAdapter-Klasse das Laden verschiedener Tabellen mit verschiedenen Zuordnungen unterstützen. Fügen Sie hierzu einfach zusätzliche DataTableMapping-Objekte hinzu.

Wenn der Fill-Methode eine Instanz einer DataSet-Klasse und ein DataTableMapping-Name übergeben werden, wird die Zuordnung mit diesem Namen verwendet, sofern vorhanden. Andernfalls wird eine DataTable-Klasse mit diesem Namen verwendet.

Im folgenden Beispiel werden eine DataTableMapping-Klasse mit dem Namen Customers und eine DataTable-Klasse mit dem Namen BizTalkSchema erstellt. Im Beispiel werden dann die von der SELECT-Anweisung zurückgegebenen Zeilen der BizTalkSchemaDataTable zugeordnet.

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

Hinweis

Wenn für eine Spaltenzuordnung kein Quellspaltenname bzw. für eine Tabellenzuordnung kein Quelltabellenname angegeben wird, werden automatisch Standardnamen generiert. Wenn für eine Spaltenzuordnung keine Quellspalte angegeben wird, erhält die Spaltenzuordnung ab SourceColumn1 den inkrementellen Standardnamen SourceColumnN. Wenn für eine Tabellenzuordnung kein Quelltabellenname angegeben wird, erhält die Tabellenzuordnung ab SourceTable1 den inkrementellen Standardnamen SourceTableN.

Hinweis

Es wird empfohlen, die Namenskonvention von SourceColumnN für eine Spaltenzuordnung oder SourceTableN für eine Tabellenzuordnung zu vermeiden, da der von Ihnen angegebene Name möglicherweise mit einem vorhandenen Standardnamen für die Spaltenzuordnung in der ColumnMappingCollection oder dem Tabellenzuordnungsnamen in der DataTableMappingCollection in Konflikt steht. Wenn der angegebene Name bereits vorhanden ist, wird eine Ausnahme ausgelöst.

Umgang mit mehreren Resultsets

Wenn SelectCommand mehrere Tabellen zurückgibt, generiert Fill automatisch Tabellennamen mit inkrementellen Werten für die Tabellen im DataSet, beginnend mit dem angegebenen Tabellennamen und im Format TableNameN, beginnend mit TableName1. Mit Tabellenzuordnungen können Sie den automatisch generierten Tabellennamen einem Namen zuordnen, der für die Tabelle in der DataSet-Klasse angegeben werden soll. Rufen Sie beispielsweise für ein SelectCommand-Objekt, das die beiden Tabellen Customers und Orders zurückgibt, die Fill-Methode folgendermaßen auf.

adapter.Fill(customersDataSet, "Customers")  
adapter.Fill(customersDataSet, "Customers");  

In der DataSet-Klasse werden zwei Tabellen erstellt: Customers und Customers1. Mit Tabellenzuordnungen können Sie sicherstellen, dass die zweite Tabelle den Namen Orders und nicht Customers1 erhält. Hierfür ordnen Sie der Quelltabelle von Customers1 die DataSet-Tabelle Orders zu, wie im folgenden Beispiel zu sehen.

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

Weitere Informationen