DataSet als lokale XML Datenbank

Oft benötigt man in Applikationen einen kleinen, einfachen Datenspeicher. SQL Server und MySQL sind bei größeren Datenmengen sehr zu empfehlen, für wenige Daten genügt aber auch eine XML Datei.

Dieser Artikel soll zeigen, wie man mit ADO .NET und Visual Basic .NET eine Xml Datei als Datenbank benutzt.

1.     Einleitung

Im Datenzugriffssystem des .NET Frameworks (ADO .NET) werden Daten von Datenbanken im so genannten DataSet zwischengespeichert. Das hat mehrere Vorteile.

·         Die Verbindung zur Datenbank muss nicht immer offen gehalten werden

·         Alle Daten, egal woher sie kommen, haben im DataSet das gleiche Format

·         Daten können zwischen verschiedenen Datenbanken ausgetauscht werden

 

Der für uns wichtigste Vorteil ist, dass die Daten für ein DataSet nicht zwingend aus einer Datenbank kommen bzw. dort abgelegt werden müssen. Ein DataSet kann von der Anwendung mit Benutzereingaben gefüllt werden und dann als Xml Datei gespeichert werden. Xml Dateien haben den Nachteil gegenüber „richtigen“ Datenbanken, dass sie bei einer Größe von 2-5 MB sehr lange zum Laden und Speichern brauchen. Außerdem ist es sehr kompliziert die Daten aktuell zu halten, wenn mehrere Benutzer gleichzeitig darauf zugreifen.

Greift aber nur die Anwendung unter einem Benutzer auf die Xml Datei zu z.B. um Anwendungs- oder Benutzerdaten zu speichern, ist das DataSet ideal.

2.     Das DataSet

Das DataSet selbst verhält sich selbst wie eine Datenbank. Es kann mehrere Tabellen aufnehmen und Beziehungen zwischen den Tabellen verwalten. Die Tabellen haben Spalten, die jeweils einen bestimmen Typ haben.

Beispiel Spalte Name, Typ String.

 

Ein DataSet kann entweder mit dem Visual Studio Schema Editor erstellt werden oder per Code.

3.     Ein DataSet per Code erzeugen

Das DataSet und alle dazugehörigen Klassen findet man im Namensraum System.Data in der Assembly System.Data.dll. Diese ist standardmäßig in das Projekt eingebunden.

Dim ds As System.Data.DataSet = New System.Data.DataSet("MeineDatenbank")

Die Variable ds enthält nun ein leeres DataSet.

 

Nun kann man dem DataSet Tabellen hinzufügen und auf diese zugreifen.

Dazu hat das DataSet die Tables Eigenschaft.

Dim dt As System.Data.DataTable = ds.Tables.Add("Personen")

 

Um auf die Tabelle wieder zuzugreifen kann entweder die Variable dt verwendet werden oder:

ds.Tables("Personen")

 

Bevor die Tabelle Daten aufnehmen kann, müssen ihr noch Spalten hinzugefügt werden.

 

Hier sollte man sich etwas Zeit lassen und genau überlegen, welche Spalten man benötigt und wie diese heißen sollen. Änderungen während der Entwicklungszeit sind zwar möglich können aber zeitaufwendig sein.

Außerdem schützt die IntelliSense bei einem per Code generierten DataSet nicht vor Tippfehlern!

 

Auf die Spalten einer Tabelle kann über die Columns Eigenschaft zugegriffen werden.

dt.Columns.Add("Name", GetType(String))

dt.Columns.Add("Alter", GetType(Integer))

 

Hier werden die Spalten Name vom Typ String und Alter vom Typ Integer hinzugefügt.

Die Definition des DataSets mittels Tables und Columns nennt man Schema.

Ein Schema enthält keine Daten sondern nur die Informationen welche Spalten die Tabellen des DataSets enthalten.

Jedoch ist das Schema sehr wichtig. Kleinste Veränderungen im Namen der Spalten oder Tabellen führen dazu, dass die gespeicherten Daten nicht mehr geladen werden können.

Daraus ergeben sich zwei Grundsätze:

1.      Ein Schema sollte also immer zu Beginn der Entwicklung einer Anwendung erstellt werden

