Einführung in SQLite mit C#

SQLite ist eine schlanke relationale Datenbank, die von C# mittels NuGet-Paketmanager kostenlos unterstützt wird. Wenn man sein Programm weitergibt, muss nur eine XML- und DLL-Datei dazu gegeben werden. Da beide zusammen nur rund 1 Megabyte klein sind, macht das die gesamte Anwendung in der heutigen Zeit äußerst kompakt.

Dieser Artikel soll in die Thematik einführen und den Einstieg im Umgang mit SQLite erleichtern. Es wird davon ausgegangen, dass die wichtigsten SQL-Befehle bekannt sind. Sollte das nicht der Fall sein, kann man dieses kurzweilige Tutorialspiel absolvieren.

Grundeinstellungen

Alles beginnt mit einem Projekt. In diesem Fall legen wir eins für die Konsole an. Wer will, kann natürlich auch gleich eine grafische Oberfläche anlegen. Allerdings ist das Feedback nicht praktischer, als mit einer einfachen Textausgabe.

Im zweiten Schritt muss die SQLite-Bibliothek eingebunden werden. Dazu steht uns mit dem NuGet-Paketmanager ein einfaches Werkzeug zur Verfügung, wo man anhand des Begriffs „SQLite“ nach dem Paket suchen kann, dieses zusammen mit dem Projekt auswählt und dann installiert.

Und zum Abschluss fügt man noch den Namespace System.Data.SQLite hinzu. Das war‘s dann auch schon mit der Vorbereitung.

 
Datenbank erstellen

Zunächst erstellen wir eine Datenbank, mit der wir in diesem Artikel arbeiten wollen. Die Bezeichnung sollte erkennen lassen, für welches Projekt sie benutzt wird.

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteConnection.CreateFile("SQLTutorial.sqlite")</span>;</span>

In diesem Fall wird die Datei direkt im Anwendungsordner erstellt. Möchten wir sie woanders anlegen, kann man den kompletten Pfad angeben.

Verbindung herstellen

Um die Datenbank nun nutzen zu können, benötigen wir eine entsprechende Verbindung. Dazu erstellen wir ein Verbindungsobjekt, welches die Schnittstelle darstellt. Das sieht wie folgt aus:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteConnection dbConnection = new SQLiteConnection("Data Source = SQLTutorial.sqlite; Version = 3;");</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">dbConnection.Open();</span></span>

Die Zeichenkette spielt dabei eine zentrale Rolle. Mit ihr können wir nicht nur die Datenbank angeben, sondern, wie man sieht, auch die Version. Sollte sie Kennwort geschützt sein, muss man das dem Verbindungsobjekt an dieser Stelle ebenfalls mitteilen. Dazu fügt man der Zeichenkette einfach den Term Password=MyPassword; hinzu.

Möchte man ein Kennwort setzen, ist das nach der Verbindung ebenfalls möglich:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">dbConnection.ChangePassword("myPassword");</span></span>

Entfernen lässt sich dieses übrigens wieder mit:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">dbConnection.ChangePassword(String.Empty);</span></span>

Weitere Verbindungsoptionen findet man hier.

Erstellen einer Tabelle

Eine Datenbank zu besitzen ist zwar schön und gut, allerdings werden die Daten in Tabellen gehalten. Dazu legen wir jetzt eine neue an:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">string sql = "CREATE TABLE personen(vorname TEXT, nachname TEXT)";</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteCommand Command = new SQLiteCommand(sql, dbConnection);</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.ExecuteNonQuery();</span></span>

Die erste Zeile dürfte klar sein. Es wird eine Zeichenkette mit dem SQL-Befehl deklariert, in dem wir die Tabelle personen anlegen und ihr zwei Attribute(Spalten) mit den Bezeichnungen vorname und nachname mitgeben.
In Zeile Zwei wird ein neues Befehlsobjekt erstellt, dem wir zum einen die SQL-Zeichenkette, zum anderen das Verbindungsobjekt übergeben. Und die dritte Zeile führt den Befehl letztendlich aus.

Datentypen

An dieser Stelle möchte ich das Thema Datentypen kurz einschieben. Der geübte Anwender wird sich gewundert haben, dass ich für die Attribute TEXT gewählt habe. Diese stellen in SQLite Container dar. Das Konzept dahinter ist simpel. Je nachdem welcher Datentyp in der deklariert wird, z.B. das gebräuchliche varchar(20), wird dieser automatisch in den Container TEXT umgewandelt. Neben TEXT, gibt es noch INTEGER, REAL, NUMERIC und BLOB. Weitere Informationen findet man hier.

Deshalb spielt es keine Rolle, ob wir varchar(20) oder doch lieber gleich TEXT nehmen.

Tabelle füllen

Es wird Zeit die Tabelle mit Daten zu füllen. Wie beim Erstellen benutzen wir wieder eine Zeichenkette (zusammen mit den beiden anderen Befehlen), die wir wie folgt schreiben:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">string sql = "INSERT INTO personen(vorname, nachname) VALUES ('Frank', 'Röger')";</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteCommand Command = new SQLiteCommand(sql, dbConnection);</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.ExecuteNonQuery();</span></span>

