![]() |
Delphi-Version: 10.2 Tokyo
TFDMemTable ohne DataSource als Datenspeicher verwenden
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:
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.
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; 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 |
AW: TFDMemTable ohne DataSource als Datenspeicher verwenden
Zitat:
Mal so aus Interesse: Bei welchem Befehl (Codezeile) kommt denn dieser Fehler? übersehn :oops: Windows, oder was Anderes? Im Windows könnte man ersatzweise eventuell noch das alte TClientDataSet probieren. Und wenn garnichts geht, dann in eine LocalDB/MemDB (sqlite oder sonstwas). |
AW: TFDMemTable ohne DataSource als Datenspeicher verwenden
Zitat:
Das ist schon merkwürdig, da
Delphi-Quellcode:
ein Property ist und der Aufruf lediglich den
Active
Delphi-Quellcode:
überprüft und überhaupt keine wirkliche Funktionalität beinhaltet. Demzufolge ist die Zeile auch vollkommen überflüssig, da der Rückgabewert von
State
Delphi-Quellcode:
gar nicht verwendet wird, wobei dieser wegen des vorigen
Active
Delphi-Quellcode:
sowieso immer
MTable.Close
Delphi-Quellcode:
liefern wird.
False
Laut deiner Beschreibung würde ich den Fehler eher in der Zeile
Delphi-Quellcode:
vermuten, nämlich dann wenn gar keine Daten im Stream vorhanden sind. Vielleicht solltest du das überprüfen bevor du das in
MTable.LoadFromStream(LStream, sfJSON); //Daten in die TFDMemTable
Delphi-Quellcode:
einliest.
MTable
|
AW: TFDMemTable ohne DataSource als Datenspeicher verwenden
Was macht eigentlich MTable.Open, wenn keine Daten und Felder vorhanden sind?
Die Daten werden ja erst nachher geladen. Manchmal ist der Fehler auch in der Zeile drüber (Debugger verrutscht), aber an effektivem Code ist davor auch nur das
Delphi-Quellcode:
, welches ebenfalls keinen Fehler liefern sollte.
if Methode = 'QUERY'
PS: Logic wird auch nie freigegeben. Außerdem wird es immer erstellt, auch wenn es fast nie genutzt wird. Tipp:
Delphi-Quellcode:
Gibt MyStreamToString wirklich einen WideString zurück?
Logic := nil;
try ... Logic := TLogic.Create; ... finally Logic.Free; end; UnicodeString bzw. String (seit Delphi2009 ein Alias für UnicodeString) würde wohl auch passen. |
AW: TFDMemTable ohne DataSource als Datenspeicher verwenden
Hallo Zusammen,
vielen Dank für Eure Anregungen. Ich habe daraufhin den Code etwas geändert und so scheint es jetzt zu funktionieren:
Delphi-Quellcode:
Darüber hinaus habe ich Logic auch freigegeben :oops:
else if Methode = 'QUERY' then begin
//MTable.Active; MTable.FieldDefs.Clear; MTable.Fields.clear; LStream:=LService.Get_LifeMData(Maschinen_ID, RefreshData) as TMemoryStream; LStream.Position:=0; //MTable.Open; MTable.LoadFromStream(LStream, sfJSON); end Zitat:
Es scheint so, dass ich die TFDMemTable besser nicht anfasse, bevor die Daten reingeladen werden... Vielen Dank Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz