Ich hatte gerade ein Gespräch mit dem Chef.
Wir stellten fest dass es ungünstig ist immer von verschiedenen Quellen abzufragen. Deshalb wird auf dem Server auch eine lokale Datenbank (sqlite) zur Anwendung kommen in der sämtliche Daten der verschiedenen Anlagen eingetragen werden.
Der Kern-Anwendung sollte es völlig egal sein, wo die Daten genau herkommen. Die muss nur wissen, wie sie an die Daten kommt. Das erledigt man über die Definition von Repositories. Das jeweilige Repository weiß, wie man an die Daten kommt und die Anwendung fragt einfach das Repository. Schon wird es (aus Sicht der Anwendung) egal, wo die Daten liegen und wie die konkrete Abfrage zu bewerkstelligen ist.
Delphi-Quellcode:
// Generisches Repository
type
IRepository<T,TID> = interface
function Find( AID : TID ) : T;
function FindAll : TList<T>;
end;
IPersonRepository = interface( IRepository<TPerson,integer> )
function FindByName( const AName : string ) : TList<TPerson>;
end;
Eine Konzentration von Daten in einer Datenbank, nur aufgrund von Befindlichkeiten des Programmierers, ist mE völlig unsinnig und kann uU mehr Probleme schaffen.
Zum Übertragen verwende ich die INDY_10 Komponente TIdTCPServer und TIdTCPClient.
Also stellt sich für mich jetzt die Frage was nehmen für "RecordOderSonstwas" (bzw. warum die Daten nicht einfach im Statement lassen und direkt übertragen) und in welcher Form übertragen?
Wie ich einen Record mit dem TCPServer übertrage hab ich schon herausgefunden:
Delphi-Quellcode:
procedure TFrmStart.TCP_SERVERExecute(AContext: TIdContext);
var Buf : TidBytes;
begin
Buf := RawToBytes(einRecord, Sizeof(einRecord));
AContext.Connection.IOHandler.Write(Buf);
end;
Solange du in dem Record keine
string
Typen verwendest wird das auch so funktionieren - sonst aber nicht.
Bei einem String befindet sich im Record lediglich eine Referenz auf den String und nicht der String selber.
Such mal nach Serialisierung (z.B. nach JSON oder
XML) und übergib das an den Client. Der kann sich daraus dann wieder eine Instanz/Record zusammenbauen.