AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Formatierten Text in PostgreSQL 9 speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Formatierten Text in PostgreSQL 9 speichern

Ein Thema von FBrust · begonnen am 20. Dez 2015 · letzter Beitrag vom 21. Dez 2015
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#1

Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 10:11
Datenbank: PostgreSQL • Version: 9.4 • Zugriff über: Zeos
Hallo zusammen, einen schönen 4. Advent wünsche ich,

ich versuche seit längerem für eine kleine Notizenanwendung den Text der Notiz formatiert (also fett, kursiv etc.) in einer PostgreSQL-Datenbank zu speichern, erhalte jedoch beim Wiederauslesen nur Zeichensalat.

Das Feld in der Datenbank ist vom Typ bytea. Wenn ich mit der Methode

Delphi-Quellcode:
function TfrmMain.GetRTFText: string;
var
  FStream : TMemoryStream;
begin
  FStream := TMemoryStream.Create;
  FStream.Clear;
  redt1.Lines.SaveToStream(FStream);
  Result := PChar(FStream.Memory);
  FStream.Free;

end;
den Text als Stream in der Datenbank speichere, erhalte ich

Zitat:
"\345\261\273\347\221\262\343\205\246\346\205\234\ 347\215\256\345\261\251\346\225\244\346\231\246\34 7\254\260\346\231\234\346\271\257\347\221\264\346\ 261\242\345\261\273\343\201\246\346\231\234\346\24 5\256\345\261\254\346\215\246\346\205\250\347\215\ 262\347 (...)"
Beim Wiederauslesen mit

Delphi-Quellcode:
procedure TfrmMain.SetRTFText(RichRTFText: string);
var
  FStream : TMemoryStream;
begin
  FStream := TMemoryStream.Create;
  FStream.Clear;
  FStream.WriteBuffer(RichRTFText[1], Length(RichRTFText));
  FStream.Position := 0;
  redt1.Lines.LoadFromStream(FStream);
  FStream.Free;
end;
erhalte ich nur wirren Zeichensalat.

Hat vielleicht jemand einen Tip, wo ich ansetzen kann?


Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty

Geändert von FBrust (20. Dez 2015 um 10:15 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 13:38
Hallo,

das sieht aus wie unvollständiges RTF.

Zeichenfolgen in der Form "\345\261\273\347\221\262\343" können da schon vorkommen, es scheint aber der Header zu fehlen.

Ein bisserl was zum RTF-Format ist hier zu finden: https://en.wikipedia.org/wiki/Rich_Text_Format

Speichere doch bitte den Text auch einmal mit  redt1.Lines.SaveToFile('Testdatei.rtf'); und schau, ob Du die Datei mit 'ner Textverarbeitung öffnen kannst und sie dort vernünftig angezeigt wird.

Und schau bitte mal mit Notepad, Hexeditor (oder so) in die Datei und prüfe, ob die Datei der Spezifikation entspricht oder den gleichen Inhalt hat, wie der Stream.

Datei und Stream müssten eigentlich mit {\rtf beginnen und mit } enden.

Ist dem bei Beiden nicht so, so wird von redt1 kein (vollständiges) RTF gespeichert. Prüfe dann mal bei den Eigenschaften, ob da was zu konfigurieren ist.

Eventuell fehlt hier in der Routine aber auch was:
Delphi-Quellcode:
function TfrmMain.GetRTFText: string;
var
  FStream : TMemoryStream;
begin
  FStream := TMemoryStream.Create;
  FStream.Clear;
  redt1.Lines.SaveToStream(FStream);
  FStream.Position := 0; // <- fehlt das?
  Result := PChar(FStream.Memory);
  FStream.Free;
end;
Ansonsten helfen diehier?
http://www.delphipraxis.net/167329-t...ichern-db.html
http://stackoverflow.com/questions/4...into-trichedit
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 16:04
Ich würde es mal mit Datentyp
TEXT oder für kleinere Texte VARCHAR statt BYTEA versuchen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 16:06
Hallo,

danke für die Antworten.

Also die RTF-Datei wird einwandfrei gespeichert und hat dann auch den korrekten Inhalt.

Ich habe zwischenzeitlich ein varchar-Feld für die Daten genommen.

Wenn ich allerdings den Inhalt des Richedits mit GetRTFText in einen Stream umwandle, wird ein Teil der RTF-Daten abgeschnitten, was dann so aussieht:


Zitat:
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
\viewkind4\uc1\par
Das FStream.Position := 0; hat tatsächlich gefehlt, die Korrektur hat aber keine Auswirkung auf das Ergebnis.



Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 16:37
Hatte vor längerer Zeit mal ähnliche Probleme beim Speichern von RTF-Dateien in Firebird. Seitdem ich nun RTF-Dateien in binären Blobfeldern speichere, wird alles so ausgegeben, wie es gespeichert wurde, und zwar fehlerfrei ebenfalls mit SaveToStream und LoadFromStream. Zuvor hatte ich den Subtyp Text des Blobtypes verwendet, was zu Darstellungsfehlern nach dem Einlesen aus Blobfeld führte.

Da du ja ebenfalls ein Blob-Feld verwendest, um RTF-Inhalte zu speichern, könnte es sich vielleicht um eine ähnliche Problematik handeln. Unter PostGreSql gibt es ja ebenfalls ein binäres (Hex Format) und ein textbasiertes (Escape Format) Blobfeld. Vielleicht lassen sich nicht alle Zeichen, die in deinem RTF-Text vorkommen, als Ascii-Werte speichern bzw. kommt es zu Fehlern beim maskieren der unbekannten Zeichen. Bei einer binären Speicherung dürfte das dann keine Rolle mehr spielen.
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 16:50
Hallo,

eigentlich wollte ich die Daten auch binär in einem BYTEA-Feld speichern, aber dann kommt nur wirrer Zeichensalat bei raus.

Wenn ich ein Varchar-Feld nehme, wird der RTF-Text, der ja die Formatierungen enthält, abgeschnitten, obwohl das Feld groß genug ist.

Ich steh irgendwo auf dem Schlauch...


Gruß

Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 17:15
Ich weiß nur, dass beim Zugriff auf PostGres über ADO die Größe von Textmemos begrenzt ist.

Das Größenproblem liegt nicht auf der Datenbankseite und nicht in Delphi, sondern irgendwo dazwischen.

Beim Zugriff über ODBC kann man in der Konfiguration unter "Options -> DataSource" einen Wert für "Max Varchar" eingeben (der unter ADO aber keine Auswirkung zu haben scheint).

Kann man das beim Zugriff über die Zeos-Komponenten irgendwo konfigurieren?
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 17:20
Wenn ich die oben bereits verlinkte Dokumentation richtig verstehe, gibt zwei Blob-Typen:

The bytea type supports two external formats for input and output: PostgreSQL's historical "escape" format, and "hex" format. Both of these are always accepted on input. The output format depends on the configuration parameter bytea_output; the default is hex. (Note that the hex format was introduced in PostgreSQL 9.0; earlier versions and some tools don't understand it.)

