Netzwerkzugriff auf eine SQL Datenbank

Alles rund um die Programmierung mit Qt
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Netzwerkzugriff auf eine SQL Datenbank

Beitrag von Viper2000 »

Hallo liebes Qt-Forum,

kurze Vorsellung meinerseits, da ich das erste mal hier poste:

Bin 26 Jahre alt und komme aus Rheinland-Pfalz, genauer gesagt aus Koblenz. Interessiere mich neben der Programmierung von PCs, Mikrocontroller, Embedded Systemen auch für Sport(Fußball, Rad, Beachvolleyball...). Motorradfahren ist auch eins der Hobbys :)
Habe Programmiertechnisch Erfahrungen mit C++, C# und Java.

Aber nun zu meinem eigentlichen Anliegen:

Auf einem Ubuntu Rechner im Netzwerk läuft eine mySQL Datenbank mit QtSQL davor. auf einem anderen Rechner(ebenfalls Ubuntu) läuft eine GuI in der verschiedenste Daten aus der Datenbank angezeigt werden sollen. Des Weiteren soll es möglich sein in der GuI etwas in die Datenbank zu schreiben.

Nun habe ich mich etwas in das Modul QtNetwork eingearbeitet. Verbindung zwischen den Rechnern ist auch kein Problem. (QTcpServer, QTcpSocket)...

Meine eigentliche Frage ist aber wie man am besten vorgeht um solche Daten über das Netzwerk zu übertragen. Also in welche Datenstruktur man die Anfragen an die Datenbank am besten verpackt bzw. wie man die Daten am besten zur GuI zurückschickt.

Hat auf diesem Gebiet jemand schon erfahrung gesammelt?

Viele Grüße :D
Ich bin nicht die Signatur, ich putz hier nur :-)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Egal welche Datenbank du verwendest, sind die Netzwerkschnittstellen von Qt nicht notwendig. Dies wird alles über die Datenbank-Treiber selbst erledigt. Also einfach beim Verbindungsaufbau anderen Host angeben und fertig.
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Beitrag von Viper2000 »

Naja, so einfach wirds nicht gehen, die Datenbank kann ich nicht direkt ansprechen. Sie wird von jemand anderem entwickelt der eine Schnittstelle davor setzt,. Das heißt er bietet mir Methoden an wie z.B. "getTransponderID", Diese Methoden stoßen dann die Datenbankabfrage an und liefern die Daten zurück.

Von diesen Zugriffs Methoden wird es auf dem dem Server etliche geben da die DB recht umfangreich ist.

Ich entwickele bei dem Projekt nur die Netzwerkkomponente. Das heißt, dass die GuI irgendwelche Anfragen an mein Netzwerkmodul stellt und ich diese über TCP an den Datenbankserver weiterleiten, und anschließend die Daten in irgendeiner Form zurücktransportieren muss.
Ich bin nicht die Signatur, ich putz hier nur :-)
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Uff, ein wenig umständlich :-)

Deine Gegenstelle auf dem Server ist auch mit Qt entwickelt?
In diesem Fall könntet ihr QVariants (kann ja auch Listen enthalten) in Strings umwandeln und auf der anderen Seite den String wieder in ein QVariant.

Alternativ solltet ihr euch vielleicht eine kleine XML-Struktur überlegen.

Ciao,
Sephral
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Beitrag von Viper2000 »

Ja die Gegenstelle ist, bzw wird ebenfalls mit Qt entwickelt...

Wenn ich mir nun eine XML Struktur überlege welche alle Tabellen der DB enthält dann muss ich ja bei jedem Transport, auch wenn es nur die Abfrage einer 8bit char Nummer aus der DB ist, die komplette struktur übertragen.

Hach irgendwie ist das alles nicht so einfach
Ich bin nicht die Signatur, ich putz hier nur :-)
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Viper2000 hat geschrieben:Ja die Gegenstelle ist, bzw wird ebenfalls mit Qt entwickelt...

Wenn ich mir nun eine XML Struktur überlege welche alle Tabellen der DB enthält dann muss ich ja bei jedem Transport, auch wenn es nur die Abfrage einer 8bit char Nummer aus der DB ist, die komplette struktur übertragen.

Hach irgendwie ist das alles nicht so einfach
Neeee, doch nicht so :-)
Überlege Dir ein XML-Schema mit dem du eine Abfrage definieren kannst und eine Schema für Antworten auf Deine Abfragen. Die ganze Datenbank zu übertragen macht wenig Sinn :lol:

Ich bin zwar ne absolute XML-Niete aber ich dachte an sowas...

Frage:

Code: Alles auswählen

<xml>
  <Request>
    <ID>1</ID>
    <Command>getTransponderID</Command>
    <Suchkriterien>...</Suchkriterien>
  </Request>
