![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos 6.5.1
Autowerte bei Firebird setzen
Hallo,
ich bastel gerade an einem Programm, dass über die Zeos-Komponenten auf einen Firebird-Server zugreift. Nun habe eine Tabelle in meiner FB-Datenbank, die über ein Feld "ID" verfügt. Dieses Feld ist primärer Index und als "autoinc" definiert. Wenn ich nun einen Datensatz speichern will (über den Navigator), erhalte ich die Fehlermeldung, dass der Insert-Befehl gescheitert wäre. Wenn ich dann über ein DBEdit-Feld einen Wert für ID eintrage, klappt der Insert. Dabei sollte doch ein Autowert automatisch gesetzt werden, oder? Für das Feld ID hat IBExpert noch einen Generator angelegt, der wohl für diese AutoInc-Sachen zuständig ist. Muss ich den irgendwie anstoßen/ausführen? Wenn ja, wie? Gruß Frank |
Re: Autowerte bei Firebird setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Schau mal nach, ob es bei den Zeos auch so was gibt. André |
Re: Autowerte bei Firebird setzen
Hallo André,
hab nachgesehen, es gibt für das einzelne Feld über den Feldeditor der ZTable-Komponente die Eigenschaft "AutoGenerateValue", aber wenn ich die auf "arAutoInc" setze, erhalte ich trotzdem die gleiche Fehlermeldung. Gruß Frank |
Re: Autowerte bei Firebird setzen
Als ich das letzte mal mit Firebird gearbeitet habe (war gerade die 1.0 frisch raus) gabe es sowas wie ein "autoinc" Flag garnicht. Stattdessen musste man sich ein Konstrukt aus einem Trigger und einer Sequenz basteln wobei die Sequenz die ID hochzählt und der Trigger diese einfügt.
Daher meine Frage: Wie hast Du das Feld als autoincrement definiert? Falls die 1.5 Firebird o.g. Konstrukt nicht mehr benötigt vergiss alles was ich gesagt habe :) Bis neulich ... |
Re: Autowerte bei Firebird setzen
Hallo Grendel,
ich hab die Datenbank und die Tabellen mit IBExpert erzeugt. Dort kann man in dem Dialog zur Tabellengenerierung "autoinc" ankreuzen. Aufgrund dieser Angabe erzeugt IBExpert dann einen sog. Generator mit einem definierten Startwert. Allerdings weiss ich nicht, ob ich den Generator extra ansprechen muss, da ja z. B. beim ADS oder bei der BDE Autoinc-Felder automatisch hochgezählt werden, hier passiert allerdings nix. Natürlich kann ich mir mit "SELECT MAX..." den höchsten Wert aus der Tabelle holen und um 1 erhöhen, aber dann bräuchte ich kein Autoinc.... Gruß Frank |
Re: Autowerte bei Firebird setzen
Hallo,
dann erzeuge doch einfach noch den passenden Trigger dazu und du brauchst dich um die Erstellung nicht mehr zu kümmern, da die DB das für dich erledigt.
SQL-Code:
AS
BEGIN IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(DB_Name_ID_GEN, 1); END |
Re: Autowerte bei Firebird setzen
Hallo Albi,
ist ja schön und gut, aber wozu brauche ich dann die "AutoInc"-Definition? Und wie nutze ich die? Gruß Frank |
Re: Autowerte bei Firebird setzen
Hallo Frank,
eine Möglichkeit zur "automatischen" Vergabe von ID für deine Tabelle TBL unter Verwendung eines Generators ist ein Trigger, wie er im Handbuch steht. Ich gehe davon aus, dass der Generator so heißt wie die Tabelle.
SQL-Code:
Ich habe immer einen solchen Trigger - und benutze ihn dann nicht. Der Trigger dient bei mir nur der Unterstützung von bulk-load Operationen. Den ID für single record inserts hole ich mir vom Generator und setze ihn in der Anwendung. Auf diese Weise habe ich die ID für meinen Programm-Kontext. Echte AutoInc-Felder machen bei primary key Feldern mehr Probleme als Freude.
CREATE TRIGGER "TBL_BI0" FOR "TBL"
ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id = 0) then new.id = gen_id(TBL, 1); end Grüße vom marabu |
Re: Autowerte bei Firebird setzen
Hallo,
Du sagst damit nichts weiter wie das ein Generator erzeugt wird. Diesen kannst Du entweder selber in der StoredProcedure machen über
SQL-Code:
Oder Du erzeugst noch den passenden Trigger, dann kannst Du dir in der SP eben das Feld ID sparen. Und die DB kümmert sich um die Vergabe der DB.
...
... Insert Into DB (ID,...,...) Values (gen_ID(DB,1),...,...) Welche Vorteile oder Nachteil das hat, kann ich dir auch nicht sagen. Aber ich bevorzuge immer die Variante mit den Trigger (wahrscheinlich aus Bequemlichkeit :-D ) |
Re: Autowerte bei Firebird setzen
Hallo,
ich habe mittlerweile einen möglichen Grund gefunden. Wenn man im IBExpert eine Tabelle anlegt, kann man auch ein Feld als AutoInc definieren. IBExpert erzeugt dann einen Generator und verknüpft ihn dann mit dem Feld. Allerdings scheint IBExpert die Verbindung nicht in der Datenbank zu speichern, da beim Bearbeiten der Tabelle die entsprechende Checkbox leer ist. Weist man nun erneut den bereits definierten Generator zu und speichert ab, so ist bei erneutem Öffnen der Feldeigenschaften die Checkbox wieder leer (nicht gesetzt). Also werd ich wohl einen Trigger einbauen, der beim Insert das Feld ID um eins erhöht. Danke für Eure Antworten. Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 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