Hallo Zusammen,
ich habe ein Problem, dass ich nicht gelöst bekomme, daher wende ich mich an Euch:
Ich habe eine Client-Server App. Der Client fragt beim Server Daten an, dieser holt die Daten aus der Datenbank und gibt diese als TMemoryStream an den Client.
Der Client speichert diese Daten in einer TFDMemTable, an der ein DataSource angebunden ist, an welchem dann AusgabeObjekt hängen.
Das klappt auch wunderbar, bis es mal einen Fehler gibt und die Daten nicht rüberkommen. Das kommt nur selten vor und dann bekomme ich eine Fehlermeldung, dass keine Daten im JSON-Format vorliegen. Wenn ich die Daten dann manuell neu anfrage, kommen sie zwar an, aber dann spielt die TFDMemTable nicht mehr mit...
Delphi-Quellcode:
function TDB_Unit.Get_MLifeData(Maschinen_ID, BPanel:
string; RefreshData: boolean = false): TStream;
var LClient: TxDataClient;
LService: IMyReportsService;
LSTream: TMemoryStream;
MTable: TFDMemTable;
Logic: TLogic;
StreamString: WideString;
Methode:
string;
begin
Methode := Read_Einstellungswert('
LifeMonitor_Methode');
MTable := TFDMemTable(FindComponent('
MTable_MStatus_' + BPanel));
MTable.Close;
LClient := TXDataClient.Create;
LStream := TMemorySTream.Create;
Logic := TLogic.Create;
Try
LClient.Uri:= xData_Connect.URL;
LService:= LClient.Service<IMyReportsService>;
if Methode = '
JSON'
then begin //von hier bis
LStream:=LService.Get_LifeMDataAPI(Maschinen_ID, RefreshData)
as TMemoryStream;
LStream.Position:=0;
StreamString := Logic.MyStreamToString(LStream);
Logic.Read_JSON_LM(StreamString, MTable);
end // hier ist unwichtig, weil das nur zwei verschiedene Methoden sind, mit dem Server zu sprechen
else if Methode = '
QUERY'
then begin
MTable.Active;
//Hier tritt der Fehler auf
MTable.FieldDefs.Clear;
MTable.Fields.clear;
LStream:=LService.Get_LifeMData(Maschinen_ID, RefreshData)
as TMemoryStream;
//Anfrage an den Server
LStream.Position:=0;
MTable.Open;
MTable.LoadFromStream(LStream, sfJSON);
//Daten in die TFDMemTable
end
else begin
ShowMessage('
Methode unbekannt');
end;
Finally
LClient.Free;
LStream.Free;
end;
end;
Ich bekommen eine Fehlermeldung: Öffnen der Datenmenge nicht möglich. Ein DataTable- oder DataView-Objekt muss angegeben werden. Hinweis: Verwenden Sie für TFDMemTable zum Öffnen der Datenmenge CreateDataSet oder CloneCursor.
Aber da ich die Daten manuell in die TFDMemTable spiele, benötige ich kein DataSet.
Derzeit sieht die Lösung so aus, dass ich die App neu starte. Dann läuft wieder alles wie gewünscht. Aber das ist ja kein Zustand.
Kann mir jemand helfen, wie ich den Fehler abfangen und beheben kann?
Vielen Dank
Patrick