![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: DataSnap
DataSnap TFDJSONDataSets in die DB schreiben
Hallo Zusammen,
das Problem vorab:
Delphi-Quellcode:
SizeOf liefert nicht die Objektgröße
oStream.read(FJSONDataSets, SizeOf(FJSONDataSets));
von FJSONDataSets sondern vermutlich die Anzahl der Tabellen. Ich habe eine Hand voll Tabellen aus denen ich markierte Datensätze von einem DataSnap Client zu einen Data Server übertragen muss. Alle Daten sollen zu einem Paket zusammengefasst werden. Es bietet sich an ein TFDJSONDataSets zu verwenden da es mehrere Tabellen aufnehmen kann. Das FJSONDataSets wird auch komplett richtig übertragen. Testhalber habe ich einzelne Tabellen nach dem Empfang ausgelesen und als XML in ein File gespeichert. Der Transport funktioniert also. Das Problem ist nun, ich würde gerne das komplette FJSONDataSets Object in ein Blob schreiben um es später zu verarbeiten. Genau das gelingt mir nicht. Leider hat FJSONDataSets kein SaveToStream. Ich habe es versucht mit einem TMemoStream. Vermutlich mache ich etwas falsch denn SizeOf(FJSONDataSets) gibt immer 4 aus obwohl es deutlich größer ist. Hat jemand eine Idee wie das mit dem TMemoStream funktioniert? FJSONDataSets wird ja auch serialisiert über DataSnap. Eigentlich müsste es dafür Methoden geben.
Delphi-Quellcode:
Gruß Kostas
function TdmDALPostfach.SavePaketInDB(FJSONDataSets:TFDJSONDataSets): integer;
var id: Integer; begin result := 0; TThread.Synchronize(nil, procedure var oConn: TFDConnection; oCmd: TFDCommand; oStream: TMemoryStream; begin oStream := TMemoryStream.Create(); oConn := TFDConnection.Create(nil); oCmd := TFDCommand.Create(nil); try oStream.read(FJSONDataSets, SizeOf(FJSONDataSets)); oConn.ConnectionDefName := PostfachConnectionDefName; oCmd.Connection := oConn; oCmd.CommandText.Text := 'INSERT INTO PAKETE(LIZENZID, INHALT, ZEITPUNKT) values (:LIZENZID, :INHALT, :ZEITPUNKT)'; oCmd.Params[0].AsInteger := 1; oCmd.Params[1].LoadFromStream(oStream,ftBlob); oCmd.Execute; oConn.Close; finally oConn.Free; oCmd.Free; oStream.Free; end; end); end; |
AW: DataSnap TFDJSONDataSets in die DB schreiben
Zu deinem
Delphi-Quellcode:
Problem:
SizeOf
Du ermittelst die Größe des Referenzzeigers und der ist 4 Byte groß (weil du eine 32bit Exe erzeugt hast). Das gleiche Ergebnis bekommst du mit
Delphi-Quellcode:
var Obj: TObject;
SizeOf( Obj ); |
AW: DataSnap TFDJSONDataSets in die DB schreiben
Hallo Sir Rufo,
aha, jetzt ist klar warum immer 4 Byte ausgegeben werden. Hast du eine Idee wie ich die Gesamtgröße abfragen kann oder geht es überhaupt nicht so wie ich mir das vorstelle das FJSONDataSets komplett in ein Blob zu schreiben? Gruß Kostas |
AW: DataSnap TFDJSONDataSets in die DB schreiben
So wie du dir das vorstellst geht das nicht ...
Hast du dir die Doku schon angeschaut? (Ja schwach wie gewohnt, aber der entscheidende Hinweis ist schon da) |
AW: DataSnap TFDJSONDataSets in die DB schreiben
Meinst du DataSetsToJSONObject?
Mein Delphi XE7 hat keine Hilfe zu TFDJSONDataSets aber in des sources bin ich soeben auf etwas gestoßen. [Edit] Jetzt habe ich eine Möglichkeit gefunden. Über die Klasse TFDJSONInterceptor ist es möglich das gesamte FJSONDataSets als AJSONObject zu konvertieren. Das lässt sich einwandfrei als Text in ein Blob vom typ Text schreiben und wieder zurück.
Delphi-Quellcode:
TFDJSONInterceptor.DataSetsToJSONObject(FJSONDataSets, AJSONObject);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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