Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi IBTable funktioniert nicht mit Not-NULL Generator Feld (https://www.delphipraxis.net/158457-ibtable-funktioniert-nicht-mit-not-null-generator-feld.html)

ralfiii 18. Feb 2011 12:00

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

IBTable funktioniert nicht mit Not-NULL Generator Feld
 
Hallo!
Ich hab hier eine Firebird-Tabelle die wie folgt definiert ist:

Code:
CREATE TABLE USERS (USER_ID INTEGER NOT NULL,
        NAME VARCHAR(30) NOT NULL,
        FOO SMALLINT,
CONSTRAINT PK_USERS PRIMARY KEY (USER_ID),
CONSTRAINT UNQ_USERS UNIQUE (NAME));

SET TERM ^ ;
CREATE TRIGGER USERS_BI FOR USERS
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (NEW.USER_ID IS NULL) THEN
    NEW.USER_ID = GEN_ID(GEN_USER_ID,1);
END ^
COMMIT WORK ^
SET TERM ; ^
d.h. das Feld "User_ID" is sowas wie ein AutoInc-Feld. Man brauch sich da nicht kümmern, man kann einfach ein Insert machen, in dem nur das Feld "Name" gesetzt wird, firebird füllt selber das User_Id aus.

Häng ich nun ein IBTable da dran und will die Tabelle über den IBTable befüllen krieg ich eine Fehlermeldung "Feld 'USER_ID' muss einen Wert haben".

???

shmia 18. Feb 2011 12:13

AW: IBTable funktioniert nicht mit Not-NULL Generator Feld
 
Die VCL weiss nicht, dass der Inhalt automatisch durch einen Datenbanktrigger befüllt wird.
Versuche mal, das Property AutoGenerateValue des Felds zu setzen:
Delphi-Quellcode:
procedure TForm1.Query1AfterOpen(Dataset:TDataset);
begin
  Dataset.FieldByName('USER_ID').AutoGenerateValue := arAutoInc;
end;

ralfiii 18. Feb 2011 12:20

AW: IBTable funktioniert nicht mit Not-NULL Generator Feld
 
Zitat:

Zitat von shmia (Beitrag 1082634)
Die VCL weiss nicht, dass der Inhalt automatisch durch einen Datenbanktrigger befüllt wird.
Versuche mal, das Property AutoGenerateValue des Felds zu setzen

Ok, ich dachte die Fehlermeldung kommt von Firebird.
Warum kümmert sich die VCL überhaupt darum?!? Und: Wie kann ich ihr das abgewöhnen?

Delphi-Quellcode:
     ... <Gleich beim Start des Programmes, nach dem Verbinden zu Datenbank>
     IBTable1.Open;
     IBTable1.FieldByName('USER_ID').AutoGenerateValue := arAutoInc;
Fehlermeldung: IBTable1: Operation bei geöffneter Datenmenge nicht ausführbar

DelphiBandit 18. Feb 2011 12:23

AW: IBTable funktioniert nicht mit Not-NULL Generator Feld
 
Wenn Dein AutoInc-Feld, war ja meist der Fall ist, zufällig das erste Feld innerhalb Deines SQL ist kannst Du diesem Problem mit
Code:
sqlQuery.Fields[0].Required := False;
beikommen. Zumindest bei IBObjects ohne Probleme. Wenn Du eine statische Feldliste benutzt, also innerhalb der IDE einsehbar, dann kannst Du diesen Wert auch dort setzen. Obwohl ich gerade sehe IBTable, aber nun ja, Versuch ist es wert.

ralfiii 18. Feb 2011 12:35

AW: IBTable funktioniert nicht mit Not-NULL Generator Feld
 
Zitat:

Zitat von DelphiBandit (Beitrag 1082638)
Wenn Dein AutoInc-Feld, war ja meist der Fall ist, zufällig das erste Feld innerhalb Deines SQL ist kannst Du diesem Problem mit
Code:
sqlQuery.Fields[0].Required := False;
beikommen.

Genial!!! Danke, das löst das Problem!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf