![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: IBX, TIBTable
[Firebild] Änderungen nach Insert gehen verloren
Hallo ich habe folgendes Problem: In einer Tabelle wird mit Insert ein neuer Kunde angelegt und einge Felder werden ausgefüllt. Die Daten werden mit Post gespeichert. Nun wird die Kundentabelle in den Edit-Modus versetzt und ein Feld geänder und mit Post gespeichert. Die Änderung wird in TDBEdits auch angezeigt. Wenn ich nun zu einem anderen Datensatz scrolle und wieder zum geänderten Datensatz zurück, sind die Änderungen immer noch sichtbar. Wird die Anwendung nun beendet und neu gestartet, ist der neue Kunde zwar da, aber die letzten Änderungen sind verschwunden. Dies passiert nur, wenn der Kunden mit Insert neu eingefügt wurde.
Beispielcode:
Delphi-Quellcode:
Kunden ist die TIBTable-Komponente. Diese ist mit einer TIBTransaction verknüpft. Die Einstellungen dieser sind:
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123; Kunden.FieldByName('Name').AsString := 'Schneider'; Kunden.Post; Kunden.Edit; Kunden.FieldByName('Firma').AsString := 'EineFirma'; //Diese Änderung verschwindet nach Programmende Kunden.Post; DefaultAction:TACommitRetaining Params: (Commited lesen) read_committed rec_version nowait Vielen Dank für eure Hilfe im Voraus! |
Re: [Firebild] Änderungen nach Insert gehen verloren
Anscheinend wird aper die Transaktion nicht comitted. Sorge mal manuell dafür.
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Liegt es wirklich am fehlenden Commit? Dann müssten ja alle Daten nicht da sein. Es fehlen aber nur die letzten Änderungen. Ich hab mal was getestet:
Delphi-Quellcode:
Mit dem oberen Code ist das Resultat, das selbe: Die letzten Änderungen verschwinden!
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123; Kunden.FieldByName('Name').AsString := 'Schneider'; Kunden.Post; Kunden.Edit; Kunden.FieldByName('Firma').AsString := 'EineFirma'; Kunden.Post; Transaction.Commit; //<--- NEU |
Re: [Firebild] Änderungen nach Insert gehen verloren
Ein zweiter Test:
Delphi-Quellcode:
Nun sind die Änderungen zwar nach Programmende vorhanden. Es ergeben sich aber zwei neue Probleme: Das ganze sind nun zwei Transaktionen. Ich möchte aber nur eine haben, da es entwender komplett oder gar nicht eingetragen werden soll. OK, zur not könnte ich damit leben, wenn es gar nicht änders geht, aber schön ists nicht. Problem zwei: Den ausgewälten Datensatz über die RecNo wiederzufinden ist fehleranfällig, weil sich nach dem Commit die RecNo geändert haben könnte, wenn ein anderer User einen neuen Datensatz in die DB einfügt. Wie kann ich denn den vor Commit ausgewählten Datensatz nach dem Commit mit 100%iger Sicherheit wieder anspringen?
Kunden.Insert;
Kunden.FieldByName('KdNr').AsInteger := 123; Kunden.FieldByName('Name').AsString := 'Schneider'; Kunden.Post; OldRecNo := Kunden.RecNo; Transaction.Commit; Kunden.Active := true; Kunden.RecNo := OldRecNo; Kunden.Edit; Kunden.FieldByName('Firma').AsString := 'EineFirma'; Kunden.Post; |
Re: [Firebild] Änderungen nach Insert gehen verloren
Dann mußt du einen anderen Isolationslevel für die Transaktion nehmen und die se manuell Startne und committed/verwerfen.
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Zitat:
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Ist das bei IBX der Fall? Normalerweise hat ja eine Transaktion nicht mit der Connection zu tun.
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Zitat:
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Die Tranaktion dürfte eigentlich keine Wirkung auf das Aktiv-sein eines DataSets haben. Allerdings würde ich auch keine Table-Komponente nehmen.
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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 by Thomas Breitkreuz