DataSet

Eintrag zuletzt aktualisiert am: 20.01.2024

Ein DataSet ist das zentrale Element der Datenbankzugriffschnittstelle ADO.NET und repräsentiert eine Menge von Tabellen (Relationen) im Hauptspeicher. Ein DataSet kann daher auch als eine hierarchische In-Memory-Database bezeichnet werden.

Hinweis: In Microsoft SQL Server Reporting Services (SSRS) wird der Begriff "DataSet" allgemein für eine Datenmenge verwendet. SSRS-Datasets basieren nicht auf ADO.NET Datasets.

Die Klasse System.Data.DataSet [https://learn.microsoft.com/de-de/dotnet/api/system.data.dataset] gibt es seit dem .NET Framework Version 1.0 aus dem Jahr 2001. Sie war damals eine Revolution für den Datenzugriff. In den ersten Versionen von .NET Core war die Klasse DataSet nicht enthalten. Im Zuge von der Angleichung von .NET Framework und .NET Core kam sie jedoch in den .NET Standard 2.0 und ist dabei seit .NET Core 2.0 in allen modernen .NET-Versionen bis einschließlich der aktuellen Version 8.0 aus dem November 2023 enthalten.

Aufbau eines DataSets

Das DataSet ist im Standard ein untypisierter Datencontainer, der beliebigen Datenbanktabellen, Views, Resultsets von SQL-Abfragen oder manuell dort abgelegte Daten speichern kann. Ein DataSet besteht aus einer oder mehreren Tabellen (DataTable). Die Anzahl der Spalten (DataColumn) und Zeilen ist nicht begrenzt. Jede Spalte besitzt einen Datentyp, in dem man die wichtigsten elementaren .NET-Datentypen (siehe [https://learn.microsoft.com/de-de/dotnet/api/system.data.datacolumn.datatype]) verwenden kann: Boolean, Byte, Char, DateTime, Decimal, Double, Guid, Int16, Int32, Int64, SByte, Single, String, TimeSpan, UInt16, UInt32 und UInt64. Auch Byte-Arrays sind möglich.

Es gibt auch eine typisierte Variante des DataSets ("Typed DataSet"), die auf Codegenerierung zur Entwicklungszeit basiert.

DataSets befüllen

Es gibt drei Möglichkeiten, ein DataSet zu füllen:
1. Die Tabelle können mit Hilfe von Managed Providern aus unterschiedlichen Datenbankquellen geladen werden. Um Daten aus einem Managed Provider in ein DataSet zu tranferieren, wird ein DataAdapter benötigt.
2. Auch das Laden von XML-Daten in ein DataSet ist möglich.
3. Zum Dritten kann ein DataSet auch per Programmcode gefüllt werden.

DataSet vs. Recordset

Dieses Konzept existierte im Vorgänger ActiveX Data Objects (ADO) noch nicht. Dort gab es nur RecordSet-Objekte, die jeweils genau eine Tabelle (im relationalen Datenbankmodell auch Relation genannt – nicht zu verwechseln mit dem englischen Begriff relation, der Verknüpfung bedeutet) repräsentiert haben. Ein DataSet ist aber nicht die Zusammenfassung mehrerer RecordSet-Objekte. Die einzelnen Tabellen werden nicht mehr durch RecordSet-, sondern durch DataTable-Objekte repräsentiert.

Weitere Möglichkeiten im DataSet

Zwischen DataTable-Objekten in einem DataSet können Verknüpfungen definiert werden. Die Verknüpfungen werden dann nicht wie Joins im relationalen Datenbankmodell als Tabellen, sondern durch hierarchische Eltern-Kind-Beziehungen dargestellt.

Ein DataSet ist disconnected, d.h. die Daten aus der Datenquelle werden komplett in das DataSet eingelesen, im Speicher gehalten und erst zu einem definierbaren Zeitpunkt werden die kompletten Änderungen zurück an die Datenquelle gegeben (Batch Update).