Gegeben ist eine Datenbank mit einer Tabelle PERSONEN:
Code:
ID_PERSONEN INTEGER NOT NULL,
PERS_ID INTEGER DEFAULT 0 NOT NULL,
PERS_NAME VARCHAR(100) DEFAULT '' NOT NULL COLLATE
UNICODE,
ALTER TABLE PERSONEN ADD CONSTRAINT PK_PERSONEN PRIMARY KEY (ID_PERSONEN);
CREATE UNIQUE INDEX IDX_PERSID ON PERSONEN (PERS_ID);
CREATE UNIQUE INDEX IDX_PERSON_NAME ON PERSONEN (PERS_NAME);
Nun werden dort Namen automatisiert eingetragen, wobei es gelegentlich vorkommt, daß ein Name bereits eingetragen ist. Da für das Feld PERS_NAME ein eindeutiger Index erstellt wurde, führt der Versuch natürlich zu einer
Exception, und zwar beim Post-Befehl.
... eine Exception der Klasse EIBNativeException mit der Meldung '[FireDAC][Phys][FB]attempt to store duplicate value (visible to active transactions) in unique index "IDX_PERSON_NAME"' aufgetreten.
Das ist soweit in Ordnung, weil es abgefangen und in einer Liste dokumentiert wird, wenn ein Name bereits eingetragen ist.
Delphi-Quellcode:
Function TFrame_PersonenAktuell.Eintragen(Id : Integer; Person :
String; Datum : TDateTime; DateExists : Boolean) : Boolean;
begin
Try
DatMod.Qset_Personen.Append;
Feld_Id.AsInteger := Id;
Feld_Name.AsString := Person;
If DateExists
Then
Feld_Datum.AsDateTime := Datum;
DatMod.Qset_Personen.Post;
Result := True;
Except
On E:
Exception Do
Begin
Result := False;
Memo_Log.Lines.Append(e.
Message + GLD.TS + IntToStr(Id));
End;
End;
end;
Das ist so gewollt, denn für den Anwender müssen die zu wählenden Namenseinträge später unterscheidbar sein, weil es außer dem Namen keine weiteren Unterscheidungsmerkmale gibt. Die nicht eingetragenen doppelten Namen werden später gesondert behandelt, aber das ist eine andere Geschichte. Nun aber zu meinem Problem:
Nachdem die erste
Exception korrekt ausgelöst wurde, weil der Name bereits in der Datenbank existiert, folgt der nächste Name, der – von mir extra und aufs genaueste überprüft – tatsächlich noch nicht eingetragen ist. Dennoch löst der Versuch, diesen Namen einzutragen, nun ebenfalls eine
Exception aus, und das – jetzt kommt's! –
bereits beim Aufruf von Append! Ja, ihr habt richtig gelesen: Bereits beim Aufruf von
DatMod.Qset_Personen.Append;
erscheint die o.g. Fehlermeldung. Das verstehe ich jetzt erstmal überhaupt gar nicht. Wie kann ein Append einen
store duplicate value auslösen? Der
DB-Server weiß zu diesem Zeitpunkt doch noch gar nicht, was ihm da reingedrückt werden soll ... also irgendwas stimmt da nicht ...
Wenn ich nun im Fehlerdialog auf
Anhalten drücke, landet der Prozeß-Cursor in der
Unit FireDAC.Stan.Error, und zwar in der Zeile 189:
raise oEx;
Darüber steht was Seltsames als Kommentar:
The monitor client messages queue may be not empty. When an exception is raised and an IDE is stopped, the queue remains not empty and FDMonitor does not show error message. So, give the CPU to other threads. Könnte es sein, daß ich diese
monitor client messages queue (was immer das auch ist) nach einer solchen
Exception erst leeren muß, damit das Programm anschließend wieder ordnungsgemäß arbeitet? Weiß jemand, was hier abläuft?