AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Paradox spezielle Datentypen laden

Ein Thema von UntoterGeist · begonnen am 18. Feb 2021 · letzter Beitrag vom 19. Feb 2021
Antwort Antwort
UntoterGeist

Registriert seit: 18. Sep 2019
25 Beiträge
 
#1

Paradox spezielle Datentypen laden

  Alt 18. Feb 2021, 00:52
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. 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
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#2

AW: Paradox spezielle Datentypen laden

  Alt 18. Feb 2021, 08:00
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;
  Mit Zitat antworten Zitat
UntoterGeist

Registriert seit: 18. Sep 2019
25 Beiträge
 
#3

AW: Paradox spezielle Datentypen laden

  Alt 18. Feb 2021, 21:17
Ja Danke, das war so der Schubs in die richtige Richtung. Hab das aber ein bisschen anders gelöst.
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;
    StrVar := Base64Encode(Stream)+';';
    FileWrite(ExportFile,PByte(StrVar)^,Length(StrVar));
    FreeAndNil(Stream);
  end
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.
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
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#4

AW: Paradox spezielle Datentypen laden

  Alt 19. Feb 2021, 08:33
Und so geht das nicht?
Delphi-Quellcode:
  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;
Ich denke, wenn du Bytes ausliest und nur in eine Datei schreibst müsste das Encoding egal sein.
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 Stream2.DataString := Stream2.DataString; bereits die Daten schon zerstören können. Oder du bekommst eine Fehlermeldung,
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz