Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Delphi 7 - TMemoryStream ändert Inhalt beim Speichern

Frage Entwicklung

Mitglied: mexx

mexx (Level 2) - Jetzt verbinden

13.04.2007, aktualisiert 16.04.2007, 8432 Aufrufe, 7 Kommentare

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
Mitglied: stoffel17und4
16.04.2007 um 10:03 Uhr
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.
Bitte warten ..
Mitglied: mexx
16.04.2007 um 10:23 Uhr
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.
Bitte warten ..
Mitglied: stoffel17und4
16.04.2007 um 10:55 Uhr
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

Link zum Thema SUB_TYPE und BLOBs:
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_blobs
Bitte warten ..
Mitglied: mexx
16.04.2007 um 11:04 Uhr
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.
Bitte warten ..
Mitglied: stoffel17und4
16.04.2007 um 11:28 Uhr
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

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?
Bitte warten ..
Mitglied: mexx
16.04.2007 um 11:34 Uhr
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.
Bitte warten ..
Mitglied: stoffel17und4
16.04.2007 um 12:13 Uhr
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

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

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.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Exchange Server
Inhalt von Postfächern in Exchange löschen (9)

Frage von m.reeger zum Thema Exchange Server ...

VB for Applications
gelöst VBA-Makro verschwindet nach Speichern (5)

Frage von lupi1989 zum Thema VB for Applications ...

Windows 10
Citrix Receiver - Benutzernamen speichern (2)

Frage von hendrik.vondankbahr zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...