[gelöst] QMYSQL und cmake

Alles rund um die Programmierung mit Qt
d4eRc
Beiträge: 13
Registriert: 6. August 2010 16:54

Beitrag von d4eRc »

Mir ist jetzt doch noch etwas aufgefallen:

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db = QSqlDatabase::addDatabase("QMYSQL", "mysql-connection"); 
Soweit ich dir folgen kann, sind nach diesem Aufruf in "db" beide Verbindungen vorhanden - aber warum überschreibt das zweite addDatabase nicht einfach das bereits vorhandene "db", sondern "kombiniert" das bereits vorhandene db mit dem "neuen" db? (könnte sein dass das wieder mit Standard-C++-Kenntnissen zu tun hat, aber ich bin nicht absolut fit :) )

Oh, dazu passt auch das danach:

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::database("mysql-connection"); 
Hier wird wieder die statische "database()"-Funktion verwendet, aber woher bekommt diese Funktion die schon vorhandenen Informationen? Ich dachte, dass eine statische Funktion keine Kenntnis über andere Objekte hat und demnach nur etwas aus ihren Parametern "basteln" kann. Ist das wieder eine C++-Eigenheit, dass die database()-Funktion irgendwie in "db" die aktuell ausgewählte Datenbank "umschalten" kann - doch wie hat sie auf unsere vorher aufgebaute "db" Zugriff?
Zuletzt geändert von d4eRc am 9. August 2010 00:16, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

d4eRc hat geschrieben:Wenn ich das jetzt richtig verstanden habe, soll ich für jedes neue Objekt meine QSqlDatabase mit database() "klonen" und den verschiedenen Klassen übergeben
Du verwendest am besten keine Kopien, halt dich an QSqlDatabase::database(). Den Qt-Klassen übergibst du die Kopie.
Denn ich denk mir dass die einzelnen QSqlDatabase-Objekt meiner Unterfenster jeweis ihr eigenes open() brauchen und demnach jedes eine einzelne Verbindung aufbaut, oder reicht das einmal in der Klasse im Konstruktor und übernehmen die Objekte die database() zurückgibt den geöffneten Status des "Mutterobjekts"?
Nein, denn der Status der Connection liegt im "QSqlDatabasePrivate"-Pointer, den alle Kopien besitzen, und die auf das selbe "Original" zeigen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

d4eRc hat geschrieben:Mir ist jetzt doch noch etwas aufgefallen:

Code: Alles auswählen

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db = QSqlDatabase::addDatabase("QMYSQL", "mysql-connection"); 
Soweit ich dir folgen kann, sind nach diesem Aufruf in "db" beide Verbindungen vorhanden - aber warum überschreibt das zweite addDatabase nicht einfach das bereits vorhandene "db", sondern "kombiniert" das bereits vorhandene db mit dem "neuen" db? (könnte sein dass das wieder mit Standard-C++-Kenntnissen zu tun hat, aber ich bin nicht absolut fit :) )
Es wird nix kombiniert. Es existiert wahrscheinlich ein statisches Objekt in QSqlDatabase (oder einer der vielen Hilfsstrukturen), welches die Verbindungen speichert, hächstwahrscheinlich ist es eines QMap<QString, QSqlDatabase> - kann aber alles mögliche sein, da müsste man nachschauen. Ein "addDatabase" legt eine neue Instanz von QSqlDatabase an und packt mit passendem connectionName als Key das Objekt in die QMap. db selber ist ein einzelnes Objekt mit genau einem einzigen Status (db-Treiber, open, ...).
Wenn ich in der zweiten Zeile was andere zuweis dann enthält das db-Objekt halt einen anderen Inhalt.
d4eRc
Beiträge: 13
Registriert: 6. August 2010 16:54

Beitrag von d4eRc »

Okay! Das heißt, dass man davon ausgehen kann, dass im Hintergrund irgendwo eine Liste von gespeicherten Verbindungen und Zuweisungen auf einzelne QSqlDatabases vorhanden ist und die statischen Aufrufe von database() etc. trotz ihrer "statik" auf diese Liste zugreifen können und das entsprechende QSqlDatabase-Objekt zurückgeben können.

Deshalb kann man auch

Code: Alles auswählen

QSqlDatabase::removeDatabase("sales");
(aus der Doku) machen, denn obwohl der statischen remove-Funktion kein Objekt übergeben wird, muss sie irgendwie Zugriff auf die DB-Liste haben. Ich denke ich hab jetzt alles im Grunde verstanden. Ebendiese Tatsache, dass eine statische Funktion, die eigentlich keine Referenz zu einem Objekt von mir bekommt, trotzdem etwas in diesem "unsichtbaren" QSqlDatabasePrivate (oder so ähnlich) verändern kann, hat mich verwirrt.

Ich denke wir sind hier jetzt schon zu weit drin, eigentlich spielt das ja keine Rolle wie das in QT intern gelöst wird, hauptsache wir können es entsprechend verwenden.
Antworten