Hierbei können wir allerdings in eine böse Falle laufen, in die wir erst zur Laufzeit tappen. Dieses Beispiel mag zwar funktionieren. Was geschieht allerdings, wenn der Vorname ein Apostroph beinhaltet (z.B. „Luna’Chiwa“)? Genau, die Geschichte fliegt uns mit einer Exception um die Ohren. Die Lösung lautet in dem Fall Parametrisierung:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">string sql = "INSERT INTO personen(vorname, nachname) VALUES(@vorname, @nachname)";</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteCommand Command = new SQLiteCommand(sql, dbConnection);</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.Parameters.Add("@vorname", System.Data.DbType.String).Value = "Luna’Chiwa";</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.Parameters.Add("@nachname", System.Data.DbType.String).Value = "Musterfrau";</span></span>
1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.ExecuteNonQuery();</span></span>

Damit gibt es keine Probleme mehr mit jeglichen Formen von Zeichenketten. Wenn man in einer Methode mehrere SQL-Befehle mit Parametern abarbeitet, sollte man das Leeren der Parameterliste nicht vergessen:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Command.Parameters.Clear();</span></span>

Datensätze auswählen

Um auf eingefügte Datensätze zuzugreifen, benötigen wir zusätzlich ein DataReader-Objekt, dem das Ergebnis des SELECT-Befehls übergeben wird:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">string sql = "SELECT * FROM personen";</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteCommand command = new SQLiteCommand(sql, dbConnection);</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">SQLiteDataReader reader = command.ExecuteReader();</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">while (reader.Read())</span></span>

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">Console.WriteLine("Name: " + reader["vorname"] + " " + reader["nachname"]);</span></span>

Feedback

Eingangs habe ich das Feedback erwähnt. Damit sind Meldungen des Verbindungsobjektes gemeint, wie z.B. die Information, wie viele Datensätze von einer Aktualisierung betroffen sind oder wie viele Datensätze gelöscht wurden:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">int Anzahl = Convert.ToInt32(command.ExecuteNonQuery());</span></span>

Auch die Anzahl der ausgewählten Datensätze kann auf einfache weise ermittelt werden:

1
<span style="font-size: 10pt;"><span style="color: #3366ff;">int Anzahl = Convert.ToInt32(command.ExecuteScalar());</span></span>

Schlussbemerkung

Wie man sieht, ist der Umgang mit SQLite-Datenbanken ein Kinderspiel und erfordert nur eine geringe Einarbeitungszeit. Zu guter Letzt möchte ich noch den „DB Browser for SQLite“ erwähnen, der im Umgang mit Datenbanken gute Dienste leistet.

6 Gedanken zu „Einführung in SQLite mit C#

  • 7. Januar 2018 um 14:59
    Permalink

    Hallo,
    ich hatte zuvor schon etwas gegoogled, aber dies ist mit Abstand die prägnanteste Zusammenfassung. Außerdem enthält sie alle relevanten Links. – Toll und Danke.

    Antworten
  • 10. August 2018 um 14:22
    Permalink

    Hallo Frank
    Danke für die kompakte Einführung, hat bei mir in 5 Minuten geklappt und zur ersten erfolgreichen SQLite-DB Anbindung mit C# geführt.
    Beste Grüsse

    Antworten
  • 9. Januar 2019 um 16:00
    Permalink

    Bin noch ziemlich am anfang mit c#
    Werden das erstellen und füllen nacheinander geschrieben?
    Oder in separate Klassen?
    Command ist bereits definiert…

    LG Marko

    Antworten
    • 11. Januar 2019 um 12:41
      Permalink

      Hallo Marko,
      hängt ganz von deinem Programmdesign ab. Wenn du nur diese Einführung machen möchtest, reicht es völlig, wenn du alles in einer Klasse und einer Methode ausprobierst. In späteren Anwendungen empfehle ich dir allerdings zwei Methoden in einer (Datenbank-)Klasse zu erstellen:

      CreateTable -> Zum Erstellen einer Tabelle; Parameter wäre z.B. eine Tabellenbezeichnung
      InsertIntoTable -> Zum Hinzufügen eines Datensatzes; Parameter die Daten, die du einfügen möchtest

      Zudem empfehlen sich zwei weitere Methoden zum Herstellen und wieder Schließen der Verbindung zu erstellen.

      Beste Grüße

      Antworten
  • 8. März 2019 um 13:51
    Permalink

    Hi,
    super Tutorial, hat prima funktioniert!

    Vielen Dank
    LG Elias

    Antworten
    • 9. März 2019 um 12:32
      Permalink

      Dank auch! Ich sehe aber, dass manche Teile dieses Beitrages überarbeitet werden sollten. Denke mit dem Release von Visual Studio 19 werde ich eine überarbeitete Fassung veröffentlichen.

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.