Einzelnen Beitrag anzeigen

Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.063 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 10:40
Datenbank: Firebird • Version: 2.5 • Zugriff über: DataSnap
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

Geändert von Kostas (25. Mär 2015 um 11:37 Uhr)
  Mit Zitat antworten Zitat