![]() |
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:
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Nut bei der Table-Komponente oder grundsätzlich?
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Zumindest auch bei der FIBPlus DataSet-Komponente von Devrace....
Delphi-Quellcode:
Schließt alle an der Transaktion hängenden DataSets....
Transaction.Commit
Delphi-Quellcode:
Lässt die DataSets offen... ist aber imho kein gelungener Programmierstil
Transaction.CommitRetaining
Edith gratuliert mkinzler zu über 10.000 Beiträgen. |
Re: [Firebild] Änderungen nach Insert gehen verloren
Zitat:
|
Re: [Firebild] Änderungen nach Insert gehen verloren
und es ist generell so, dass durch ein COMMIT oder ein Rollback sämtliche Datenmengen, die von der Transaction betroffen sind, geschlossen werden.
Gruß onlinekater |
Re: [Firebild] Änderungen nach Insert gehen verloren
Zitat:
|
Re: [Firebild] Änderungen nach Insert gehen verloren
Hi,
Eine Transaktion ist in erster Linie eine "Sicht" auf die Daten. Ein Select-Statements ist genauso an eine Transaktion gebunden wie ein Insert/Update/Delete. Die Datenmenge eines Select-Statements ist damit nur solange existent wie die Transaktion besteht. Habe ich innerhalb ein und der selben Transaktion eine offene Datenmenge in Form eines TIBDataSet/TIBTable und setzte ein Insert/Update/Delete-Stetment ab, welches durch ein Commit bestätigt wird, so ist die Transaktion beendet. Damit ist auch Datenmenge im TIBDataSet/TIBTable nicht mehr gültig und TIBDataSet/TIBTable werden geschlossen. Das gilt für alle Komponenten. Zitat:
Für einen neuen Datensatz benötigts du die ID natürlich noch vor dem Insert. Wie das geht, siehe ![]() Zitat:
Die Schreib-Transaktion ist nur für den Moment des Scheibens aktiv und wird sofort mit einem HardCommit bestätigt. CommitRetaining wird NICHT verwendet. Das DataSet ist weiter offen da es unter der Lese-Tranaktion läuft. alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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-2025 by Thomas Breitkreuz