SQLite-Datenmodellierung per C#

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Wenn Sie eine SQLite-Datenbank von einer WPF/C#-Anwendung aus nutzen, möchten Sie gegebenenfalls einmal Tabellen in dieser Datenbank anlegen, ändern oder löschen oder gar neue Datenbanken mit C# erstellen. Dies kann beispielsweise interessant werden, wenn Sie eine neue Version einer Anwendung ausliefern, aber der Benutzer die Daten in der Datenbank der vorherigen Version weiter nutzen möchte. Dieser Artikel stellt die grundlegenden Vorgehensweisen für diese Arbeitsschritte vor.

NuGet-Paket für SQLite hinzufügen

Wenn Sie von einer C#-Anwendung aus Änderungen an einer SQLite-Datenbank vornehmen oder diese sogar erstellen wollen, benötigen Sie das NuGet-Paket mit den entsprechenden Erweiterungen. Dazu klicken Sie mit der rechten Maustaste auf das Projekt im Projektmappen-Explorer und wählen den Kontextmenü-Eintrag NuGet-Pakete verwalten… aus. Im nun erscheinenden Bereich wechseln Sie auf Durchsuchen und suchen nach SQLite. Den nun auftauchenden Eintrag System.Data.SQLite können Sie dann auswählen und installieren.

SQLite-Befehle verfügbar machen

In der Klasse, in der Sie die Befehle zum Erstellen und Anpassen von SQLite-Datenbanken unterbringen wollen, benötigen Sie zunächst einen Verweis auf den Namespace System.Data.SQLite, der erst nach dem Hinzufügen des oben genannten NuGet-Pakets vorfinden:

using System.Data.SQLite;

Leere Datenbank erstellen

Um eine leere Datenbank zu erstellen, fügen wir dem Fenster MainWindow.xaml ein Textfeld zur Eingabe des Datenbanknamens sowie eine Schaltfläche zum Erstellen der leeren Datenbankdatei hinzu. Diese Schaltfläche soll die folgende Methode auslösen:

private void btnCreateDatabase_Click(object sender, RoutedEventArgs e) {
     string databaseFile = AppDomain.CurrentDomain.BaseDirectory + txtDatenbankname.Text;
     File.Delete(databaseFile);
     SQLiteConnection.CreateFile(databaseFile);
     if (File.Exists(databaseFile)) {
         MessageBox.Show("Leere Datenbank \n\n''" + databaseFile + "''\n\n wurde erstellt.");
     }
}

Die Methode trägt den Pfad der .exe-Datei plus den vom Benutzer gewählten Datenbanknamen in die Variable databaseFile ein. Diese Datei wird, sofern vorhanden, gelöscht und dann mit der Methode CreateFile des Objekts SQLiteConnection neu erstellt. Dabei übergeben Sie die Variable mit dem Datenbankpfad als Parameter. Die folgende if-Bedingung prüft, ob nach diesem Vorgang eine Datei mit dem angegebenen Namen vorhanden ist und zeigt in diesem Fall eine entsprechende Meldung an.

Neue Tabelle erstellen

Nun wollen wir der frisch angelegten Datenbank eine erste Tabelle hinzufügen. Das ist dann auch tatsächlich der erste Inhalt der Datenbankdatei – diese weist nach dem Anlegen nämlich die Dateigröße 0 auf (siehe Bild 1). Danach rufen wir mit der Tasten btnCreateTable die folgende Methode auf, die wieder den Pfad der .exe-Datei und den Dateinamen aus dem Textfeld in der Variablen databaseFile zusammensetzt. Dann erstellt sie ein neues Objekt des Typs SQLiteConnection, der sie als Konstruktor-Parameter eine Zeichenkette übergibt, die aus Data Source=, dem Datenbankpfad und der zu verwenden Version besteht.

Frisch angelegte Datenbankdatei

Bild 1: Frisch angelegte Datenbankdatei

Die Open-Methode öffnet die Verbindung zu dieser Datenbank. Dann schreibt die Methode eine CREATE TABLE-Anweisung, die eine neue Tabelle namens Beispieltabelle mit den beiden Feldern id und Beispielstring enthält. Nun erstellt die Methode ein neues SQLiteCommand-Objekt und übergibt die SQL-Anweisung aus der String-Variablen sql sowie das Verbindungsobjekt aus connection als Parameter. Die ExecuteNonQuery-Methode führt die CREATE TABLE-Anweisung schließlich aus. Mit der Close-Methode schließen wir die Verbindung:

private void btnCreateTable_Click(object sender, RoutedEventArgs e) {
     string databaseFile = AppDomain.CurrentDomain.BaseDirectory + txtDatenbankname.Text;
     SQLiteConnection connection = new SQLiteConnection("Data Source=" + databaseFile + ";Version=3;");
     connection.Open();
     string sql = "CREATE TABLE Beispieltabelle (id INT, Beispielstring VARCHAR(255))";
     SQLiteCommand command = new SQLiteCommand(sql, connection);
     command.ExecuteNonQuery();
     connection.Close();
}

Ein Blick in den Windows Explorer zeigt, dass dies nicht spurlos an der Datenbankdatei vorübergegangen ist: Diese hat nun immerhin eine Größe von acht Kilobytes. Aber befindet sich auch die neue Tabelle darin Dies prüfen wir mit dem Tool SQLiteStudio, das Sie kostenlos über das Internet herunterladen können. Mit dem Menüeintrag Datenbank|Datenbank hinzufügen öffnen Sie den Dialog aus Bild 2. Hier wählen Sie die soeben angelegte Datei aus und klicken nach dem Betätigen von Verbindung testen auf die Schaltlfäche OK.

Hinzufügen der Datenbank zum SQLiteStudio

Bild 2: Hinzufügen der Datenbank zum SQLiteStudio

Danach finden Sie im Hauptfenster von SQLiteStudio bereits die Datenbank mit der ersten Tabelle im Datenbank-Explorer vor (siehe Bild 3). Allerdings verfügt das Feld id noch nicht über eine Primärschlüssel, aber das können wir ja gleich nachholen – indem wir die neue Tabelle verändern.

Die neue Tabelle im SQLiteStudio

Bild 3: Die neue Tabelle im SQLiteStudio

Tabelle mit Primärschlüsselfeld erstellen

Im nächsten Beispiel wollen wir eine Tabelle erstellen und das ID-Feld direkt als Primärschlüsselfeld kennzeichnen. Dazu fügen wir der CREATE TABLE-Methode gleich das Schlüsselwort PRIMARY KEY für das Feld ID hinzu. Dazu nutzen wir prinzipiell die gleiche Methode wie für das vorherige Beispiel:

private void btnTabelleMitPKAnlegen_Click(object sender, RoutedEventArgs e) {
     string databaseFile = AppDomain.CurrentDomain.BaseDirectory + txtDatenbankname.Text;
     string connectionString = "Data Source=" + databaseFile + ";Version=3;";
     MessageBox.Show(connectionString);
     SQLiteConnection connection = new SQLiteConnection(connectionString);
     connection.Open();
     string sql = "CREATE TABLE BeispieltabelleMitPK (id INT PRIMARY KEY, Beispielstring VARCHAR(255))";
     SQLiteCommand command = new SQLiteCommand(sql, connection);
     command = new SQLiteCommand(sql, connection);
     command.ExecuteNonQuery();
     connection.Close();
}

Auch das liefert das gewünschte Ergebnis, wie ein Blick in SQLiteStudio beweist (siehe Bild 4).

 

Schreibe einen Kommentar