Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Insert erst beim schließen (https://www.delphipraxis.net/139008-insert-erst-beim-schliessen.html)

Tobinator 21. Aug 2009 16:11

Datenbank: Firebird • Version: 2.1 • Zugriff über: IB

Insert erst beim schließen
 
Hi,

ich bin Neuling und habe ein Problem:
Ich will Daten in eine Firebird-DB einfügen und das klappt nicht so richtig. Hier mein Code:
Code:
    DS_Vorgang.Open;
    DS_Vorgang.Insert;
    DS_Vorgang.FieldByName('Vorgangsnummer').AsString:=s;
    DS_Vorgang.FieldByName('Datum').AsDateTime:=Date;
    DS_Vorgang.FieldByName('Art').asinteger:=2;
    DS_Vorgang.FieldByName('Kunde').AsString:=FRech.LKdNr.Caption;
    DS_Vorgang.FieldByName('TauschApfelKg').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschApfelL').AsInteger:=GesGHA;
    DS_Vorgang.FieldByName('AufkaufA').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschQuitteKg').AsFloat:=0;
    DS_Vorgang.FieldByName('TauschQuitteL').AsInteger:=GesGHQ;
    DS_Vorgang.FieldByName('AufkaufQ').AsFloat:=0;
    DS_Vorgang.FieldByName('BetragNetto').AsFloat:=Sum;
    DS_Vorgang.FieldByName('BetragBrutto').AsFloat:=Sum-SumS;

    DS_Vorgang.Post;
Das wenn ich später mit diesen Daten arbeiten will, kann ich nicht drauf zugreifen (also die gibt's angeblich nicht) und auch mittels IB Expert sind sie in der DB nicht zu sehen. Erst, wenn ich mein Programm schließe, sind die Daten zu sehen. Sie werden also sozusagen erst beim schließen eingefügt.

Kann mir jemand sagen, was ich falsch mache??
Danke schonmal...

mkinzler 21. Aug 2009 16:27

Re: Insert erst beim schließen
 
FireBird arbeitet mit Transaktionen. Du scheinst AutoCommit aktiviert zu haben, deshalb wird beim Schliessen vom Programm die Transaktion abgeschlossen ( Commit). Hättest du das nicht, würden die Änderungen verworfen.
Vor einem Commit/RollBack sind die Änderungen nur innerhalb des Transaktionskontext oder bei dirty read sichtbar.
Ich würde in deinem Fall den Insert in einen eigenen Transaktionskontext einpacken.

Tobinator 21. Aug 2009 17:24

Re: Insert erst beim schließen
 
Danke für die Antwort.

Bei meinem DataSet steht bei DefaultAction TACommit.

Wie packe ich das denn in einen eigenen Transaktionskontext?
(Ich bin wie gesagt ein Neuling was Datenbanken angeht :) )

mkinzler 21. Aug 2009 17:32

Re: Insert erst beim schließen
 
Lege zusätzlich eine TIBTransaction auf das Formular und wähle diese im DataSet aus.
Nun kannst du mit
Delphi-Quellcode:
<Transaktion>.StartTransaction;
die Tranaktion starten und mit
Delphi-Quellcode:
<Transaktion>.Commit;
abschliessen bzw. mit
Delphi-Quellcode:
<Transaktion>.Rollback;
verwerfen

khh 21. Aug 2009 18:30

Re: Insert erst beim schließen
 
Zitat:

Zitat von mkinzler
Lege zusätzlich eine TIBTransaction auf das Formular und wähle diese im DataSet aus.
Nun kannst du mit
Delphi-Quellcode:
<Transaktion>.StartTransaction;
die Tranaktion starten und mit
Delphi-Quellcode:
<Transaktion>.Commit;
abschliessen bzw. mit
Delphi-Quellcode:
<Transaktion>.Rollback;
verwerfen



wobei meiner Meinung nach die Trennung von der DB nach dem Post den selben Eeffekt hat.

Oder gibts da betreffs Zugriffszeit Unterschiede, oder welche Nachteile siehst du gegenüber der Transaktion?

mkinzler 21. Aug 2009 18:36

Re: Insert erst beim schließen
 
Das Trennen schliesst die Tranaktion auch ab oder verwirft sie ( je nach Einstellung). Aber es ist nicht notwendig.
Mit Auschalten eines Motors kann man ja auch Bremsen.

hoika 21. Aug 2009 18:37

Re: Insert erst beim schließen
 
Hallo,

jedes Re-Connect dauert etwas.


Heiko

Tobinator 21. Aug 2009 19:16

Re: Insert erst beim schließen
 
Hi,

danke für die Antworten, aber ich glaub ich verstehs noch nich so richtig. Es ist immernoch der selbe Fehler.

Also ich hab jetzt auf dem einen From je einmal IBDataSet, IBTransaction und IBDatabase.

IBDataSet1 (in meinem code vorhin DS_Vorgang)
Database = IBDatabase1
Transaction = IBTransaction1

IBTransaction1
DefaultAction = TACommit
DefaultDatabase = IBDatabase1

IBDatabase1
DefaultTransaction = IBTransaction1

Code:
  IBTransaction1.StartTransaction;
  IBDataSet1.Open;
  IBDataSet1.Insert;
  IBDataSet1.FieldByName ....
  .... // Felder füllen
  IBDataSet1.Post;
  IBTransaction1.Commit;
Es wird wieder erst beim schließen in die DB eingefügt.

Was soll ich noch ändern??

mkinzler 21. Aug 2009 19:21

Re: Insert erst beim schließen
 
Und wie siehst du, das es erst bei Programmende eingefügt wird?

Tobinator 21. Aug 2009 20:11

Re: Insert erst beim schließen
 
ich gucke nebenbei mit IB Expert in die DB rein. (Ich habs auch zwischendurch immer wieder geöffnet und geschlossen, in der Hoffnung, das es sich aktualisiert, aber es passiert nix).
Mein grundsätzliches Problem ist eigentlich, das ich mit Fastreport auf einem anderen Form damit einen Report erzeugen möchte, aber der bleibt immer leer. Wenn ich das mit einem älteren Datensatz probiere, klappt es problemlos. Das programm muss zwischendurch immer einmal geschlossen werden. Das will ich aber nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
Seite 1 von 3  1 23      

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