Hinzufügen von vorhandenen Einschränkungen zu einem DataSet
Gilt für: .NET Framework .NET .NET Standard
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.
Wenn Sie Informationen zu vorhandenen Primärschlüsseleinschränkungen aus einer Datenquelle in eine DataSet-Klasse übernehmen möchten, können Sie vor dem Aufrufen der Fill-Methode entweder die FillSchema-Methode der DataAdapter-Klasse aufrufen oder die MissingSchemaAction-Eigenschaft der DataAdapter-Klasse 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 in einer Datenquelle eine Spalte mit automatischer Inkrementierung ermittelt wird, erstellt die FillSchema-Methode oder die Fill-Methode mit dem Wert AddWithKey für die MissingSchemaAction-Eigenschaft eine DataColumn-Klasse, deren AutoIncrement-Eigenschaft auf true
festgelegt ist. 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 Sie die Primärschlüsselinformationen zur Entwurfszeit kennen, empfiehlt es sich, zum Erzielen einer optimalen Leistung die Primärschlüsselspalte(n) explizit in der richtigen Reihenfolge anzugeben.
Im folgenden Codebeispiel wird gezeigt, wie Sie einer DataSet-Klasse mit 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 Resultsets
Wenn die DataAdapter-Klasse feststellt, dass mehrere Resultsets von der SelectCommand-Eigenschaft zurückgegeben werden, erstellt sie mehrere Tabellen in der DataSet-Klasse. Diesen Tabellen werden Standardnamen nach dem Muster TableN zugewiesen, beginnend bei 0, allerdings mit Table statt Table0. Wenn ein Tabellenname als Argument an die FillSchema-Methode übergeben wird, erhalten die Tabellen Namen nach dem Muster TableNameN, beginnend bei 0, allerdings mit TableName statt TableName0.