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.
PostgreSQL-Beispiel (cpp-Datei)
MySQL-Beispiel (cpp-Datei)