Seite 1 von 1

QSqlQuery innerhalb eines Objektes

Verfasst: 8. Dezember 2006 16:42
von marco
Hallo!

Ich bin neu hier und habe vorher mit C unter Linux und Delphi unter Windows programmiert. Heute habe ich endlich mal angefangen mich mit Qt zu beschäftigen und arbeite an einem kleinen Beispielprojekt.

Zu meinem Problem. Folgender Code funktioniert

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("/home/marco/Downloads/fida/fida.sqb");
db.open();

QSqlQuery query;
query.exec("SELECT firmenname FROM kontakte WHERE plz=12345");
Jetzt hab ich versucht das ganze in einer Klasse zu kapseln:

Code: Alles auswählen

class Contacts : public QObject
{
  Q_OBJECT
public:
  Contacts(QString db_name);
  QString FieldByName(QString FieldName);
  int GetIndex();
  int GetNumRows();
public slots:
  void SetQuery(QString Query);
  void First();
  void Previous();
  void Next();
  void Last();
signals:
  void QueryChanged(int num_rows);
  void IndexMoved(int index);
private:
  QString db_name;
  QSqlDatabase db;
  QSqlQuery query;
  QSqlRecord record;
};
In der entscheidenen Methode SetQuery

Code: Alles auswählen

query.exec(Query);
record = query.record();
emit QueryChanged(query.size());
bekomme ich bei der Ausführung meines kompillierten Programms jedoch die Fehlermeldung "QSqlQuery::exec: database not open", obwohl im Konstruktor db.open() korrekt ausgeführt wird.
Warum klappt query.exec() in meinem Object Contacts nicht?

vielen dank schonmal!

gruß, marco

Verfasst: 8. Dezember 2006 17:38
von upsala
Überprüfst du eigentlich auch, ob die Datenbank geöffnet wurde. In deinem 1. Codebeispiel machst du es ja nicht.

Verfasst: 8. Dezember 2006 17:46
von Goos
Du uebergibst deinem QSqlQuery ja auch keine Datenbakverbindung, obwohl das so in der Hilfe steht. Wieso sollte es also funktionieren? :D

Goos

Verfasst: 8. Dezember 2006 17:47
von upsala
Braucht er auch nicht, da dann die Default-Datenbank verwendet wird.

Verfasst: 8. Dezember 2006 17:59
von Goos
Vielleicht hat er aber nen Namen verwendet und es klappt dann nicht mit qt_sql_default_connection.

Goos

Verfasst: 8. Dezember 2006 18:34
von marco
> Überprüfst du eigentlich auch, ob die Datenbank geöffnet wurde. In deinem 1. Codebeispiel machst du es ja nicht.

ja, und zwar so

Code: Alles auswählen

if (!db.open()) qDebug() << "DB open error";
ich habs jetzt aber die lösung: ich muss beim aufruf des konstruktors die datenbank angeben, es klappt also nicht wie im ersten beispiel, in dem ich den code in keiner klasse gekapselt hatte:

Code: Alles auswählen

query = QSqlQuery(db);
danke & gruß, marco

Ähnliches Problem

Verfasst: 13. Juni 2007 15:53
von thereapman
Hi!

Ich hatte grad ein ähnliches Problem.
Allerdings hatte meine Kapselklasse noch ne Funktion "Connect()" und da hat er auch immer mit Database not open abgebrochen, obwohl ich den Tipp von hier befolgt hatte.

Mein Fehler war:
Im Konstruktor wurde zwar query = QSqlQuery(db) ausgeführt aber Fehler immernoch da.

Lösung: Bevor ein QSqlQuery erzeugt wird muss die übergebene Verbinung bereits offen seien. Ein nachträgliches öffnen der DB scheint QSqlQuery zu ignorieren.

Das jetz nur mal so am Rande falls noch jemand so ein Problem hat und die Datenbank erst später öffnet.