Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Firebird] TEXT Feld füllen? (https://www.delphipraxis.net/111930-%5Bfirebird%5D-text-feld-fuellen.html)

Nuclear-Ping 11. Apr 2008 21:37

Datenbank: Firebird • Version: 2.0.3 • Zugriff über: ZEOS

[Firebird] TEXT Feld füllen?
 
Grüße,

ich expermentiere grad mit Firebird rum, um zu schauen, wie unsere Anwendung damit - statt Advantage - läuft. Klappt auch alles ganz gut soweit, nur habe ich mich grad mit einem Problem verstrickt, wo ich nicht so recht weiterkomme.

Ich habe eine Tabelle mit einem TEXT/NCHAR Feld.
SQL-Code:
CREATE TABLE Clients (
  Id          INTEGER NOT NULL,
  Title       VARCHAR(64),
  LastName    VARCHAR(128) NOT NULL,
  FirstName   VARCHAR(128),
  Address     NCHAR,
  UseBirthData SMALLINT,
  BirthDateTime TIMESTAMP,
  BirthPlace  VARCHAR(128),
  BirthCountry VARCHAR(128),
  Gender      SMALLINT,
  UseManualGeoData SMALLINT,
  Longitude   FLOAT,
  Latitude    FLOAT,
  Zone        TIMESTAMP,
  DST         TIMESTAMP,
  ImageFile   VARCHAR(128),
  IsActive    SMALLINT,
  PRIMARY KEY (Id)
);
CREATE GENERATOR Clients_Id_Gen;
CREATE INDEX ClientsOrdinary ON Clients (LastName);
Wenn ich per Query nun einen Eintrag hinzufügen will...
SQL-Code:
INSERT INTO CLIENTS (TITLE, LASTNAME, FIRSTNAME, ADDRESS, USEBIRTHDATA, BIRTHDATETIME, BIRTHPLACE, BIRTHCOUNTRY, GENDER, USEMANUALGEODATA, LONGITUDE, LATITUDE, ZONE, DST, IMAGEFILE, ISACTIVE)
VALUES ('Herr', 'Mustermann', 'Max', 'Irgendnestrasse 12, 12345 Irgendwo', 0, NULL, NULL, NULL, 0, 0, 13.7777, 15.2, '12/30/1899 01:00:00', '12/30/1899 01:00:00', NULL, 1)
... erhalte ich folgende Fehlermeldung:
Zitat:

arithmetic exception, numeric overflow, or string truncation
Arithmetic overflow or division by zero has occurred.
Reduziere ich den Inhalt des Adressfeldes auf ein Zeichen ('Irgendnestrasse 12, 12345 Irgendwo' -> 'I') klappt es. Auch im ZDE (ZEOS Database Explorer) kann ich in dieses Feld nur ein Zeichen eintragen. Wenn ich mir die Spalteneigenschaften anschaue, steht da auch Typ: TEXT, Länge: 1.

Ist das TEXT/NCHAR-Feld nicht äquivalent mit dem MEMO-Typ? Wie kann ich da ein Textfeld abspeichern? Per BLOB?

Hansa 11. Apr 2008 21:41

Re: [Firebird] TEXT Feld füllen?
 
Was ist ein NCHAR ? :shock: Memo (Delphi) = Textblob (Blob Subtype ???)

Nuclear-Ping 11. Apr 2008 21:42

Re: [Firebird] TEXT Feld füllen?
 
Die Datenbankstruktur hab ich per ZDD (ZEOS Database Explorer) erstellt und mir ein Script generieren lassen. Bei der Erstellung konnte ich halt als "String"-Felder "VARCHAR" und "NCHAR" wählen. Wobei mir bei VARCHAR ein Feld "Length" angeboten wurde, bei NCHAR nicht (ausgegraut / deaktiviert). Daher ging ich einfach davon aus, dass NCHAR wohl MEMO entspricht. :gruebel:

[edit]
Wenn ich dass Address-Feld in der CREATE-Query auf TEXT oder TEXTBLOB ändere, meckert er rum, dass er beides nicht kennt.
Zitat:

Specified domain or source column TEXT does not exist
This operation is not defined for system tables.
[/edit]

Thomas Horstmann 11. Apr 2008 22:13

Re: [Firebird] TEXT Feld füllen?
 
Hallo,

in Firebird/Interbase sollte für Text ein "Blob" mit "Subtype" verwendet werden.

SQL-Code:
...
Address   blob sub_type text,
...

Viele Grüsse
Tom

kretabiker 12. Apr 2008 09:07

Re: [Firebird] TEXT Feld füllen?
 
Hi,

NCHARs - das sind doch VARCHARS mit einem "eingebauten" Characterset ISO8859-1, oder? Bei der NCHAR-Definition des Adressfelds fehlt die Längenangabe (synonym zu VARCHARs). Ich vermute mal, dass dann von Firebird automatisch die Länge 1 gesetzt wird.

Für lange Texte wäre ein BLOB mit Subtype 1 (für Text) sicherlich die richtige Wahl. Das sähe dann ungefähr so aus (hier eine Domain, die ich verwende, wenn es um das Abspeichern von einfachen Textmemos unbestimmter Länge geht):

CREATE DOMAIN TMEMO AS Blob sub_type 1;

Allerdings haben Collate Orders auf Blobs keine Auswirkung, so dass das Sortieren schwierig wird.

Greetings

Udo "Kretabiker" Treichel

Nuclear-Ping 12. Apr 2008 09:52

Re: [Firebird] TEXT Feld füllen?
 
Ah, jetzt machts klick! :coder2:

Danke euch beiden. :)

:cheers:


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