Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen (https://www.delphipraxis.net/73485-blob-sub_type-text-nimmt-nicht-mehr-als-255-zeichen.html)

Jens Schumann 18. Jul 2006 21:53

Datenbank: Firebird • Version: 1.5.2.4731 • Zugriff über: IBX

BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Hallo,
seit mehreren Jahren verwende ich erfolgreich folgende Domian:
SQL-Code:
CREATE DOMAIN "TTEXTBLOB" AS BLOB SUB_TYPE TEXT SEGMENT SIZE 80 CHARACTER SET ISO8859_1;
Ebenfalls verwende ich seit mehreren Jahren sehr erfolgreich Excel als Tabellenpflegeprogramm.
D.h. ich editiere die Datensätze in einer Exceltabelle und tausche anschließend die komplette
Tabelle in der Datenbank aus. Da es sich um max 4.000 bis 5.000 Datensätze handelt ist das eigentlich
auch kein Problem.

Jetzt kommt's:
Wenn in einer Excelzelle mehr als 250 Zeichen stehen verwende ich als o.g. Domain.
Das klappt hervorragend.

Heute stellte sich heraus das in einer Tabelle folgende Domain nicht meher ausreicht.
SQL-Code:
CREATE DOMAIN "TSTRING250" AS VARCHAR(250) CHARACTER SET ISO8859_1 COLLATE DE_DE;
Dehalb habe ich mit diesem Script aus dem Feld "FORMEL" ein TTextBlob gemacht:
SQL-Code:
ALTER TABLE PNK ADD FORMEL_TMP TSTRING250 COLLATE de_de;
UPDATE pnk SET FORMEL_TMP=FORMEL;
ALTER TABLE PNK DROP FORMEL;
ALTER TABLE PNK ADD FORMEL TTEXTBLOB;
UPDATE pnk SET FORMEL=FORMEL_TMP;
ALTER TABLE PNK DROP FORMEL_TMP;
COMMIT;
Dummerweise werden jetzt aber nur 255 in das Feld geschrieben (oder aus der Excelzelle gelesen).
Wenn ich das Feld manuell in der IBOConsole editiere werden mehr als 255 übernommen.

Es scheint also so zu sein, dass wenn ich das Feld in der Tabelle von Anfang an als TTextBlob anlege mehr
als 255 Zeichen aus der Excelzelle gelesen werden und wenn ich es mit o.g. Script erzeuge nur 255 Zeichen.

Kann das sein? Wenn ja - warum :gruebel:

Ein Backup / Restore hat nichts geändert.

mkinzler 18. Jul 2006 21:54

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Wie versuchst du das Einzufügen?

Jens Schumann 19. Jul 2006 07:24

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Zitat:

Zitat von mkinzler
Wie versuchst du das Einzufügen?

SQL-Code:
INSERT INTO tabelle (FORMEL) VALUES (:F)
:F ist der Parameter

hoika 19. Jul 2006 08:02

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Hallo,

1. und wie sieht das zuweisen aus ?
ParamByXXX ?
da muss dann AsBlob stehen


2. Collate usw. hat bei Blobs nichts zu suchen.
Ist halt ein Binärteil, du könntest auch ein Bild eintragen an der
gleichen Stelle ;)


Hier eine Funktion, die ich seit Jahren benutze.
- TjifQuery kann durch TQuery ersetzt werden
- DataBaseName muss natürlich geändert werden

{
name:
UpdateTextBlobField_Ex
usage:
update a blob field
parameter:
theTableName - table name
thePrimaryKeyName - name of the primary key
thePrimaryKeyValue - value of the primary key
theFieldName - field name of the blob field
theText - field value
return parameter:
theErrorStr - error message
return:
false on error
notes:
- additional to UpdateTextBlobField name of the
primary key is needed
}
function UpdateTextBlobField_Ex(const theTableName: String;
const thePrimaryKeyName: String; thePrimaryKeyValue: Integer;
const theFieldName: String; const theText: String;
var theErrorStr: String): Boolean;
var
FQuerySQL : TjifQuery;
begin
Result:= False;
theErrorStr:= S_internal_error;

try
FQuerySQL := CreatejifQuery;
try
with FQuerySQL do
begin
DataBaseName:= C_ALIASNAME;

SQL.Add('Update '+theTableName+' Set ');
SQL.Add(theFieldName+'=:'+theFieldName);
SQL.Add('Where '+thePrimaryKeyName+'=:Id');
ParamByName('Id').AsInteger:= thePrimaryKeyValue;
ParamByName(theFieldName).AsBlob:= theText;
ExecSQL;
end; { with FQuerySQL do }

Result:= True;
finally
FQuerySQL.Free;
end;
except
on E: Exception do theErrorStr:= E.message;
end;
end; { UpdateTextBlobField_Ex }


Heiko

Jens Schumann 19. Jul 2006 08:55

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Zitat:

Zitat von hoika
1. und wie sieht das zuweisen aus ?
ParamByXXX ?
da muss dann AsBlob stehen

Muss nicht da es bei Felder, die von Anfang an Blob's sind funktioniert

Zitat:

Zitat von hoika
2. Collate usw. hat bei Blobs nichts zu suchen.
Ist halt ein Binärteil, du könntest auch ein Bild eintragen an der
gleichen Stelle ;)

Firebird unterscheidet zwei Typen von Blobfelder, binäre und Text (ich verwende explizit Text)

Elvis 19. Jul 2006 09:04

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Klingt wie übliche göttliche Bestrafung dafür, dass man eine Tabellenkalkulationssoftware als DBMS-Ersatz missbraucht.
Solange du nicht bei Automationsserver raufgehst solltest du nicht mehr als 250 Zeichen aus einem Feld bekommen.

Jens Schumann 19. Jul 2006 11:52

Re: BLOB SUB_TYPE TEXT nimmt nicht mehr als 255 Zeichen
 
Zitat:

Zitat von Elvis
Klingt wie übliche göttliche Bestrafung dafür, dass man eine Tabellenkalkulationssoftware als DBMS-Ersatz missbraucht.
Solange du nicht bei Automationsserver raufgehst solltest du nicht mehr als 250 Zeichen aus einem Feld bekommen.

Nein das kann es nicht sein. Bei Tabellen bei denen das Feld von Anfang an ein Text-Blob ist bekomme ich mehr als 255 Zeichen. Das ist ja das Mysterium.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 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