Freigeben über


DataAdapter-, DataTable-und DataColumn-Zuordnungen

Gilt für: .NET Framework .NET .NET Standard

Herunterladen von ADO.NET

Eine SqlDataAdapter-Klasse enthält eine Sammlung von 0 (null) oder mehr DataTableMapping-Objekten in der zugehörigen TableMappings-Eigenschaft. Eine DataTableMapping-Klasse stellt eine Hauptzuordnung zwischen den bei einer Abfrage einer Datenquelle zurückgegebenen Daten und einer DataTable-Klasse bereit. Der DataTableMapping-Name kann anstelle des DataTable-Namens an die Fill-Methode der DataAdapter-Klasse übergeben werden. Im folgenden Beispiel wird eine DataTableMapping-Klasse mit dem Namen AuthorsMapping für die Tabelle Authors erstellt.

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.

Hinweis

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 diese DataTableMapping-Klasse nicht vorhanden ist, lautet der Wert für die TableName-Eigenschaft für die DataTable-Klasse 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.

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

In komplexeren Situationen möchten Sie möglicherweise mit dieser DataAdapter-Klasse das Laden verschiedener Tabellen mit verschiedenen Zuordnungen unterstützen. Fügen Sie hierfür 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.

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

Hinweis

Wenn für eine Spaltenzuordnung kein Quellspaltenname bereitgestellt wird, werden automatisch Standardnamen generiert. Wenn keine Quellspalte für eine Spaltenzuordnung angegeben ist, erhält die Spaltenzuordnung einen Standardnamen nach dem Muster SourceColumnN, beginnend mit SourceColumn1.

Hinweis

Wenn für eine Tabellenzuordnung kein Quelltabellenname bereitgestellt wird, werden automatisch Standardnamen generiert. Wenn kein Quelltabellenname für eine Tabellenzuordnung angegeben ist, erhält die Tabellenzuordnung einen Standardnamen nach dem Muster SourceTableN, 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");

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.

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

Weitere Informationen