Hallo,
Hat hier jemand einen Link zu einem Beispiel wo eine Klasse von QSql oder QSqlQuery abgeleitet wird?
Oder kann man von den genannten Sql Klassen keine eigenen Klassen ableiten?
Grüße
Thore
Eigene Klasse von QtSql und QSqlQuery erzeugen
Bitte anders rum: Sag uns was dich drück und nicht die Lösung, dann können wir eine Lösung suchen.
Prinzipiell: Ableiten geht in C++ immer gleich. Nur macht es nicht in allen Situationen SInn und kann auch bös nach hinten losgehen. Speziell wenn kein virtueller Destruktor vorhanden ist, kann man sich böse Probleme einfangen.
Von QSqlConnetion oder QSqlQuery ableiten haben schon mehrere hier versucht - das macht nur Probleme, da die ganzen Funktionen in Qt auf den QtSql-Klassen aufbauen. Die einen geben ein QSqlQuery zurück, andere eine QSqlConnection. Du müsstest dann immer hin und hercasten, dann geht es gar nimmer.
QSqlQuery/Connection sind einfach nicht auf Polymorphie ausgelegt.
Deshalb: sag uns was du erreichen willst, dann findet sich eine Lösung.
Prinzipiell: Ableiten geht in C++ immer gleich. Nur macht es nicht in allen Situationen SInn und kann auch bös nach hinten losgehen. Speziell wenn kein virtueller Destruktor vorhanden ist, kann man sich böse Probleme einfangen.
Von QSqlConnetion oder QSqlQuery ableiten haben schon mehrere hier versucht - das macht nur Probleme, da die ganzen Funktionen in Qt auf den QtSql-Klassen aufbauen. Die einen geben ein QSqlQuery zurück, andere eine QSqlConnection. Du müsstest dann immer hin und hercasten, dann geht es gar nimmer.
QSqlQuery/Connection sind einfach nicht auf Polymorphie ausgelegt.
Deshalb: sag uns was du erreichen willst, dann findet sich eine Lösung.
Vielleicht hast du Recht franzf.
Ich brauche eigentlich zwei Klassen, eine die das Öffnen, Verbinden und Schließen der Datenbank erledigt und dann eine von der ich wiederum eine ganze Reihe von Objekten in meinem Programm ableite die die eigentlichen Zugriffe innerhalb der Tabellen der Datenbank erledigt um z.B. Listviews mit Datensätzen zu füllen oder geänderte Sätze zurückschreibt.
Bei der ersten Klasse dachte ich daran sie von QsqlDatabase abzuleiten und bei den zweiten eben an QsqlQuery aber das scheint schwierig zu sein.
Vielleicht ist es aber auch besser einfach von QObject und zusätzlich auch von entweder QsqlDatabase oder von QsqlQuery abzueiten.
Auf jeden Fall danke für die Antwort.
Grüße
Thore
Ich brauche eigentlich zwei Klassen, eine die das Öffnen, Verbinden und Schließen der Datenbank erledigt und dann eine von der ich wiederum eine ganze Reihe von Objekten in meinem Programm ableite die die eigentlichen Zugriffe innerhalb der Tabellen der Datenbank erledigt um z.B. Listviews mit Datensätzen zu füllen oder geänderte Sätze zurückschreibt.
Bei der ersten Klasse dachte ich daran sie von QsqlDatabase abzuleiten und bei den zweiten eben an QsqlQuery aber das scheint schwierig zu sein.
Vielleicht ist es aber auch besser einfach von QObject und zusätzlich auch von entweder QsqlDatabase oder von QsqlQuery abzueiten.
Auf jeden Fall danke für die Antwort.
Grüße
Thore
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Da QsqlDatabase statische ist und alle möglichen Zugriffsfunktionen hat ist es unnötig. Einfach eine Funktion die die DB öffnet und an den anderen Stellen per QSqlDatabase::database() drauf zugreifen.
Und ein QSqlQuery ist auch wirklich nur ein Query. Ich würde einen Wrapper drum rum bauen aber nicht von QSqlQuery ableiten - was soll es bringen?
Und ein QSqlQuery ist auch wirklich nur ein Query. Ich würde einen Wrapper drum rum bauen aber nicht von QSqlQuery ableiten - was soll es bringen?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
@Thore
generell zum Design und Vererbung:
"verwende Polymorphy nur um wiederverwendet zu werden, nicht um selbst wiederzuverwenden"
oder so ähnlich
Steht in vielen Designbuechern so ...
Im Klartext sollt das fuer Dich heissen:
Vererbung nur, wenn Du jemals Deine Abgeleitete Klasse als Basisklasse irgendwo verkaufen musst. Also die irgendwo als Zeiger auf die Basisklasse untergeschoben werden muss.
Bei Schnittstellen ist das per definition gegeben.
In Frameworks sind meist gewisse Klassen genau dafuer vorgesehen, d.h. das Framework bietet dir ne Basis Impl an, und eigenes Verhalten implementierst indem die Basis ueberschreibst und den anderen Klassen die unterschiebst.
Wenn du nu wissen willst, ob Du QsqlDatabase oder QsqlQuery überschreiben solltest, musst Du Dich einfach nur fragen:
Wuerdest Du deine Ableitungen irgendwem als QsqlDatabase / QsqlQuery verkaufen muessen, damit es funktioniert.
Wenn ja -> Polymorphy (Ableitung) ok,
Wenn nein, simple code wiederverwendung auf deiner Seite -> Aggregation !!!
Hoffe das hilft ...
Ciao ....
generell zum Design und Vererbung:
"verwende Polymorphy nur um wiederverwendet zu werden, nicht um selbst wiederzuverwenden"
oder so ähnlich
Im Klartext sollt das fuer Dich heissen:
Vererbung nur, wenn Du jemals Deine Abgeleitete Klasse als Basisklasse irgendwo verkaufen musst. Also die irgendwo als Zeiger auf die Basisklasse untergeschoben werden muss.
Bei Schnittstellen ist das per definition gegeben.
In Frameworks sind meist gewisse Klassen genau dafuer vorgesehen, d.h. das Framework bietet dir ne Basis Impl an, und eigenes Verhalten implementierst indem die Basis ueberschreibst und den anderen Klassen die unterschiebst.
Wenn du nu wissen willst, ob Du QsqlDatabase oder QsqlQuery überschreiben solltest, musst Du Dich einfach nur fragen:
Wuerdest Du deine Ableitungen irgendwem als QsqlDatabase / QsqlQuery verkaufen muessen, damit es funktioniert.
Wenn ja -> Polymorphy (Ableitung) ok,
Wenn nein, simple code wiederverwendung auf deiner Seite -> Aggregation !!!
Hoffe das hilft ...
Ciao ....
Danke für die Antworten.
Ich bin mir nicht ganz sicher was mit verkaufen gemeint ist, deshalb möchte ich mal etwas genauer erklären was ich eigentlich mache will.
Ich portiere momentan eine Zustellungssoftware die auf Handheld Scannern unter Linux läuft.
Die wurde in Qt 3 erstellt und soll nun nach Qt 4.7 portiert werden und dann unter WindowsMobile laufen.
In der alten Software wurde für jede Tabelle der Datenbank eine extra Klasse angelegt mit einem Struct das der Tabelle entspricht.
Das funktioniert sehr gut, ich finde es aber nicht sehr elegant. Außerdem müßte man für einen neuen Kunden wieder lauter neue Objekte analog seiner Tabellen definieren.
Ich möchte das ganze etwas universeller aufziehen und eine Klasse schreiben die an die Datenbank andockt und sich dort die Informationen für die Tabellenklasse holt und dann für jede Tabelle ein Objekt erzeugt in der ich dann mit den Werten der Tabelle hantieren kann.
Mit QSqlDatabase::tables bekomme ich alle Tabellen der Datenbank angezeigt aber im Moment sehe ich noch nicht wie ich mir jetzt für jede Tabelle die Feldnamen und Feldinformationen geben lassen kann.
Grüße
Thore
Ich bin mir nicht ganz sicher was mit verkaufen gemeint ist, deshalb möchte ich mal etwas genauer erklären was ich eigentlich mache will.
Ich portiere momentan eine Zustellungssoftware die auf Handheld Scannern unter Linux läuft.
Die wurde in Qt 3 erstellt und soll nun nach Qt 4.7 portiert werden und dann unter WindowsMobile laufen.
In der alten Software wurde für jede Tabelle der Datenbank eine extra Klasse angelegt mit einem Struct das der Tabelle entspricht.
Das funktioniert sehr gut, ich finde es aber nicht sehr elegant. Außerdem müßte man für einen neuen Kunden wieder lauter neue Objekte analog seiner Tabellen definieren.
Ich möchte das ganze etwas universeller aufziehen und eine Klasse schreiben die an die Datenbank andockt und sich dort die Informationen für die Tabellenklasse holt und dann für jede Tabelle ein Objekt erzeugt in der ich dann mit den Werten der Tabelle hantieren kann.
Mit QSqlDatabase::tables bekomme ich alle Tabellen der Datenbank angezeigt aber im Moment sehe ich noch nicht wie ich mir jetzt für jede Tabelle die Feldnamen und Feldinformationen geben lassen kann.
Grüße
Thore
"Abfragen" im Sinne von SQL und deren Schnittstelle muessen nicht Unbedingt alle mit "Select" anfangen.
Um an die Struktur einer Tabelle ranzukommen, implementieren die DB Hersteller unterschiedliche statements bzw schnittstellen. Also das ist nicht in SQL spezifiziert / vorgeschrieben, ob und wie du an tabellenstrukturen kommst.
Also bei jeder unnerschiedlichen DB (Oracle, Mysql, sqlite ... ) kann / wird das anders sein.
Aber bei mysql:
http://dev.mysql.com/doc/refman/5.0/en/describe.html
ist es als Abfrage (QSqlQuery) realisiert, und du bekommst die struktur der Tabelle als Ergebniss ... aka recordset (QSqlResult) zurueck ...
Ciao ...
Um an die Struktur einer Tabelle ranzukommen, implementieren die DB Hersteller unterschiedliche statements bzw schnittstellen. Also das ist nicht in SQL spezifiziert / vorgeschrieben, ob und wie du an tabellenstrukturen kommst.
Also bei jeder unnerschiedlichen DB (Oracle, Mysql, sqlite ... ) kann / wird das anders sein.
Aber bei mysql:
http://dev.mysql.com/doc/refman/5.0/en/describe.html
ist es als Abfrage (QSqlQuery) realisiert, und du bekommst die struktur der Tabelle als Ergebniss ... aka recordset (QSqlResult) zurueck ...
Ciao ...
-
Troll.Soft
- Beiträge: 190
- Registriert: 18. Juni 2008 09:52
- Wohnort: Hamburg