The SQL standard defines a different binary string type, called BLOB or BINARY LARGE OBJECT. The input format is different from bytea, but the provided functions and operators are mostly the same.


Ich würde da jetzt mal herumexperimentieren (oder besser: nein, ich würde jetzt nicht, aber du könntest). Schau dir auch mal die beiden Tabellen in der verlinkten Doku an, da gibt es auch sog. Ausgabe-Parameter, die darüber entscheiden, was wie ausgegeben wird, insbesondere, wenn Zeichen zuvor maskiert wurden.

Gerade finde ich noch einen Hinweis in meinem PostGre-Handbuch: Um den Datentyp bytea zu verwenden, sollten Sie einfach die Methoden getBytes(), setBytes(),
getBinaryStream() oder setBinaryStream() anwenden.

Geändert von Perlsau (20. Dez 2015 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FBrust
FBrust

Registriert seit: 4. Okt 2002
Ort: Saarbrücken
654 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 17:41
Hallo,

der RTF-String ist schon abgeschnitten, wenn ich in innerhalb des Programms in einen Stream und wieder zurück wandele, ohne dass die Datenbank im Spiel ist.

Perlsau hat schon recht, ich muss da experimentieren und die richtige Kombination aus Stream-Konfiguration, Komponenteneinstellung und Wissen aus Forenbeiträgen austüfteln.

Jedenfalls danke für die Ideen, ich werde berichten.




Gruß
Frank
"Ich habe Dinge gesehen, die ihr Menschen niemals glauben würdet. Gigantische Schiffe, die brannten, draußen vor der Schulter des Orion" - Roy Batty
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: Formatierten Text in PostgreSQL 9 speichern

  Alt 20. Dez 2015, 18:39
Sorry, aber das kann ich nun überhaupt nicht nachvollziehen. Im Anhang eine Zip-Datei mit einem Test-Projekt (D2009), das einwandfrei funktioniert: Die geladene RTF-Datei wird via TMemoryStream in ein zweites RichEdit kopiert, und zwar vollständig fehlerfrei:
Delphi-Quellcode:
unit UnitMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TFormMain = class(TForm)
    Panel_Main: TPanel;
    Panel_Navi: TPanel;
    Rich_Quelle: TRichEdit;
    Rich_Ziel: TRichEdit;
    Btn_Close: TButton;
    OpenDlg: TOpenDialog;
    SaveDlg: TSaveDialog;
    Btn_Open: TButton;
    Btn_Save: TButton;
    Btn_Kopie: TButton;
    procedure Btn_CloseClick(Sender: TObject);
    procedure Btn_OpenClick(Sender: TObject);
    procedure Btn_SaveClick(Sender: TObject);
    procedure Btn_KopieClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.Btn_CloseClick(Sender: TObject);
begin
  Close;
end;

procedure TFormMain.Btn_OpenClick(Sender: TObject);
begin
  If Not OpenDlg.Execute Then Exit;
  Rich_Quelle.Lines.LoadFromFile(OpenDlg.FileName);
end;

procedure TFormMain.Btn_SaveClick(Sender: TObject);
begin
  If Not SaveDlg.Execute Then Exit;
  Rich_Ziel.Lines.SaveToFile(SaveDlg.FileName);
end;

procedure TFormMain.Btn_KopieClick(Sender: TObject);
Var
  S : TMemoryStream;
begin
  S := TMemorystream.Create;
  Try
    Rich_Quelle.Lines.SaveToStream(S);
    S.Position := 0;
    Rich_Ziel.Lines.LoadFromStream(S);
  Finally
    S.Free;
  End;
end;

end.
Angehängte Dateien
Dateityp: zip RtfStreamTest.zip (5,8 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 10:46 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