2.      Ein Schema sollte wenn möglich nach der Erstellung nicht mehr verändert werden.

 

Damit ist das DataSet definiert und kann verwendet werden. Wie man Daten zu dem DataSet hinzufügt, zeigt der nächste Abschnitt

4.     Ein DataSet mit Daten füllen

Daten werden in der DataTable werden durch die DataRow dargestellt.

Eine DataRow kann immer nur für eine bestimmte Tabelle erstellt werden und kann immer nur dieser Tabelle zugeordnet bleiben.

Deshalb kann man eine DataRow auch nur mit der Methode NewRow der Tabelle erzeugen.

Dim dr As System.Data.DataRow

dr = dt.NewRow

Die Variable dr enthät nun eine DataRow der Tabelle Personen und stellt einen Datensatz dar. Für jeden Datensatz muss eine DataRow erstellt werden.

 

Die Row „kennt“ nun die Spalten der Tabelle und kann deren Werte aufnehmen.

dr("Name") = "Jan-Cornelius"

dr("Alter") = 200

 

Achtung: Der Datensatz wurde lediglich für die Tabelle erzeugt. Das heißt er wurde ihr noch nicht hinzugefügt!

Auf die DataRows einer Tabelle kann man mit der Rows Eigenschaft zugreifen.

dt.Rows.Add(dr)

 

Nun ist der DatenSatz der Tabelle hinzugefügt und somit Bestandteil des DataSets.

Für jeden DatenSatz, der hinzugefügt werden soll, muss eine Row erstellt, gefüllt und zur Tabelle hinzugefügt werden.

5.     DataSet speichern/laden

Das DataSet zu speichern ist die einfachsten von allen bisher gemeisterten Aufgaben. Dafür stellt es die Methode WriteXml zur Verfügung.

ds.WriteXml("C:\daten.xml")

Die Daten sind nun in der Datei gespeichert und können von dort geladen werden.

 

Beim Laden gibt es aber folgendes zu beachten:

Läd man eine Xml Datei in ein leeres DataSet, werden die darin enthaltenen Spalten und Tabellen automatisch erzeugt.

Jedoch sollten die Daten nie in ein leeres, sondern immer in ein DataSet mit Schema geladen werden (Siehe 3.)

Gibt es z.B. die Spalte Deleted und ist diese in keinem Datensatz gesetzt, taucht sie in der gespeicherten Xml Datei nicht auf.

Sie wird also auch nicht beim Laden des DataSets erstellt. Will man die Deleted Spalte dann jedoch setzten, wird ein Fehler erzeugt, der zum Absturz der Anwendung führen kann.

Aus diesem Grund sollten immer zuerst das Schema erzeugt und dann die Daten geladen werden.

 

Das Laden übernimmt die ReadXml Methode.

ds.ReadXml("C:\daten.xml")

 

Der nächste Abschnitt soll zeigen, wie man auf die Daten im DataSet zugreifen kann.

6.     Auf Daten in einem DataSet zugreifen

Ist das Schema bekannt, kann man auf die Tabellen über deren Namen zugreifen.

Dim dt As System.Data.DataTable = ds.Tables("Personen")

 

Ist das Schema oder der Tabellenname nicht bekannt, kann man auch so auf die Tabellen zugreifen.

Dim dt As System.Data.DataTable = ds.Tables(0)

 

Auf die Daten kann über die dt.Rows Eigenschaft zugegriffen werden. Rows verlangt einen Index. D.h. Rows(0) liefert den ersten Datensatz Rows(1) den zweiten usw.

dr = dt.Rows(index)

Die Anzahl an Datensätzen kann über dt.Rows.Count abgefragt werden.

 

Die Daten in der DataRow kann man so abfragen:

dr = dt.Rows(index)

Console.WriteLine(CStr(dr("Name"))

Console.WriteLine(CStr(dr("Alter"))

 

Oder so:

For Each dr As System.Data.DataRow In dt.Rows

 Console.Writeline("Name: " & CStr(dr("Name")) & " Alter: " & CStr(dr("Alter")))

Next


Kommentare

Es sind noch keine Kommentare vorhanden.

Eigener Kommentar

Sie müssen angemeldet sein, um ein Kommentar zu erstellen.

Zum Impressum