"DataTable" und "DataColumn"-Zuordnungen mit "DataAdapter"
Ein DataAdapter enthält eine Sammlung von 0 (null) oder mehr DataTableMapping-Objekten in der zugehörigen TableMappings-Eigenschaft. Eine DataTableMapping-Klasse fungiert als primäre Zuordnung zwischen den bei der Abfrage einer Datenquelle zurückgegebenen Daten und einer DataTable-Klasse. 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 von DataTable „Table“. Sie können eine Standard-DataTableMapping-Klasse angeben, indem Sie eine DataTableMapping-Klasse mit dem Namen Table erstellen.
Im folgenden Codebeispiel wird eine DataTableMapping-Klasse (aus dem System.Data.Common-Namespace) erstellt und zur Standardzuordnung für die angegebene DataAdapter-Klasse gemacht, indem sie Table genannt wird. Das Beispiel ordnet anschließend die Spalten in der ersten Tabelle des Abfrageergebnisses (die Customers-Tabelle der Northwind-Datenbank) einer Gruppe benutzerfreundlicherer Namen in der Northwind Customers-Tabelle in der DataSet-Klasse zu. 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. Hierfür fügen Sie einfach weitere 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. Anschließend werden die von der SELECT-Anweisung zurückgegebenen Zeilen der DataTable-Klasse BizTalkSchema 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. Fehlt die Quellspalte einer Spaltenzuordnung, so erhält die Spaltenzuordnung den Standardnamen SourceColumnN, bei dem „N“ immer um eins erhöht wird, beginnend mit SourceColumn1. Fehlt der Quelltabellenname einer Tabellenzuordnung, so erhält die Tabellenzuordnung den Standardnamen SourceTableN, bei dem „N“ immer um eins erhöht wird, beginnend mit SourceTable1.
Hinweis
Es wird davon abgeraten, die Benennungskonvention SourceColumnN für eine Spaltenzuordnung oder SourceTableN für eine Tabellenzuordnung zu verwenden, da der von Ihnen vergebene Name möglicherweise einen Konflikt mit einem bereits vorhandenen Standard-Spaltenzuordnungsnamen in der ColumnMappingCollection-Klasse oder Standard-Tabellenzuordnungsnamen in der DataTableMappingCollection-Klasse verursacht. Wenn der angegebene Name bereits vorhanden ist, wird eine Ausnahme ausgelöst.
Umgang mit mehreren Resultsets
Wenn SelectCommand mehrere Tabellen zurückgibt, generiert die Fill-Methode automatisch Tabellennamen mit inkrementellen Werten für die Tabellen in der DataSet-Klasse. Der angegebene Tabellenname kommt zuerst, und die folgenden Tabellen werden nach dem Muster TableNameN benannt, 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");