PostgreSQL und MySQL mit der DSLib


Einfache Datenbankabfragen managen


Von Thorsten Geppert am 18.02.2010, geändert 22.07.2015.

Voraussetzungen für dieses kurze Tutorial sind, dass die DSLib mit PostgreSQL bzw. MySQL sowie wxWidgets und die notwendigen Bibliotheken installiert sind.

Aller Anfang ist einfach.

Basis für den Datenbankzugriff ist eine PostgreSQL-Datenbank mit der Tabelle "users" mit der folgenden Struktur:

CREATE TABLE users (
    id SERIAL,
   username VARCHAR(32),
   password VARCHAR(32),
   age INTEGER,
   PRIMARY KEY (id)
);

Wir erstellen eine Datei namens DSPostgreSQLTest.cpp (zu MySQL später mehr). Darin inkludieren wir

#include <wx/wx.h>
#include <DSPostgreSQLDatabase.h>
#include <DSPostgreSQLQuery.h>

using namespace DynSoft;

und schreiben danach die Main-Funktion

int main(int argc, char **argv) {
    return 0;
}

Folgender Code kommt direkt in die Main-Funktion vor dem "return 0". Als erstes benötigen wir ein Datenbankobjekt

DSPostgreSQLDatabase db;

Das "db"-Objekt benötigt Verbindungsdaten

db.SetHostname(_N("hostname of your database server"));
db.SetDatabase(_N("database name"));
db.SetUsername(_N("username"));
db.SetPassword(_N("password"));
db.SetPort(_N("5432"));

Danach kann bereits die Verbindung aufgebaut werden

if(!db.Connect()) {
    DS_PL(_("Could not connect to database."));
    return 1;
}

Wenn die Verbindung funktioniert hat, ist es möglich, mit dem DSPostgreSQLQuery-Objekt Abfragen zu erstellen. Erstellen wir als erstes dieses Objekt

DSPostgreSQLQuery query(&db);

und führen dann eine statische Insert-Abfrage aus

if(query.Query(_N(
    "INSERT INTO users ("
    "    username, "
    "    password, "
    "    age"
    ") VALUES ("
    "    'thorsten', "
    "    MD5('test'), "
    "    30"
    ")"
), false)) { // False because we don't want to get results
    DS_PL(_("Directly insert successful."));
} else {
    DS_PL(_("Directly insert not successful."));
}

Diese Methode ist schnell, aber wenig flexibel. Deshalb gibt es die Möglichkeit, Werte zu binden. Damit sieht beispielsweise eine Update-Abfrage so aus

query.Prepare(_N(
    "UPDATE users SET "
    "    password = MD5(:password:), "
    "    age = :age: "
    "WHERE "
    "    username = :username:"
));
query.Bind(_N("username"), _N("thorsten"));
query.Bind(_N("password"), _N("test"));
query.Bind(_N("age"), 42);
if(query.Exec(false)) {
    DS_PL(_N("Prepared update successfull"));
} else {
    DS_PL(_N("Prepared update not successfull"));
}

Fehlt zu guter Letzt noch das Auslesen der Daten

query.Query(_N("SELECT * FROM users"));
while(query.NextRecord()) {
    DS_PL(_N("==========================="));
    DS_PL(_N("Username: ") + query.GetField(_N("username")).ToString());
    DS_PL(_N("Password: ") + query.GetField(_N("password")).ToString());
    DS_PL(_N("Age: ") + query.GetField(_N("age")).ToString());
    DS_PL(_N("==========================="));
}
query.FreeResult(); // Don't forget this!

Zum Schluß ist es noch notwendig, die Verbindung zur Datenbank zu trennen

db.Disconnect();

Kompiliert wird der Code folgendermaßen

g++ PostgreSQLTest.cpp -o PostgreSQLTest -lds `wx-config --libs --cppflags`

Es kann natürlich sein, dass noch bestimmte Parameter zum Kompilieren übergeben werden müssen (Header-Pfade, Bibliotheks-Pfade, Linker-Direktiven).

Für MySQL genügt es, alle DSPostgreSQL-Strings durch DSMySQL zu ersetzen sowie die Konnektierungsdaten anzupassen und die folgende Struktur zu nutzen

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(32),
   password VARCHAR(32),
   age INT
);

Das war es schon. Ähnlich funktioniert die Verwaltung von SQLite.

Dowload

PostgreSQL-Beispiel (cpp-Datei)
MySQL-Beispiel (cpp-Datei)

[zurück]