mexx
Goto Top

Delphi 7 - TMemoryStream ändert Inhalt beim Speichern

Ich verwende die FastReport-Komponenten und speichere einen Report wie folgt in einen Blob-Feld einer FireBird-Datenbank.

[code]
...
var MemStream: TStream;
begin
...
MemStream := TMemoryStream.Create;
MemStream.Position := 0;
FastReport.Report.SaveToStream(MemStream);

QueryInsertReport.ParamByName('FastReport').LoadFromStream(MemStream,ftBlob);
...
end;
[/code]

Die Verfahrensweise habe ich von einer Anleitung für den FastReport. Mit einer ShowMessage auf das Value des Parameters von 'QueryInsertReport.ParamByName('FastReport')' sehe ich, dass Einträge im Report wie ü,ä und ö verändert wurden. Die Umlaute sind nun ##. Speichere ich den Report als Datei passiert das nicht. Speicher ich andere Daten mit Umlauten in der Datenbank, verändern sich die Daten auch nicht.

Es muss also irgendwas beim 'SaveToStream(MemStream)' oder beim 'ParamByName('FastReport').LoadFromStream(MemStream,ftBlob)' mit dem Stream passieren. Aber wie finde ich das raus und welche Möglichkeiten habe ich, das Speichern des Reports als Blob in der Datanbank anders zu machen?

mexx

Content-Key: 2497

Url: https://administrator.de/contentid/2497

Printed on: April 19, 2024 at 14:04 o'clock

Member: stoffel17und4
stoffel17und4 Apr 16, 2007 at 08:03:57 (UTC)
Goto Top
Wäre es evtl. denkbar, dass du in der Datenbank dein BLOB-Feld "unsachgemäss" definiert hast? Z.B. mit einer unpassenden Zeichencodierung? Meine Firebird-BLOBs sind als BLOB SUB_TYPE 0 SEGMENT SIZE 4096 CHARACTER SET NONE definiert, d.h. eine Default-Kodierung der DB wird ignoriert.
Member: mexx
mexx Apr 16, 2007 at 08:23:33 (UTC)
Goto Top
Bei mir sind sie bewusst als Typ 1 definiert, um in Datanbankeditioren mal in das Blobfeld sehen zu können. Was sagt das CHARACTER SET NONE genau aus? den Zeichensatz.
Member: stoffel17und4
stoffel17und4 Apr 16, 2007 at 08:55:02 (UTC)
Goto Top
Bei mir sind sie bewusst als Typ 1 definiert,
um in Datanbankeditioren mal in das Blobfeld
sehen zu können. Was sagt das CHARACTER
SET NONE genau aus? den Zeichensatz.

Jepp.
NONE heisst: keine Kodierung, also auch insbesondere nicht die Defaultkodierung der Datenbank.
Ich bin mir im Moment nicht sicher, ob nicht gerade bei SUB_TYPE 1 (TEXT) die Zeichencodierung greift.
Wenn also bspw. deine Datenbank mit DEFAULT CHARSET UTF8 gebaut wäre, würde eine Zeichencodierung für Umlaute greifen - also für B(inary)LOBs nehme ich daher immer Typ 0 mit CHARSET NONE.
Nenn mich paranoid, aber es funktioniert face-smile

Link zum Thema SUB_TYPE und BLOBs:
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_blobs
Member: mexx
mexx Apr 16, 2007 at 09:04:45 (UTC)
Goto Top
Mit anderen Blobfeldern in der Datenbank geht es aber. Der Fehler versteckt sich in der Übergabe des Reports an den Stream und vom Stream als Parameter.
Member: stoffel17und4
stoffel17und4 Apr 16, 2007 at 09:28:28 (UTC)
Goto Top
Mit anderen Blobfeldern in der Datenbank geht
es aber. Der Fehler versteckt sich in der
Übergabe des Reports an den Stream und
vom Stream als Parameter.

Das glaub ich so nicht.
TMemoryStream verändert keine Daten, sondern ist nur ein Wrapper um einen Memory-Block.
Ich kann mir auch nicht vorstellen, dass ein SaveToStream oder ein LoadFromStream Daten verändert, DAS wäre eine echte Katastrophe face-wink

QueryInsertRecord ist welche Komponente?

Ansonsten ist alles so wie ich's auch mache ... und bei mir funktionierts (mit SUB_TYPE 0 und CHARSET NONE).

Im übrigen solltest du nicht wirklich auf die Ausgabe von ShowMessage setzen. Dabei könnte ich mir durchaus vorstellen, dass was schiefgeht (Windows ist auch da ziemlich schrottig). Die Daten die du mit LoadFromStream dem Parameter zuweist werden 1:1 in den internen Puffer kopiert. Da wird nix übersetzt.
Kommen denn deine Daten richtig in der DB an oder glaubst du nur (wg. SHowMessage) das sie falsch sind?
Member: mexx
mexx Apr 16, 2007 at 09:34:14 (UTC)
Goto Top
Bei QueryInsertReport handelt es sich um eine TQuery.

Die Daten kommen ja schon falsch in der DB an. Dort sind die Umlaute keine Umlaute mehr. Da ich aber andere Felder mit Umlauten belegen kann und auch andere Blobfelder selben Typs, und diese Umlaute auch Umlaute bleiben, suche ich den Fehler nicht in der DB. Da ich den Report auch als Datei abspeichern kann und dort der Umlaut auch richtig ist, glaube ich nicht, dass es am Report selbst liegt. Es bleibt nur noch der Transfer vom Report zum BlobStream und vom BlobStream zum Parameter der Query.
Member: stoffel17und4
stoffel17und4 Apr 16, 2007 at 10:13:42 (UTC)
Goto Top
Bei QueryInsertReport handelt es sich um eine
TQuery.

Also BDE (?)

Die Daten kommen ja schon falsch in der DB
an. Dort sind die Umlaute keine Umlaute mehr.
Da ich aber andere Felder mit Umlauten
belegen kann und auch andere Blobfelder
selben Typs, und diese Umlaute auch Umlaute
bleiben, suche ich den Fehler nicht in der
DB. Da ich den Report auch als Datei
abspeichern kann und dort der Umlaut auch
richtig ist, glaube ich nicht, dass es am
Report selbst liegt. Es bleibt nur noch der
Transfer vom Report zum BlobStream und vom
BlobStream zum Parameter der Query.

Hm. So langsam verstehe ich was du meinst face-smile

Die beiden Stellen die du meinst sind definitiv nicht an irgendeiner "Datenänderung" beteiligt, sondern schieben nur Bits hin und her face-wink

Du könntest ja mal die Daten des MemoryStreams (die ja richtig waren) in einen FileStream schreiben (als Referenz) und dann den Parameter mit einem LoadFromFile füllen (macht intern ein LoadFromStream).
Anschließend würde ich den BLOB aus der Datenbank mit einer kleinen Testanwendung auslesen und mit SaveToFile in eine Datei speichern ... Wenn sie identisch sind hast du ein Problem mit deinem DB-Werkzeug das Mist anzeigt. Sind sie nicht identisch könntest du nochmal die CHARSET-Geschichte prüfen.
Und ansonsten - keine Idee, sorry.