AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Dataset austausch über JSON
Thema durchsuchen
Ansicht
Themen-Optionen

Dataset austausch über JSON

Ein Thema von fisipjm · begonnen am 18. Okt 2021 · letzter Beitrag vom 19. Okt 2021
Antwort Antwort
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#1

Dataset austausch über JSON

  Alt 18. Okt 2021, 13:19
Datenbank: MSSQL/Memtable • Version: xyz • Zugriff über: Firedac
Hi,

Ich habe das, hoffe ich mal, folgende verständnissproblem:

Eine Query (Ableitung von Dataset) hat die Funktion SaveAsStream mit Formatübergabe (in meinem Fall sfJSON).
Eine FDMemtable (Ableitung von Dataset) hat die Funktion LoadFromStream mit Formatübergabe (in meinem Fall sfJSON).

Wenn ich das so verwende, und in meiner Query Daten mit Umlauten drin sind funktioniert das LoadFromStream nicht mehr. Was mach ich falsch? Ich bin davon ausgegangen die Komponenten sind in der Lage den Formatierungsgedöns selbst zu machen. Leider kommt die Meldung das FDSTAN das JSON nicht lesen kann. Immer bei den Umlauten. Irgendwelche Tipps? ich find nix
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 14:09
Das ist mir zu viel Spekulation. Hast du ein konkretes Beispiel?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#3

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 15:15
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var
  lStringStream: TstringStream;
begin
  lstringStream := tstringstream.create;
  try
    FDMemTable1.SaveToStream(lStringStream,sfJSON);
    FDMemTable2.LoadFromStream(lStringStream,sfJSON);
  finally
    lStringStream.free;
  end;

end;
Beispielprojekt im Anhang, hab beim erstellen bemerkt, dass es scheinbar nicht an denUmlauten liegt, die Frage bleibt im Grundsatz aber die gleiche. Warum tut es nicht?
Angehängte Dateien
Dateityp: zip DemoFuerDelphi.zip (447,5 KB, 6x aufgerufen)

Geändert von fisipjm (18. Okt 2021 um 15:41 Uhr)
  Mit Zitat antworten Zitat
tamasker

Registriert seit: 16. Mai 2017
3 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 15:55
Hängt vermutlich mit der Positionierung im Stream zusammen.

Versuche doch mal die Position zurückzusetzen:

Delphi-Quellcode:
FDMemTable1.SaveToStream(lStringStream,sfJSON);
[B]lstringStream.Position := 0;[/B]
FDMemTable2.LoadFromStream(lStringStream,sfJSON);
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 16:17
Der Hinweis mit der Position ist richtig. Das trifft aber auf dein eigentliches Problem nicht zu. Aus deiner Frage bei StackOverflow sind ja zwei Code-Snippets zu entnehmen
Delphi-Quellcode:
var lStream: TStringStream := TStringStream.create;

    FDQuery.SaveToStream(lStream,sfJSON);
    AResponse.Body.SetStream(lStream,'application/json' ,True);
Delphi-Quellcode:
lstrstream: TStringStream := TStringStream.create(EMSBackendEndpoint.Response.Content);
 aMemtable.LoadFromStream(lstrstream, sfJSON);
Der zu ladende Stream sollte also schon am Anfang stehen.

Somit geht das Testprojekt leider am eigentlichen Problem vorbei.

Kannst du denn den String-Inhalt nach SaveToStream mal zeigen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#6

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 16:51
Der Hinweis mit der Position ist richtig. Das trifft aber auf dein eigentliches Problem nicht zu. Aus deiner Frage bei StackOverflow sind ja zwei Code-Snippets zu entnehmen
Hallo Uwe, Messerscharf kombiniert


Kannst du denn den String-Inhalt nach SaveToStream mal zeigen?
Das ist der Inhalt von einem Datensatz der definitiv Probleme macht, noch auf der Serverseite direkt nach dem SaveStream über folgenden Aufruf in eine JSon Datei gedumpt.

 tfile.WriteAllText(tpath.GetTempPath+'OutputNachSaveStream.json',Result.DataString)
Code:
..."BEZEICHNUNG":"B, Grünau","STRASSE":"",...
Das seltsame ist, in der IDE kann ich die Datei ohne muken in die Memtable laden, nur wenn ich Sie mir über den Stream vom Rersponse des BackendEndpoint hole bekomm ich die Meldung das es an Stelle 6666 knallt. Teuflisch oder

PS: JSON nachträglich gekürzt wegen irrelevanten Informationen.

Geändert von fisipjm (18. Okt 2021 um 17:29 Uhr)
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#7

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 16:56
Aha, ich seh da grad was.
Wenn ich den Stream Serverseitig ausgeben lasse, steht im JSON File
Code:
..."BEZEICHNUNG":"B, Grünau"...
Wenn ich mir den Stream Clientseitig ausgeben lassen, dann steht da
Code:
"BEZEICHNUNG":"B, Grünau"
Was machen wir nun mit der Erkentnis?
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#8

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 17:19
Okay, aus dem zerhakten (UTF8 ü in ANSI Schreibweise) Umlaut konnte ich mir jetzt folgenden Code ableiten:
var lstrstream: TStringStream := TStringStream.create(AnsiToUtf8(EndpointRead.Response.content)); Er funktioniert, aber irgendwie fühlt sich das "falsch" an, ich war der Meinung Delphi kann seit der 2009er Version schon UTF8 warum macht mir das BackenEndpoint da ein Ansi draus?
Ist das der richtige Weg? Irgendwelche bedenken?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dataset austausch über JSON

  Alt 18. Okt 2021, 17:42
Ist das in beiden Fällen dieselbe DB-Verbindung und auch dieselbe Query? Wie sind die Felder in der DB deklariert? Verwendest du statische Felder im Backend/Client?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#10

AW: Dataset austausch über JSON

  Alt 19. Okt 2021, 08:34
Moin Uwe,

Beim Server handelt es sich um einen MSSql Server, der wird über eine Connection und die Query direkt abgefragt.
Auf Clientseite hab ich eine FDMemtable mit mit LocalSQL. Ich lade also das Ergebnis der Query in eine lokale Memtable.
Die Anzeige der Felder läuft dynamisch über ein LiveBinding auf ein Stringgrid.

Auf meinen Stackoverflow Post gab es tatsächlich eine erhellende Antwort. tStringstream nimmt nicht per se UTF8, das kann manchmal abweichen. Wenn man das tStringstream.create mit Tencoding.UTF8 aufruft dann läuft das wie gewünscht.

Die übertragung läuft übrigens über den RADServer und einen Get aufruf. Hab also auf der CLientseite keine RESTkomponenten, sondern den BackendEndpoint vom EMS Server. Nebenbei bemerkt, ganz große sch...., sieht in den Videos immer alles so simpel aus, ist es auch, bis man versucht das ganze im Live system zu deployen. Ich empfehle jedem der damit eine Client Server Anwendung zur Verfügung stellen will, testet es lokal direkt mit dem IIS Express, ihr müsst dafür zwar die Lizenz nochmal zurücksetzen lassen wenns an die Live Installation geht aber das ist wirklich aller Mühe wert. Ich darf aktuell ein Projekt in das schon Wochen an Arbeit geflossen sind komplett umstellen weil die Komponenten auf dem IIS nicht laufen (Batchmove Komponenten).

Vielen Dank für die Hilfe!
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz