QSqlQuery innerhalb eines Objektes

Alles rund um die Programmierung mit Qt
Antworten
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

QSqlQuery innerhalb eines Objektes

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Überprüfst du eigentlich auch, ob die Datenbank geöffnet wurde. In deinem 1. Codebeispiel machst du es ja nicht.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Du uebergibst deinem QSqlQuery ja auch keine Datenbakverbindung, obwohl das so in der Hilfe steht. Wieso sollte es also funktionieren? :D

Goos
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Braucht er auch nicht, da dann die Default-Datenbank verwendet wird.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Vielleicht hat er aber nen Namen verwendet und es klappt dann nicht mit qt_sql_default_connection.

Goos
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

Beitrag 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
thereapman
Beiträge: 36
Registriert: 6. Juni 2007 15:39

Ähnliches Problem

Beitrag 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.
Antworten