Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

SQL Query in Thread wie Datenrückgabe realisieren

  Alt 11. Okt 2016, 13:34
Datenbank: MySQL • Version: 5.7.11 • Zugriff über: UniDac
Moin,
ich denke das Thema ist schon immer wieder mal behandelt worden nur irgendwie nicht so wie ich es gerade brauche.
Es geht darum, dass ich im Moment versuche sämtliche Query's in einem Thread auszulagern, da mir die Programmoberfläche zu oft kurze Zeit einfriert. Abgesehen davon dachte ich mir, dass es ggf. nicht die schlechteste Wahl ist, die eigentlichen Daten irgendwo zwischen zu speichern und nicht unmittelbar an die Oberfläche zu hängen, so dass ich eventuell, sollte sich die Oberfläche mal ändern, ich nicht an bestimmte Komponenten gebunden bin.

Jetzt stellt sich aber die Frage wie gebe ich die Daten aus dem separaten Thread zurück an den Main Thread.
Ich beschreibe mal grob was ich gerade gemacht habe:

Komponenten die benutzt werden:

Unidac
DxGrid


1. Separaten Thread angelegt.
Dem Thread übergebe ich im Create als Parameter den SQL Query welcher ausgeführt werden soll.
Des weiteren werden hier alle benötigten Komponenten erstellt: UniConnection, UniProvider, UniQuery.

2. Im Execute des Threads wird das Uniquery mit Execute gestartet, welches dann mit den Daten die zurück kommen gefüllt wird, sofern der SQL Query erfolgreich ausgeführt werden konnte.

Tja und nun gehts los, wie übergebe ich die Daten jetzt an ein Dataset im Main Thread?

Genau hier hakt es, da ich ja nicht direkt auf Komponenten im Main Thread zugreifen darf (max. über Syncronize oder Messages), sollte ich jetzt z.B. eine Liste oder Collection erstellen, welche die Daten aufnimmt und diese dann an den Main Thread übergeben oder welche Möglichkeiten habe ich?

Die Idee war eigentlich folgende mit z.B. der TCollection.
Wenn diese die Felddefinitionen der Tabelle(Feldname, Type, Größe) sowie die Daten darin enthält, könnte ich z.B. diese Daten direkt in der Collection verwalten (Daten löschen, anlegen usw. und damit dann ein z.B. ein TSimleDataset füllen und an ein DBGid oder CXGrid übergeben) danach wird halt ein SQL Query an den SQL Server gesendet mit dem was gerade passiert ist (löschen, anlegen update usw.)

Macht man das so, oder gibt es da bessere oder schnellere Lösungen, wie macht Ihr das?
  Mit Zitat antworten Zitat