SQLite - C/C++ für Anfänger

Hallo da draußen, angehende Programmierer! Heute machen wir uns auf eine aufregende Reise in die Welt von SQLite mit C/C++. Mach dir keine Sorgen, wenn du noch nie eine Zeile Code geschrieben hast - wir beginnen bei den ganz Basics und arbeiten uns hoch. Am Ende dieses Tutorials wirst du erstaunt sein, was du alles erreichen kannst!

SQLite - C/C++

Was ist SQLite?

Bevor wir in den Code eintauchen, lassen wir uns erstmal anschauen, was SQLite ist. Stell dir vor, du hast ein digitales Notizbuch, in dem du alle Arten von Informationen organisiert speichern kannst. Das ist im Wesentlichen, was SQLite ist - eine leichtgewichtige, dateibasierte Datenbank, die keinen separaten Serverprozess erfordert. Es ist so, als hättest du eine mini-Datenbank direkt in deiner Tasche!

C/C++ Interface APIs

Um mit SQLite in C/C++ zu interagieren, müssen wir etwas namens APIs (Application Programming Interfaces) verwenden. Stell dir diese als spezielle Werkzeuge vor, die es unserem C/C++-Programm ermöglichen, mit SQLite zu kommunizieren. Hier sind die Haupt-APIs, die wir verwenden werden:

API-Funktion Beschreibung
sqlite3_open() Öffnet eine Verbindung zu einer SQLite-Datenbank
sqlite3_exec() Führt SQL-Anweisungen aus
sqlite3_close() Schließt die Datenbankverbindung
sqlite3_errmsg() Gibt Fehlermeldungen zurück

Mach dir keine Sorgen, wenn diese jetzt einschüchternd erscheinen. Wir werden jede einzelne mit vielen Beispielen erkunden!

Verbindung zur Datenbank herstellen

Lassen wir uns mit der Verbindung zu einer Datenbank beginnen. Das ist wie das Öffnen unseres digitalen Notizbuchs, um anzufangen zu schreiben.

#include <stdio.h>
#include <sqlite3.h>

int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "Kann Datenbank nicht öffnen: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "Datenbank erfolgreich geöffnet\n");
}

sqlite3_close(db);
return 0;
}

Lassen wir das auseinanderbrechen:

  1. Wir includen die notwendigen Header: stdio.h für Ein- und Ausgabe und sqlite3.h für SQLite-Funktionen.
  2. In main() deklarieren wir einen Zeiger auf sqlite3, der unsere Datenbankverbindung darstellt.
  3. Wir verwenden sqlite3_open(), um eine Datenbank namens "test.db" zu öffnen (oder zu erstellen).
  4. Wir überprüfen, ob die Verbindung erfolgreich war. Wenn nicht, geben wir eine Fehlermeldung aus.
  5. Schließlich schließen wir die Datenbankverbindung mit sqlite3_close().

Eine Tabelle erstellen

Jetzt, wo unser Notizbuch geöffnet ist, erstellen wir eine Seite, um einige Informationen zu speichern. In Datenbankterminologie nennen wir das eine Tabelle.

int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;

rc = sqlite3_open("test.db", &db);

if (rc) {
fprintf(stderr, "Kann Datenbank nicht öffnen: %s\n", sqlite3_errmsg(db));
return(0);
}

char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY     NOT NULL,"
"NAME           TEXT    NOT NULL,"
"AGE            INT     NOT NULL,"
"GRADE          CHAR(1) );";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL-Fehler: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Tabelle erfolgreich erstellt\n");
}

sqlite3_close(db);
return 0;
}

In diesem Beispiel:

  1. Wir öffnen die Datenbank wie zuvor.
  2. Wir definieren eine SQL-Anweisung, um eine Tabelle namens STUDENTS mit den Spalten ID, NAME, AGE und GRADE zu erstellen.
  3. Wir verwenden sqlite3_exec() zur Ausführung dieser SQL-Anweisung.
  4. Wir überprüfen, ob die Ausführung erfolgreich war und geben eine entsprechende Nachricht aus.

Einfügen von Daten (INSERT-Befehl)

Großartig! Wir haben unsere Tabelle. Jetzt fügen wir einige Daten hinzu.

char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";

rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL-Fehler: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Datensätze erfolgreich eingefügt\n");
}

Hier fügen wir zwei Datensätze in unsere STUDENTS-Tabelle ein. Die SQL-Anweisung verwendet die INSERT INTO-Syntax, um neue Zeilen hinzuzufügen.

Abfrageoperation (SELECT-Befehl)

Jetzt holen wir die Daten ab, die wir soeben eingefügt haben. Hier zeigt sich die wahre Magie der Datenbanken!

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}

// In main()
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL-Fehler: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation erfolgreich abgeschlossen\n");
}

Dieses Beispiel führt eine callback-Funktion ein. Wenn wir Daten abfragen, ruft SQLite diese Funktion für jede Zeile im Ergebnis auf. Es ist, als hättest du einen Assistenten, der jeden Eintrag in deinem Notizbuch vorliest!

Aktualisierungsoperation (UPDATE-Befehl)

Was ist, wenn wir einen Fehler gemacht haben und einige Daten ändern müssen? Dann kommt das UPDATE zum Einsatz.

char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL-Fehler: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Datensätze erfolgreich aktualisiert\n");
}

Diese SQL-Anweisung ändert Bobs Note in A. Gute Arbeit, Bob!

Löschoperation (DELETE-Befehl)

Manchmal müssen wir Daten entfernen. Lassen wir uns ansehen, wie man einen Datensatz löscht.

char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);

if (rc != SQLITE_OK) {
fprintf(stderr, "SQL-Fehler: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Datensatz erfolgreich gelöscht\n");
}

Dies löscht Bobs Eintrag aus unserer Tabelle. Schade, Bob!

Und das war's! Wir haben die Basics des Umgangs mit SQLite in C/C++ abgedeckt. Denke daran, dass Programmieren wie das Lernen einer neuen Sprache ist - es erfordert Übung. Lass dich nicht entmutigen, wenn Dinge nicht sofort klar werden. Halte experimentierfreudig, und bald wirst du wie ein Profi Datenbankanwendungen schreiben können!

Credits: Image by storyset