Programmieren von SQLite in C Tutorial Two

Dieses Tutorial ist das zweite einer Reihe zur Programmierung von SQLite in C.

SQLite speichert eine Auflistung von Tabellen in einer einzelnen Dateidatenbank, die normalerweise mit .db endet. Jede Tabelle ist wie eine Kalkulationstabelle, sie besteht aus mehreren Spalten und jede Zeile enthält Werte.

Wenn dies hilft, stellen Sie sich jede Zeile als Struktur vor, wobei die Spalten in der Tabelle den Feldern in der Struktur entsprechen.

Eine Tabelle kann so viele Zeilen enthalten, wie auf eine Festplatte passen. Es gibt eine Obergrenze, aber die 18.446.744.073.709.551.616, um genau zu sein.

Eine Tabelle kann bis zu 2.000 Spalten enthalten. Wenn Sie die Quelle neu kompilieren, können Sie eine maximale Anzahl von 32.767 Spalten festlegen.

Die SQLite-API

Um SQLite zu verwenden, müssen wir die API aufrufen. Eine Einführung in diese API finden Sie auf der offiziellen Webseite "Introduction to SQLite C / C ++ Interface". Es ist eine Sammlung von Funktionen und einfach zu bedienen.

Zunächst benötigen wir ein Handle für die Datenbank. Dies ist vom Typ sqlite3 und wird durch einen Aufruf von sqlite3_open (Dateiname, ** ppDB) zurückgegeben. Danach führen wir die SQL aus.

Lassen Sie uns zunächst einen kleinen Exkurs machen und mit SQLiteSpy eine verwendbare Datenbank und einige Tabellen erstellen. (Links dazu und zum SQLite-Datenbankbrowser finden Sie im vorherigen Tutorial.).

Veranstaltungen und Veranstaltungsorte

Die Datenbank about.DB enthält drei Tabellen zum Verwalten von Ereignissen an mehreren Orten. Diese Veranstaltungen werden Partys, Discos und Konzerte sein und an fünf Orten stattfinden (Alpha, Beta, Charlie, Delta und Echo). Wenn Sie so etwas modellieren, ist es oft hilfreich, mit einer Kalkulationstabelle zu beginnen. Der Einfachheit halber speichere ich nur ein Datum und keine Uhrzeit.

Die Tabelle enthält drei Spalten: Datum, Ort, Ereignistyp und ungefähr zehn Ereignisse wie dieses. Termine vom 21. bis 30. Juni 2013.

Jetzt hat SQLite keinen expliziten Datumstyp, daher ist es einfacher und schneller, ihn als Int zu speichern, und Excel verwendet Datumsangaben (Tage seit dem 1. Januar 1900) mit Int-Werten von 41446 bis 41455. Wenn Sie die Datumsangaben in eine Tabelle einfügen Formatieren Sie dann die Datumsspalte als Zahl mit 0 Dezimalstellen. Sie sieht ungefähr so ​​aus:

Jetzt könnten wir diese Daten in einer Tabelle speichern und für ein so einfaches Beispiel wäre es wahrscheinlich akzeptabel. Eine gute Datenbankdesignpraxis erfordert jedoch eine gewisse Normalisierung.

Eindeutige Datenelemente wie der Typ des Veranstaltungsorts sollten in einer eigenen Tabelle enthalten sein, und die Ereignistypen (Party usw.) sollten ebenfalls in einer Tabelle enthalten sein. Da wir an mehreren Veranstaltungsorten mehrere Veranstaltungstypen haben können (eine Beziehung von vielen zu vielen), benötigen wir einen dritten Tisch, um diese abzuhalten.

Die drei Tabellen sind:

  • Veranstaltungsorte - hält alle fünf Veranstaltungsorte
  • Ereignistypen - Enthält alle drei Ereignistypen
  • Ereignisse - Enthält das Datum plus die Veranstaltungsort-ID plus die Ereignistyp-ID. Ich habe auch ein Beschreibungsfeld für dieses Event hinzugefügt, zB "Jim's Birthday".

Die ersten beiden Tabellen enthalten die Datentypen, sodass Veranstaltungsorte Namen haben, die als Alpha-Zeichen ausgegeben werden. Ich habe auch eine Integer-ID hinzugefügt und einen Index dafür erstellt. Bei der geringen Anzahl von Veranstaltungsorten (5) und Veranstaltungstypen (3) kann auf einen Index verzichtet werden, bei größeren Tabellen wird dies jedoch sehr langsam. Fügen Sie für jede Spalte, in der wahrscheinlich gesucht wird, einen Index hinzu, vorzugsweise eine Ganzzahl

