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, 8508 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 ..
Ähnliche Inhalte
PHP
gelöst ZIP-Datei auf Server speichern (23)

Frage von Yanmai zum Thema PHP ...

Windows 8
gelöst Nachrichtenverlauf speichern (6)

Frage von Miss-carrie zum Thema Windows 8 ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(29)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Windows Server

Exchange 2010 Active Directory und Windows Server 2016

(4)

Erfahrungsbericht von Herbrich19 zum Thema Windows Server ...

Heiß diskutierte Inhalte
Internet
gelöst Mitarbeiter surft auf unerwünschter Seite - Wie damit umgehen? (41)

Frage von sabines zum Thema Internet ...

Netzwerke
Wie erstelle ich ein Intranet (19)

Frage von Leonardnet zum Thema Netzwerke ...

Netzwerke
VPN-Server einrichten PPTPD-Einrichtung gescheitert (15)

Frage von MIlexx zum Thema Netzwerke ...

LAN, WAN, Wireless
gelöst Eintägige Netzwerkunterbrechung trotz Backupleitung (15)

Frage von iAmbricksta zum Thema LAN, WAN, Wireless ...