</xml>
Antwort:

Code: Alles auswählen

<xml>
  <Response>
    <ID>1</ID>
    <Result>12345</Result>
  </Response>
</xml>
Sowas in der Richtung :-)


Ciao,
Sephral
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Beitrag von Viper2000 »

Das mit der XML Struktur ist eine gute Sache! So werden wir es wohl machen!
Wie würdet ihr denn die XML Struktur im Speicher halten und per TCP Verbindung verschicken?

Hatte zuerst im Kopf für jede Abfrage eine XML zu erstellen und diese dann übers Netzwerk zu schicken!

Gibt es noch elegantere Lösungen als mit ner Datei?

Gruß
Ich bin nicht die Signatur, ich putz hier nur :-)
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hi!

Entweder alles im Programm generieren (ist ja vermutlich nicht so viel) oder eine Art Vorlage (ählich einem PHP-HTML-Template) aus einer Datei (ressource!) laden und dann Platzhalter in der Vorlage mit QString::replace(..) ersetzen.


Ciao,
Sephral
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Beitrag von Viper2000 »

Kann man nicht die XML Klassen die Qt anbietet für dieses Vorhaben nutzen?
Ich bin nicht die Signatur, ich putz hier nur :-)
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Klar kannst du das, würde ich mir wegen der Performance bei den einfachen Anfragen aber sparen. Später, wenn du ne komplizierte und grosse Antwort bekommst, da würd's sich eher lohnen.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Uff, ein wenig umständlich Smile
Naja, ab und an doch wohl eher Standard :-)
3 Schichten modell und so :-)

- Datenbank(Backend, relativ dumm)
- Bussines Schicht(Middleware), macht die ganze Verwaltung, kennt die Logik, als zentraler oder dezentraler dienst
- Clients (Frontend, meist recht dumm)

Bei groesseren Projekten hat man das recht oft.

Fuer den austausch der daten von Client zur Middleware gibts 1000 Anstaetze. Auch paar mehr oder weniger generische.

Microsoft bietet da z.b. Ihr DCOM an ...
BS unabhaengiger gibts dafuer Corba z.b.

Ob du so nen schwergewicht brauchst, und das ganze noch so generisch mit nem request broker, weiss ich natuerlich ned ....

Einfachere dinge tun es auch ...

Meist werden in so systemen dinge eingesetzt, die auf RPC beruhen, wo man also funktional die daten zwischen den prozessen austauschen kann.
Beschrieben werden die funktionen und daten dann per IDL
Das ist alles eigentlich ganz gut spezifiziert, und man braucht das Rad ned noch mal neu erfinden ....

Ob XML ne gute alternative ist .... keine Ahnung, kommt auch auf die datenmengen und die erforderliche performance an ...

Gibt auch loesungen, wo HTML verwendet wird :-) also nen apache mit entsprechenden modulen (oder Tomcat) ... der die daten gleich einigermassen anschaulich generiert ...
und nen frontend, was HTTP anfragen generiert und die responses auswertet, parst, cacht (sonst koennt man ja gleich mit browser arbeiten) und total anders anzeigt ...

Ciao ....
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Motorradfahren ist auch eins der Hobbys
Endlich... :) Hab meine kleine gestern leider geschrottet und muss mich deswegen wieder mit Compilern usw. beschäftigen...

Code: Alles auswählen

<xml>
  <Request>
    <ID>1</ID>
    <Command>getTransponderID</Command>
    <Suchkriterien>...</Suchkriterien>
  </Request>
</xml>
kommt mir doch bekannt vor..
Meist werden in so systemen dinge eingesetzt, die auf RPC beruhen
Ja genau.. das wars doch.. http://de.wikipedia.org/wiki/XML-RPC#Be ... ne_Anfrage
Das ist alles eigentlich ganz gut spezifiziert, und man braucht das Rad ned noch mal neu erfinden ....
Genau! z.B. gSoap http://www.cs.fsu.edu/~engelen/soap.html
Zwar nicht direkt Qt, aber funktioniert. Ob http://qutexr.sourceforge.net/ auch mit Qt4.3 läuft weiss ich nicht, aber selbst stricken würde ich dies (wie schon RHBaum meinte) auf keinen Fall...
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Wenn die Gegenstelle auch mit Qt entwickelt wird, dann kann man auch die Serialisierung von Qt-Objekten mittels QDataStream benutzen....
Viper2000
Beiträge: 48
Registriert: 7. Mai 2008 16:36

Beitrag von Viper2000 »

Ja die Gegenstelle wird auch mit Qt Entwickelt.
Wie kann ich denn so ein Vorhaben für nen QDataStream serialisieren? Müsste man dann irgendwie den << und >> Operator überladen !?
Ich bin nicht die Signatur, ich putz hier nur :-)
Antworten