Seite 1 von 1

QSqlQuery liefert keine Ergebnisse

Verfasst: 16. April 2009 19:02
von Halcom
Hallo,

ich nutze zur Zeit Vista, VS2008 und Qt 4.5.

Ich habe eine SQLite Datenbank und öffne diese im Ctor einer Klasse die mir die Datenbankzugriffe kapseln soll. Das scheint auch erfolreich zu funktionieren und als Anzahl der Tabellen bekomme ich 69, wie gewünscht heraus.

Nur leider funktioniert meine Abfrage nicht. Hier erst mal ein wenig Code.

Code: Alles auswählen


EveDatabase::EveDatabase()
: mDatabase()
{
  mDatabase = QSqlDatabase::addDatabase("QSQLITE");

  mDatabase.setDatabaseName("D:/Development/Projekte/EVEAssistant/Database/eve.db");
  mDatabase.setHostName("D:/Development/Projekte/EVEAssistant/Database/eve.db");
  mDatabase.setPort(-1);

  if( !mDatabase.isOpen() )
  {
    bool isOpen = mDatabase.open("","");
    if( !isOpen )
    {
      QSqlError theError  = mDatabase.lastError();
      QString   errorText = theError.text();
      QMessageBox::critical(NULL, QObject::tr("Critical"), QObject::tr("Could not connect to database. Error: %1").arg(errorText));
    }
    // debug only
    // QStringList tables = mDatabase.tables();
    // const int tableCount = tables.count(); // is 69
  }
}

EveDatabase::~EveDatabase()
{
  mDatabase.close();
}

int EveDatabase::typeID( const QString & iName )
{
  //const QString sql = QString("SELECT typeID FROM invTypes WHERE typeName LIKE '%1'").arg(iName);
  const QString sql = QString("SELECT * FROM invTypes"); // debug only
  QSqlQuery query = mDatabase.exec(sql);

  QSqlQuery query(mDatabase);
  
  const bool isSucceded = query.exec(sql);
  if( isSucceded )
  {
    const int rowsAffected = query.numRowsAffected(); // 0
    while( query.next() )
    {
      return query.value(0).toInt();
    }
    
    // hier solltest ich nicht landen
    const QString executedQuery = query.executedQuery(); // "SELECT * FROM invTypes"
    const QString lastError = query.lastError().text(); // ""
    return -1;
    
  }
  else
  {
    // abfrage fehlgeschlagen
    const QString executedQuery = query.executedQuery(); // "SELECT * FROM invTypes"
    const QString lastError = query.lastError().text(); // ""
    return -1;
  }
}
Die Abfrage in der Methode typeID sollte mir mindestens 1 Ergebniss liefern. Tut sie leider nicht.
Ich habe die Abfrage zur Kontrolle einmal in mein Mozilla SQLite Browser eingegeben und das richtige Ergebniss erhalten.
Es gibt auch keinen Fehlercode/text zurück. Offensichtlich ist Qt der Meinung das alles funktioniert hätte.
Zur Kontrolle wollte ich dann einfach mal ganz simpel den kompletten Table haben. Auch da wird mir kein Ergebniss geliefert.
Ich habe auch schon diverse ander sachen wie bindvalue usw. probiert. Haben natürlich nicht geholfen. ( sonst würde man das auch nicht lesen :) )

Ich habe gerade getestet die Abfrage direkt im Ctor zu machen. Auch das klappt nicht.

Nun bin ich ehrlich gesagt ein wenig ratlos. Hat irgendjemand ähnliche Probleme gehabt, oder sieht etwas was ich falsch gemacht habe.

Viel Dank schon mal.

Verfasst: 16. April 2009 19:09
von Christian81

Verfasst: 16. April 2009 19:27
von Halcom
Mmh welchen Teil der Doku meinst du?
Ich habe die schon mehrfach gelesen. Ich liebe den Assistant :) Was überlese ich?

Das exec(QString) einen wert zurückliefert der bei mir true ist? Und trotzdem ist numRowsAffected() == 0.

Das der String in der Korrekten SQL Syntax sein muss? Mein SQLite Browser hat keine Probleme mit der Syntax.

Das die Query auf einer ungültigen Position steht am Anfang? Ist mir erst mal egal da er eh nix findet :) numRowsAffected() == 0.

Habe ich noch etwas übersehen?

Werde das oben mal kurz edititeren damit es deutlicher wird.

Verfasst: 16. April 2009 19:34
von upsala
Ich habs nur kurz überflogen, aber numRowsAffected ergibt bei SELECT keine sinnvollen Werte.

Verfasst: 16. April 2009 19:38
von Halcom
Ich danke dir.

Es war der Teil mit der korrekten Syntax. Asche auf mein Haupt. Ist aber auch eine Böse Falle.

Am Ende des SQL Statements muss ein ; stehen. Das macht der Browser wohl automatisch falls es nicht das ist. Ich kannte mich bis gestern auch noch nicht soweit mit SQLite aus.

Schade nur das Qt dann sagt das die Abfrage erfolgreich war.

Problem gelöst.

Verfasst: 16. April 2009 19:39
von Christian81
Shit - habe ich doch glatt das next() übersehen :oops:
Was liefert die Funktion zurück? Wirklich -1 oder doch 0?

Verfasst: 16. April 2009 19:41
von Halcom
Sie lieferte -1. Ich habe das Oben doch geändert. DAs next gab es voher nicht.

Problem war /ist nur das Qt trotz falscher Syntax ein true bei exec liefert.

Nun funktioniert auch der Teil:

Code: Alles auswählen

const QString sql = QString("SELECT typeID FROM invTypes WHERE typeName LIKE '%1'").arg(iName);
nachdem ich ein ; angefügt habe.

Verfasst: 16. April 2009 19:46
von Christian81
Die Syntax ist nicht falsch - es steht nirgends dass exec nur abgeschlossene Queries ausführt...