Die SQL, um dies zu erstellen, ist:

Der Index in der Ereignistabelle enthält Datum, ID-Ereignis, Ereignistyp und Veranstaltungsort. Das heißt, wir können die Ereignistabelle nach "allen Ereignissen an einem Datum", "allen Ereignissen an einem Veranstaltungsort", "allen Parteien" usw. und Kombinationen von solchen wie "allen Parteien an einem Veranstaltungsort" usw. abfragen.

Nach dem Ausführen der SQL-Abfragen zum Erstellen von Tabellen werden die drei Tabellen erstellt. Hinweis: Ich habe die gesamte SQL-Datei in die Textdatei create.sql eingefügt und sie enthält Daten zum Auffüllen einiger der drei Tabellen.

Wenn Sie setzen; Am Ende der Zeilen, wie ich es in create.sql getan habe, können Sie dann alle Befehle auf einmal stapeln und ausführen. Ohne das ; du musst jeden für sich laufen lassen. Klicken Sie in SQLiteSpy einfach auf F9, um alles auszuführen.

Ich habe auch sql eingefügt, um alle drei Tabellen mit / *… * / in mehrzeiligen Kommentaren abzulegen. Wählen Sie einfach die drei Zeilen aus und drücken Sie Strg + F9, um den ausgewählten Text auszuführen.

Diese Befehle fügen die fünf Veranstaltungsorte ein:

Wieder habe ich auskommentierten Text in leere Tabellen eingefügt löschen von Linien. Es gibt kein Rückgängigmachen, seien Sie also vorsichtig mit diesen!

Erstaunlicherweise ist bei allen geladenen Daten (zugegebenermaßen nicht viel) die gesamte Datenbankdatei auf der Festplatte nur 7 KB groß.

Ereignisdaten

Anstatt ein Bündel von zehn Einfügeanweisungen zu erstellen, habe ich Excel zum Erstellen einer CSV-Datei für die Ereignisdaten verwendet und dann das SQLite3-Befehlszeilendienstprogramm (das mit SQLite geliefert wird) und die folgenden Befehle zum Importieren verwendet.

Hinweis: Jede Zeile mit einem Punkt (.) Ist ein Befehl. Verwenden Sie .help, um alle Befehle anzuzeigen. Um SQL auszuführen, geben Sie es einfach ohne Punktpräfix ein.

Sie müssen doppelte schwarze Schrägstriche \\ im Importpfad für jeden Ordner verwenden. Führen Sie die letzte Zeile erst aus, nachdem der Import erfolgreich war. Wenn SQLite3 ausgeführt wird, ist das Standardtrennzeichen a:, daher muss es vor dem Import in ein Komma geändert werden.

Zurück zum Code

Jetzt haben wir eine vollständig gefüllte Datenbank. Schreiben wir den C-Code, um diese SQL-Abfrage auszuführen, die eine Liste der Parteien mit Beschreibung, Daten und Veranstaltungsorten zurückgibt.

  • Neu bei SQL? Lesen Sie, was SQL ist?

Dies führt einen Join unter Verwendung der Spalte idvenue zwischen der Events- und der Venue-Tabelle durch, sodass der Name des Venues und nicht der int idvenue-Wert ermittelt werden.

SQLite C API-Funktionen

Es gibt viele Funktionen, aber wir brauchen nur eine Handvoll. Die Reihenfolge der Bearbeitung ist:

  1. Öffnen Sie die Datenbank mit sqlite3_open (), und beenden Sie sie, falls beim Öffnen ein Fehler auftritt.
  2. Bereiten Sie die SQL mit sqlite3_prepare () vor
  3. Schleife mit slqite3_step (), bis keine Datensätze mehr vorhanden sind
  4. (In der Schleife) Verarbeiten Sie jede Spalte mit sqlite3_column ...
  5. Rufe schließlich sqlite3_close (db) auf

Nach dem Aufrufen von sqlite3_prepare gibt es einen optionalen Schritt, in dem alle übergebenen Parameter gebunden werden. Dieser Schritt wird jedoch für ein zukünftiges Lernprogramm gespeichert.

In dem unten aufgeführten Programm lautet der Pseudocode für die Hauptschritte also:

Die SQL gibt drei Werte zurück. Wenn also sqlite3.step () == SQLITE_ROW ist, werden die Werte aus den entsprechenden Spaltentypen kopiert. Ich habe Int und Text verwendet. Ich zeige das Datum als Zahl an, kann es aber jederzeit in ein Datum umwandeln.

Auflistung des Beispielcodes