![]() |
Paradox spezielle Datentypen laden
Ich versuche gerade mir einen Paradox zu CSV Exporteur mit Delphi 5 zu schreiben, um sie danach in Postgres zu importieren. Postgres ist übrgiens ziemlich toll bis jetzt. :-D Dabei sollen spezielle Datentypen als Base64 gespeichert werden. Also aus Blob mach Base64. Ja, danach ist der Importeur dran.
Für Blobfelder habe ich das noch hinbekommen. Jetzt knobel ich an z.B. ftBytes. Aus irgendeinem Grund finde ich nichts zu dem Byte Feld. Ich hätte ja gedacht das funktioniert genauso wie mit den Blobfeldern, aber das scheint dann doch nicht so. Ich weiß nicht in welchen Zwischenspeicher ich das schieben muss. Eigentlich will ich das in einem Stream haben. Das geht dann ja noch weiter: Wenn z.B. ftVarBytes, ftTypedBinary oder ftGraphic oder vielleicht noch ftMemo dazukommt. Die anderen Datentypen scheinen jetzt nicht unbedingt wichtig für das eigentliche Projekt zu sein, aber ich möchte gern ein Schleifchen an mein Programm machen. Ich glaub ich steh gerade auf einem Schlauch. Das Code-Beispiel zeigt, wie ich das mit den Blobfeldern mache:
Code:
BlobField := ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName) as TBlobField;
Stream := TMemoryStream.Create(); if Assigned(Stream) then begin BlobField.SaveToStream(Stream); Stream.Position := 0; StrVar := Base64Encode(Stream)+';'; FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar)); FreeAndNil(Stream); end |
AW: Paradox spezielle Datentypen laden
Sowas vielleicht:
Delphi-Quellcode:
var
msTemp : TMemoryStream; ssTemp : TStringStream; ... begin ... msTemp.Clear(); Query.FieldByName('TollesByteFeld').GetData(TheBytes); msTemp.Write64(TheBytes, 0, Length(TheBytes)); TNetEncoding.Base64.Encode(msTemp, ssTemp); ... xxx := ssTemp.DataString;/ ssTemp.SaveToFile('C:\Temp\DaRein.dat'); ... end; |
AW: Paradox spezielle Datentypen laden
Ja Danke, das war so der Schubs in die richtige Richtung. Hab das aber ein bisschen anders gelöst.
Code:
Mir ist aber so beim Testen was aufgefallen. Wenn das Feld jetzt ein String ist und ich mir die Raw Bytes ausgeben lasse, bin ich nicht in der Lage aus den Bytes wieder den Original String zu generieren. Das hab ich probiert, aber glaube ich hab was falsch gemacht. Oder das geht so grundsätzlich nicht. Zumindest hab ich gelesen, dass das fehlerhafte Ausgaben produziert. Hab es mit PChar, WideChar und AnsiChar ausprobiert. Aber es kam immer nur Datensalat bei raus. Hab mir auch mal die FieldByName.AsString Methode angeschaut. War aber auch nicht sehr erhellend.
SetLength(Bytes,ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes); Stream := TMemoryStream.Create(); if Assigned(Stream) then begin Stream.Write(Bytes,Length(Bytes)); Stream.Position := 0; StrVar := Base64Encode(Stream)+';'; FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar)); FreeAndNil(Stream); end
Code:
SetLength(Bytes,ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes); Stream := TMemoryStream.Create(); if Assigned(Stream) then begin Stream.Write(Bytes,Length(Bytes)); Stream.Position := 0; SetString(StrVar,PChar(Stream.Memory),Stream.Size div SizeOf(Char)); StrVar := StrVar + ';'; FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar)); FreeAndNil(Stream); end |
AW: Paradox spezielle Datentypen laden
Und so geht das nicht?
Delphi-Quellcode:
Ich denke, wenn du Bytes ausliest und nur in eine Datei schreibst müsste das Encoding egal sein.
SetLength(Bytes, ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).Size);
ParadoxTable.FieldByName(ParadoxTable.Fields[i].FullName).GetData(Bytes); Stream := TMemoryStream.Create(); Stream2 := TStringStream.Create([]); // evtl muss hier noch das Encoding mit angegeben werden //Stream2 := TStringStream.Create('', TEncoding.UTF8, False); try Stream.Write(Bytes, Length(Bytes)); Stream.Position := 0; //Stream2.Position := 0; // evtl? Stream2.LoadFromStream(Stream); //Stream.Position := 0; evtl? //Stream2.Position := 0; // evtl? Stream2.DataString := Stream2.DataString + ';'; // Hinweis A Stream2.SaveToFile(ExportFile); finally FreeAndNil(Stream); FreeAndNil(Stream2); end; Nur wenn du mit DataString tatsächlich das ganze in Delphi irgendwo verwenden willst, müsstest du auch mit dem richtigen Encoding arbeiten. Dazu musst du wissen, mit welchem Encoding die Daten gespeichert wurden. Hinweis A: An der Stelle arbeitest du mit dem DataString. Du fügst dass "Semikolon" den eigendlichen Daten hinzu. Je nachdem mit welchem Encoding du arbeitest, könnten den Daten nun (beispielsweise) 1 Byte oder 2 Byte hinzugefügt werden. Daher müsstest du wissen, welches Encoding vorliegt. ... Um genau zu sein denke ich sogar, dass bei falschem Encoding das Auslesen und Schreiben
Delphi-Quellcode:
bereits die Daten schon zerstören können. Oder du bekommst eine Fehlermeldung,
Stream2.DataString := Stream2.DataString;
dass da ein Zeichen in den Bytes ist, was vom Encoding nicht unterstützt wird. Solange Delphi (und da weiß ich jetzt nicht, wie das genau gelöst ist bei TStringStream) intern beim LoadFromStream, SaveToFile, usw. nur mit den Bytes arbeitet wäre das Encoding für diese Routinen halt egal. Theoretisch braucht man das Encoding ja nur um eine Representation als String zu erhalten, vorher nicht. (Ich hoffe ich erzähle nicht allzugroßen Unsinn, aber so hatte ich das wenigstens verstanden. Ich bin jetzt auch kein Guru, was Encodings angeht! ;-) ) LG Incocnito |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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