FirebirdEmbedded Primärschlüsselfeld wird nicht gefüllt.
-
Dummerweise hat das Feld diese Eigenschaft!
-
Dumemrweise kennt Firebird kein 'AutoInc'. Wie ein kurzer Blick in die Doku auch gezeigt hätte.
In Firebird verwendet man Generatoren.
-
Sorry, der SQL Manager 2005 tut so als gäbe es die Autoinkrementierung.
Anscheinend nutzt er dann aber einfach den Generator.Also muss ich die Frage überarbeiten.
Wie sorge ich dafür, das der Generatur benutzt wird um die ID-Nummer zu erzeugen.
Danke!
-
z.B. so :
CREATE TRIGGER T_MeineTabelle_BI FOR T_MeineTabelle ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.PK IS NULL) THEN NEW.PK = GEN_ID(GEN_T_MeineTabelle_ID,1); END
-
Der entsprechende Generator ist vorhanden.
Trotzdem im SQL-Manager wird er offensichtlich auch benutzt.Mein Programm verursacht aber leider keine Inkrementierung.
-
Hi,
wirklich prüfen, dass der Generator und ein Trigger vorhanden sind. Der Trigger sorgt bei einem Insert, dass das Feld automatisch gefüllt wird.
Wie willst Du denn die Daten in die Tabelle schreiben?
VG Pixfreak
-
Dein Problem ist wahrscheinlich,
dass TIBDataset o.ä. benutzt und diese Komponente natürlich erstmal nichts von dem
neuen getriggerten PK mitbekommt, weil dass ja alles nur auf dem Server passiert.Nun gib es zwei Möglichkeiten.
Erzeuge auf der DB eine StoredProcedure (SP),welche den Generator aufruft und den neuen PK liefert.
Rufe diese SP aus deinem Programm auf (z.B. mit IBQuery)
Holen den neuen PK und setze diesen PK in deinem Dataset.oder
Benutze andere Komponenten, welche diese Funktionalität schon bereit stellen (z.B. FIBPlus, ist aber leider nicht kostenlos
)
-
alternativ funktioniert zumindest bei IBTable folgende Variante, hierbei gibt es auch einen in der Datenbank angelegten Generator und Trigger wie ja hier schon beschrieben, zusätzlich muß jetzt nur der folgende Codeausschnitt für die verwendete Komponente (hier IBTable) verwendet werden:
void __fastcall TForm1::IBTable1AfterInsert(TDataSet *DataSet) { IBTable1->FieldByName("lfdNr")->AsInteger = 1; }der Wert der hierbei gesetzt wird ist nicht wichtig, da die Datenbank beim Insert dann doch noch die Incrementierung auslöst. Aber wahrscheinlich sollte der Wert nicht auf 0 gesetzt werden...
-
Danke!
Der Tipp war hilfreich.
Aber sollte es nicht ohne solche "Tricks" gehen?
-
in dem Fall anscheinend nicht, diesen Trick habe ich übrigens aus einem der gängigen Bücher über Interbase und Delphi und scheint somit notwendig zu sein

-
Ja, aber auch nur, weil eine Table-Komponente verwendet wird.
Bei einer Dataset-Komponente muss man das Feld einfach nur aus der Update- und Insert-Anweisung herauslassen. Mit den IB-Komponenten habe ich es allerdings nicht getestet, da ich diese nicht für Firebird geeignet halte. Zumindest ab FB 1.5 gilt: DML funktioniert, DDL funktioniert überhaupt nicht.
Zur Verwendung von Table-Komponenten sag ich erst gar nix.
