Hallo Zusammen,
sorry für den unglückliche Titel.
Ich habe einen DataSnap Server. Mittels FireDac wird ein DataSet als TFDJSONDataSets
bereitgestellt. Ein Mobile RESTClient ruft das DataSet ab und befüllt damit eine TFDMemTable.
Das funktioniert einwandfrei und sehr stabil.
Die Kommunikation läuft über HTTP Port 8080. Ich versuche den Server zu erweitern so dass ich die gleiche
DataSets konsumieren kann diesmal über
TCP/
IP Port 211. Soweit ich es richtig verstanden habe, kann ein
TFDJSONDataSets nur über TDSRestConnection transportiert werden und nicht über eine TSQLConnection.
Deshalb versuche ich gerade TFDJSONDataSets umzuwandeln in ein TJSONObject um es über TSQLConnection
zu transportieren. Ein reines TJSONObject hätte auch den Vorteil dass ich es als Log in Klartext zwischenspeichern könnte!
Der Client bekommt beim abrufen eine Fehlermeldung:
Im Projekt ist eine
Exception der Klasse TDBXError mit der Meldung '
Exception: '{' found:
',' at Position: 23
{"result":[{"rows":[0]},{"data":[12,#192*Connection]}]' aufgetreten.
So gehe ich vor:
Delphi-Quellcode:
//Der Server exportier die Query als TFDJSONDataSets
function TdmDALZMI.GetBau(BauNr:integer): TFDJSONDataSets;
begin
qrGetBau.Active := False;
qrGetBau.Params[0].Value := BauNr;
Result := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(Result, qrGetBau);
end;
//Der Server gibt die gleiche Query als TJSONObject aus.
function TdmDALZMI.GetBauJSON(BauNr:integer): TJSONObject;
var
LDataSets: TFDJSONDataSets;
begin
LDataSets := GetBau(BauNr);
try
Result := TJSONObject.Create;
TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result); <<<<<<<<<< Ist das hier richtig?
finally
LDataSets.Free;
end;
end;
//Der Client ruft das DataSet als TJSONObject ab und wandelt es in ein TFDJSONDataSets um
procedure TdmZMI.GetBauJSON(BauNr:integer);
var
LDataSetList: TFDJSONDataSets;
LJSONObject: TJSONObject;
LZMIClient: TdmServerMethodsZMIClient;
begin
LZMIClient := TdmServerMethodsZMIClient.Create(CMClientModule.CMCSQLConnection.DBXConnection);
try
LJSONObject := LZMIClient.ZMI_GetBauJSON(BauNr); <<<<<<<<<< Fehlermeldung an dieser Stelle
TFDJSONInterceptor.JSONObjectToDataSets(LJSONObject,LDataSetList);
finally
LZMIClient.Free;
end;
UpdateMemTable(mtBau, LDataSetList);
mtBau.Open;
end;
//Der Client befüllt aus dem TFDJSONDataSets eine TFDMemTable
procedure TdmZMI.UpdateMemTable(
const aMemTable:TFDMemTable;
const ADataSetList: TFDJSONDataSets);
begin
aMemTable.Active := False;
Assert(TFDJSONDataSetsReader.GetListCount(ADataSetList) = 1);
aMemTable.AppendData(TFDJSONDataSetsReader.GetListValue
(ADataSetList, 0));
end;
Hat jemand eine Idee wo denn das Problem sein könnte oder gibt es eine einfachere Art eine
FireDac
Query als TJSONObject an den Client über
TCP(nicht HTTP) zu übertragen und dort
auf einfache weise ebenfalls mit FireDac zu konsumieren?
Herzlichen Dank für die Hilfe.
Gruß Kostas