Hinzufügen von vorhandenen Einschränkungen zu einem DataSet

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

ADO.NET herunterladen

Die Fill-Methode der SqlDataAdapter-Klasse füllt eine DataSet-Klasse nur mit Tabellenspalten und -zeilen aus einer Datenquelle. Einschränkungen werden zwar häufig durch die Datenquelle festgelegt, die Fill-Methode fügt diese Schemainformationen jedoch nicht standardmäßig der DataSet-Klasse hinzu.

Um ein DataSet mit vorhandenen Primärschlüssel-Constraintinformationen aus einer Datenquelle zu füllen, können Sie entweder die FillSchema-Methode des DataAdapter aufrufen oder die MissingSchemaAction-Eigenschaft des DataAdapter vor dem Aufrufen von Fill auf AddWithKey festlegen. Dadurch wird sichergestellt, dass die Primärschlüsseleinschränkungen in der DataSet-Klasse denen in der Datenquelle entsprechen.

Hinweis

Informationen zu Fremdschlüsseleinschränkungen sind nicht enthalten und müssen explizit erstellt werden.

Wenn Sie einer DataSet-Klasse vor dem Füllen mit Daten Schemainformationen hinzufügen, wird sichergestellt, dass Primärschlüsseleinschränkungen in den DataTable-Objekten in der DataSet-Klasse enthalten sind. Folglich werden die Primärschlüsselspalteninformationen bei weiteren Aufrufen zum Füllen der DataSet-Klasse zum Abgleich neuer Zeilen aus der Datenquelle mit den aktuellen Zeilen in allen DataTable-Klassen verwendet, und die aktuellen Daten in den Tabellen werden mit Daten aus der Datenquelle überschrieben. Ohne die Schemainformationen werden die neuen Zeilen aus der Datenquelle an die DataSet-Klasse angefügt, was zu doppelten Zeilen führt.

Hinweis

Wenn eine Spalte in einer Datenquelle als automatisch inkrementierend erkannt wird, erstellt die FillSchema-Methode oder die Fill-Methode mit einem MissingSchemaAction von AddWithKey eine DataColumn mit einer auf true festgelegten AutoIncrement-Eigenschaft. Die Werte für AutoIncrementStep und AutoIncrementSeed müssen Sie jedoch selbst festlegen.

Hinweis

Wenn Sie die FillSchema-Methode verwenden oder die MissingSchemaAction-Eigenschaft auf AddWithKey festlegen, sind zum Ermitteln von Informationen zur Primärschlüsselspalte zusätzliche Verarbeitungsschritte in der Datenquelle erforderlich. Diese zusätzlichen Verarbeitungsschritte können zu einem Leistungsabfall führen. Wenn Ihnen die Primärschlüsselinformationen bereits beim Entwurf bekannt sind, empfehlen wir, die Primärschlüsselspalte bzw. -spalten explizit anzugeben, um eine optimale Leistung zu erzielen.

Das folgende Codebeispiel zeigt, wie Sie einem DataSet unter Verwendung von FillSchema Schemainformationen hinzufügen:

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

Im folgenden Codebeispiel wird gezeigt, wie Sie einer DataSet-Klasse mit der MissingSchemaAction-Eigenschaft und der Fill-Methode Schemainformationen hinzufügen:

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

Umgang mit mehreren Ergebnismengen

Wenn der DataAdapter auf mehrere von SelectCommand zurückgegebene Ergebnismengen trifft, erstellt er mehrere Tabellen im DataSet. Den Tabellen werden inkrementelle nullbasierte Standardnamen nach dem Muster TableN zugewiesen, beginnend mit Table statt mit "Table0". Die Tabellen erhalten einen inkrementellen, nullbasierten Namen der Form TableNameN, beginnend mit TableName statt mit „TableName0“, wenn ein Tabellenname als Argument an die FillSchema-Methode übergeben wird.