Datenbanken

Qt unterstützt verschiedene Datenbanktreiber:

Qt-Treiber Datenbank
QDB2 IBM DB2
QIBASE Borland InterBase
QMYSQL MySQL
QOCI Oracle
QODBC Open Database Connectivity (ODBC)
QPSQL PostgreSQL
QSQLITE2 SQLite Version 2
QSQLITE SQLite Version 3
QTDS Sybase

SQL-Queries ausführen

Um Queries auf eine Datenbank auszuführen, muss ein QSqlQuery-Objekt für die jeweilige Datenbank erstellt werden. Wird dem Konstruktor von QSqlQuery kein QSqlDatabase-Objekt als Parameter übergeben, wird die Standard-Datenbank der Anwendung verwendet. Der Methode exec() kann dann der Query-String (im Syntax des jeweiligen Treibers) übergeben werden. War der Query erfolgreich wird true zurückgegeben, ansonsten false. FIXME std-db setzen

QString queryString( "CREATE TABLE users (id INTEGER PRIMARY KEY, firstName TEXT, lastName TEXT, email TEXT)" );
QSqlQuery query;
bool ret = query.exec( queryString );

Ergebnisse von SELECT-Abfragen

Für das Speichern von SELECT eignet sich ein QHash mit den Spaltennamen als Schlüssel. Dabei muss das QSqlQuery-Objekt, das den Query ausgeführt hat die Methode next() aufrufen, um den ersten Datensatz zur Verfügung zu stellen. next() gibt so lange true zurück, wie Datensätze vorhanden sind. Für eine einzelne Ergebniszeile (z.B. Abfrage auf den Primary Key) sieht der Code folgendermaßen aus:

QHash<QString, QVariant> properties;
query.next();
QSqlRecord record = query.record();
for( int i = 0; i < record.count(); i++ )
  properties[record.fieldName( i )] = record.value( i );
// Verwendung des Hashs

Für mehrere wird natürlich eine Schleife verwendet:

QHash<QString, QVariant> properties;
while( query.next() )
{
  QSqlRecord record = query.record();
  for( int i = 0; i < record.count(); i++ )
    properties[record.fieldName( i )] = record.value( i );
  // Verwendung des Hashs
  properties.clear();
}

Dabei können die Ergebnisse auch in einer Liste gespeichert werden:

QList<QHash<QString, QVariant> > results;
QHash<QString, QVariant> properties;
while( query.next() )
{
  QSqlRecord record = query.record();
  for( int i = 0; i < record.count(); i++ )
    properties[record.fieldName( i )] = record.value( i );
  results.push_back( properties );
  properties.clear();
}
// Verwendung der Ergebnisse