Datenbankverbindung

Verschiedenes zu Qt
Antworten
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

Datenbankverbindung

Beitrag von schoettner »

Hallo,

ich habe eine Frage bezüglich Datenbankverbindungen mit QSqlDatabase.
Ich bin mir noch nicht sicher, wie ich diese Verbindung organisiere. Folgedes habe ich mir überlegt.

1. Im Mainwindow dieses Object als public hinterlegen und immer mit MainWindow.db.open() öffnen und Querys ausführen. Da ich aber auch modeless Dialogs verwenden möchte, kann ich das Mainwindow ja nicht als Parent übergeben und so die QSqlDatabase nicht zur Verfügung stellen.
2. An jeden SqlDialog die nötigen Parameter übergeben und jedes mal eine neue QSqlDatabase erstellen. Also für jede Dialogklasse eine private QSqlDatabase anlegen.
3. Eine Klasse erstellen, welche die notwendigen Parameter übergeben bekommt und für die nötigen Statements Memberfunctions hat (also SELECT, UPDATE, usw.)

Ist eine dieser Lösungen sinnvoll oder ist eine ganz andere Idee besser?

Vielen Dank
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Datenbankverbindung

Beitrag von Christian81 »

QSqlDataBase ist darauf ausgelegt, jedes mal per QSqlDatabase::database() die DB-Connection zu öffnen dort wo man sie braucht. Siehe Doku: http://qt-project.org/doc/qt-4.8/qsqlda ... ml#details
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

Re: Datenbankverbindung

Beitrag von schoettner »

aber wie greif ich dann von modeless dialog auf die QSqlDatabase von dem Mainwindow zu? Die beiden haben ja keine Verbindung miteinander
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Datenbankverbindung

Beitrag von franzf »

Lies doch bitte die Doku und versuch sie zu verstehen. QSqlDatabase speichert für dich die Verbindungen. Wenn du nur eine hast verwende den default-name (also bei addDatabase() und database() keinen connectionName angeben), ansonsten kannst du über den connectionName auch mehrere Datenbankverbindungen halten.
Da QSqlDatabase::database() statisch ist, brauchst du kein Objekt, um die Verbindung(en) zu bekommen.
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

Re: Datenbankverbindung

Beitrag von schoettner »

Ok so ganz klar komm ich damit noch nicht ganz. Das mit dem static versteh ich ja aber wie der Zugriff darauf passieren soll nicht. Ich brauch doch zumindest eine Adresse oder so um das Objekt irgendwie zu finden, oder? Könnt ihr mir vielleicht ein kleines Codebeispiel geben?
Etwas wie

Code: Alles auswählen

//im Konstruktor vom Mainwindow:
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("Vanya");
    db.setUserName(user);
    db.setPassword(pwd);

//irgendwo in einem beliebigen Dialog
QSqlDatabase::database();
QSqlQuery query("SELECT * FROM staff);
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Datenbankverbindung

Beitrag von Christian81 »

Solange Du nur die Default-Connection benutzt musst Du dem QSqlQuery keine DB-Verbindung übergeben. Siehe auch hier: http://qt-project.org/doc/qt-4.8/sql-connecting.html
Und wenn Du die DB-Verbindung wirklich übergeben musst dann gibts dafür auch einen ctor von QSqlQuery der Dir das ermöglicht: http://qt-project.org/doc/qt-4.8/qsqlqu ... SqlQuery-3
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

SOLVED Datenbankverbindung

Beitrag von schoettner »

Gelesen, versanden, angewand, geteset,funktioniert!

Vielen Dank für die Hilfe und die Geduld
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

Re: Datenbankverbindung

Beitrag von schoettner »

Hallo,

und schon wieder habe ich ein Problem...
Ich habe einen Updatedialog geschrieben in dem ich Datensätze ändere.
Leider funktioniert dieser Dialog nicht immer. Ich habe ein SQL Script, mit dem ich die Datenbank nach Änderungen wiederherstelle.
Die Datensätze die mit dem Script erstellt wurden lassen sich einwandfrei bearbeiten.
Wenn ich nun über den Insertdialog einen Datensatz oder direkt per SQL Statement im Server erzeuge lässt er sich im Updatedialog nicht ändern.
Ich bin aber als root angemeldet und per SQL Statement im Server funktioniert das Update.
Bei einem anderen Dialog der ebenfals etwas an diesem DS ändert funktioniert aber...
Bei einem Mitentwickler funktioniert genau der Code einwandfrei.
Als RDBMS wird MySQL verwendet.

Kenn jemand das Phänomen?
schoettner
Beiträge: 15
Registriert: 13. August 2012 17:12

Re: Datenbankverbindung

Beitrag von schoettner »

Gerade funktioniert es urplötzlich.
Ist das ein Bug?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Datenbankverbindung

Beitrag von franzf »

Wenn das ein von diesem Thread unabhängiges Problem ist, mach bitte einen neuen Thread auf.
Brauchen tun wir auch Code, denn ohne dem wird es schwer eine Lösung zu finden.
Zusätzlich bitte Infos zur Umgebung (Betriebssystem, Qt-Version, usw.)
Antworten