Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Einfügen von großen Texten in ein FB TextBLOB-Feld scheitert (https://www.delphipraxis.net/92930-einfuegen-von-grossen-texten-ein-fb-textblob-feld-scheitert.html)

Gecko 29. Mai 2007 01:55

Datenbank: Firebird • Version: 2.0 • Zugriff über: Zeos

Einfügen von großen Texten in ein FB TextBLOB-Feld scheitert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

immer wenn ich versuche grössere Texte in ein Firebird-TextBlob Feld einzufügen, kommt folgende Fehlermeldung (siehe Anhamg).

Vorgehensweise:

qrmain.SQL.Text:='INSERT INTO POSTEIN (ID, TEXT) VALUES (NULL, '''+memo2.lines.text+''')';
qrMain.ExecSQL;

In memo2 ist eben der Text. Wenn dieser relativ klein ist, geht alles, aber ab einer gewissen grösse (ca. 40KB) kommt der Fehler.
Dies ist das Feld: TEXT BLOB SUB_TYPE 1 SEGMENT SIZE 30000


PS:
Hab gerade gelesen:
Zitat:

Segmentlänge
Bei der Definition eines Blobs kann man außerdem eine Segmentlänge angeben. Der
Standardwert beträgt 80 Byte, der größtmögliche Wert 32767 Byte (bzw. 32 kByte). Die
Segmentlänge gibt an, wieviel IB/FB auf einmal von einem Blob verarbeiten kann. Eine
Änderung des Standardwert bringt nicht wirklich Vorteile.
Heisst das ich kann maximal einen 32KB grossen BLOB speichern?

Was kann ich tun?

mkinzler 29. Mai 2007 06:22

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Zitat:

Heisst das ich kann maximal einen 32KB grossen BLOB speichern
? Nein bei einer Schreib-/Lese-vorgang.
Dein Fehler wird eher am NULL-Wert bei der ID liegen

marabu 29. Mai 2007 07:14

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Guten Morgen,

zwei Dinge fallen mir auf:

Sobald der BLOB-Text ein Apostroph enthält, ist die Syntax des SQL-Statements nicht mehr korrekt. Das lässt sich beheben:

Delphi-Quellcode:
resourcestring
  FMT_INSERT = 'INSERT INTO POSTEIN (id, text) VALUES (NULL, %s)';
begin
  with qrmain do
  begin
    SQL.Text := Format(FMT_INSERT, [QuotedStr(Memo2.Text)]);
    ExecSQL;
  end;
end;
Ein weiteres Problem ist die Größenbegrenzung bei SQL-Statements. Sie kann bei 32KB oder 64KB liegen. Die Lösung dafür sind parametrisierte Statements.

Grüße vom marabu

hoika 29. Mai 2007 11:24

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Hallo,

und bei der parametrisierten Query

Delphi-Quellcode:
ParamByName('bäa').AsBlob:= theText
verwenden.


Heiko

Gecko 29. Mai 2007 11:42

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Hallo,

@mkinzler: an dem NULL liegts nicht, denn ich verwende einen Trigger+Generator zum hochzählen und der funktioniert einwandfrei,
denn wenn das Memo < 30-40KB ist, geht alles problemlos

@marabu
Auch die Sache mit dem QuotedStr bringt leider keine Abhilfe, immernoch der gleiche Fehler ab ca. 30-40KB Text

mkinzler 29. Mai 2007 11:48

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Dann würde ich das ID-Feld beim Insert trotzdem weglassen und Parameter verwenden, was sowieso immer ne gute Option ist.

Gecko 29. Mai 2007 12:30

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Zitat:

Zitat von mkinzler
Dann würde ich das ID-Feld beim Insert trotzdem weglassen und Parameter verwenden, was sowieso immer ne gute Option ist.

OK..aber ne Idee wie ich rausfinden könnte was dieser Fehler da genau bedeutet, haste leider auch nicht, oder?

mkinzler 29. Mai 2007 12:32

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Ich würde mal Achims Antwort mit dem Puffer nochmal durchlesen.

Elvis 29. Mai 2007 12:46

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
Was ist die maximale Größe eines Statements in Firebird?
Die doch etwas kranke Vorgehensweise, Werte direkt in das Statement zu quetschen, könnte dieses enorm aufblähen.
Es wird definitiv eine Obergrenze für die Statementlänge geben, und du wirst sie mit einem so komischen Ansatz garantiert irgendwann sprengen.

Mache es also so wie es überall außer in einem VB-Forum gezeigt wird: ;)
Pseudo code (Ich habe keinen Plan von Zeos ;) ):
Delphi-Quellcode:
Query.SQL.Text :=
  'INSERT INTO PostEin' + #10 +
  ' (Text)' + #10 +
  'VALUES' + #10 +
  ' (:Text)';
Query.Parameters.Add('Text', Memo.Lines.Text);
 
Query.ExecSQL();

Gecko 29. Mai 2007 12:59

Re: Einfügen von großen Texten in ein FB TextBLOB-Feld schei
 
THX, so gehts doch!

Code:
with qrmain do
begin
  SQL.Text :=' INSERT INTO POSTEIN (text) VALUES (:Text)';
  qrmain.ParamByName('Text').AsBlob:=memo2.Lines.Text;
  ExecSQL;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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 by Thomas Breitkreuz