FirebirdEmbedded Primärschlüsselfeld wird nicht gefüllt.



  • 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. 😉


Anmelden zum Antworten