AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit Generator
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Generator

Ein Thema von TurboMagic · begonnen am 4. Apr 2024 · letzter Beitrag vom 5. Apr 2024
 
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.856 Beiträge
 
Delphi 12 Athens
 
#1

Problem mit Generator

  Alt 4. Apr 2024, 19:04
Datenbank: Firebird • Version: 5.0 • Zugriff über: FireDAC
Hallo,

in einer Anwendung verwende ich FireDAC mit Firebird 5.0.
Einige Tabellen haben einen generator zur erzeugung des eindeutigen Primärschlüssels und
in der Regel funktioniert das auch.

Ich habe für das Programm Update auch einen Mechanismus geschrieben der mit der alten
Version der Software zuerst ein transparentes Backup anlegt. Die neue Version der Software
findet das und stellt es unter einem anderen Dateinamen wieder her. Danach werden die Inhalte
aus dieser Datei mittels FDBatchMove in die von der neuen Programmversion mitgelieferte
Datenbankdatei übernommen. Und es werden die Werte der Generatoren übernommen.

Nun habe ich festgestellt, dass es danach für den jeweils ersten Versuch einen neuen Satz zu
einer der Tabellen die einen generator benutzen hinzuzufügen mit einer Verletzung des
Primärschlüssels knallt:

"[FireDAC][Phys][FB]violation of PRIMARY or UNIQUE_KEY constraint "INTEG_104" on table
"MY_FAILURELIST". Problematic key value is ("FAILURE_ID" = 227).

Schaue ich mir die DB vor dem ersten Schreibzugriff an stelle ich fest, dass der Wert des
betreffenden Generators auf 227 steht. Schaue ich mir die Tabelle an gibt es auch schon
einen Eintrag mit 227 als Schlüsselwert.

Woher kommt das? Bei Späteren Schreibzugriffen werden scheinbar problemfrei Datensätze erzeugt...

Der Trigger in der DB ist so definiert:
Code:
CREATE TRIGGER BI_KASSE_TSE_FAILURE_ID FOR KASSE_TSE_FAILURES
ACTIVE BEFORE
  INSERT
POSITION 0
AS
BEGIN
  IF (NEW.FAILURE_ID IS NULL) THEN
      NEW.FAILURE_ID = GEN_ID(KASSE_FAILURE_ID_GEN, 1);
END;
Hier der Code der in diese Tabelle schreibt:
Delphi-Quellcode:
function TFailureLog.AddEntry(FailureType : TFailureType;
                              FailureCode : Int32;
                              const FailureText : string): Integer;
var
  FailureTypeStr : string;
begin
  Result := -1;

  if not self.FSuppressLogging then
  begin
    try
      FailureTypeStr := ConvertFailureTypeToString(FailureType);


      // Relevant, damit FireDAC beim Append später nicht wegen dem noch leeren
      // Primärschlüssel meckert.
      FQuerySave.UpdateOptions.AutoIncFields := 'FAILURE_ID';

      FQuerySave.SQL.Text := 'select FAILURE_ID, DEVICE_ID, FAILURE_TYPE, ' +
                             'FAILURE_CODE, FAILURE_TEXT, FAILURE_REMARK ' +
                             'from KASSE_TSE_FAILURES';

      FQuerySave.Open;
      FQuerySave.Append;

      FQuerySave.FieldByName('DEVICE_ID').AsInteger := FCurrentDEVICEID;
      FQuerySave.FieldByName('FAILURE_TYPE').AsString := FailureTypeStr;
      FQuerySave.FieldByName('FAILURE_CODE').AsInteger := FailureCode;
      FQuerySave.FieldByName('FAILURE_TEXT').AsString := FailureText;
      FQuerySave.FieldByName('FAILURE_REMARK').AsString := '';

      FQuerySave.Post;

      Result := FQuerySave.FieldByName('FAILURE_ID').AsInteger;
      FQuerySave.Close;
    except
      On e:Exception do
        log.SendException(cCategory, 'Fehler beim Speichern eines Fehlerlog '+
                                     'Eintrags: ' + e.Message, e);
    end;
  end;
end;

Geändert von TurboMagic ( 4. Apr 2024 um 19:09 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz