Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Transaction? (https://www.delphipraxis.net/49161-transaction.html)

HomerGER 6. Jul 2005 12:05

Datenbank: MSSQl • Zugriff über: OleDb

Transaction?
 
Hallo
meine SP in der DB sieht so aus
Delphi-Quellcode:
CREATE PROCEDURE GFC_M_INSERT
   @GFC_M_ID int output,
   @GFC_M_NAME nvarchar(100),
   @GFC_M_AKTIV bit,
   @GFC_M_OUT bit,
   @GFC_M_USER_NAME nvarchar(50),
   @GFC_M_USER_TXT ntext,
   @GFC_M_USER_DATE smalldatetime
AS
SET NOCOUNT ON

INSERT INTO [GFC_Medien]
(
         [GFC_M_NAME],
         [GFC_M_AKTIV],
         [GFC_M_OUT],
         [GFC_M_USER_NAME],
         [GFC_M_USER_TXT],
         [GFC_M_USER_DATE]
)
VALUES
(
         @GFC_M_NAME,
         @GFC_M_AKTIV,
         @GFC_M_OUT,
         @GFC_M_USER_NAME,
         @GFC_M_USER_TXT,
         @GFC_M_USER_DATE
)

SET @GFC_M_ID = @@IDENTITY
GO
meine Insert anweisung in Delphi
Delphi-Quellcode:
//Insert
  //Insert Command
  ins_cmd := OleDbCommand.Create();
  ins_cmd.CommandType := CommandType.StoredProcedure;
  ins_cmd.CommandText := 'GFC_M_INSERT';
  ins_cmd.Connection := gf_conn;

  ins_cmd.Parameters.Clear;
  ins_cmd.Parameters.Add('@GFC_M_NAME', OleDbType.VarWChar, 100, 'GFC_M_NAME');
  ins_cmd.Parameters.Add('@GFC_M_AKTIV', OleDbType.Boolean, 1, 'GFC_M_AKTIV');
  ins_cmd.Parameters.Add('@GFC_M_OUT', OleDbType.Boolean, 1, 'GFC_M_OUT');
  ins_cmd.Parameters.Add('@GFC_M_USER_NAME', OleDbType.VarWChar, 50, 'GFC_M_USER_NAME');
  ins_cmd.Parameters.Add('@GFC_M_USER_TXT', OleDbType.LongVarWChar, 16, 'GFC_M_USER_TXT');
  ins_cmd.Parameters.Add('@GFC_M_USER_DATE', OleDbType.DBTimeStamp, 4, 'GFC_M_USER_DATE');

  ins_par := ins_cmd.Parameters.Add('@Identity', OleDbType.Integer, 4, 'ID');
  ins_par.Direction := System.Data.ParameterDirection.Output;
  ins_par.SourceColumn := 'ID';
  ins_par.SourceVersion := DataRowVersion.Current;
wie kann ich jetzt sicher sein das meine Daten auch eingetragen werden (Stromausfall)
mit Transaction? aber wie und WO?
Wann setze ich ein Commit und wann ein Rollback?

Homer

Hansa 6. Jul 2005 12:26

Re: Transaction?
 
Commit : speichern in DB

Rollback : alles rückgängig machen, was seit dem Start der Transaction an der Datenbank geändert wurde.

Wichtig ist also im Prinzip nur, wann und durch welche Aktion die Transaktion gestartet wurde. Ich habe z.B. 2 Buttons "speichern" und "Eingaben stornieren". Beim ersten steckt ein Commit dahinter, bei dem anderen ein Rollback.

HomerGER 6. Jul 2005 13:34

Re: Transaction?
 
@Hansa
Du machst es manuel (Button)

ich wollte es automatischen machen

Keine Fehler Commit
Fehler (Stromausfall) Rollback

Ich wollte es irgendwie in die SP einbauen

der hintergrund ist
wenn du in mehrer Tabellen was eintragen willst
und beim Übertragen der Daten die Vindung unterbrochen wird
hast du Müll in der Datenbank

Hansa 6. Jul 2005 15:53

Re: Transaction?
 
Weiß jetzt nicht genau, was Du meinst. 8) Aber Transactions sind doch genau für solche Fälle gedacht, um eben zu verhindern, daß Teilergebnissse (wie Du sagst : Müll) abgespeichert werden.

Es geht dabei um das Prinzip : Alles oder Nichts ! Aber wie soll ich nun auf einen Stromausfall reagieren, und noch dazu automatisch ? :shock:

Selbst mit einem Timer würden automatische Commits nicht viel nützen, weil garantiert der Strom mitten in dem Zeitintervall ausfällt. So ist das nach Murphy eben immer ! :mrgreen:

Deshalb bei mir der Button. Ist einer zu blöd den zu betätigen, weil er auf einen Stromausfall wartet, tja dann hat er eventuell Pech. Allerdings sollte die Datenbank auch merken, daß eine Transaktion nicht commited wurde. Kann mir kaum vorstellen, daß das bei MS-SQL nicht geht.

Robert_G 6. Jul 2005 16:02

Re: Transaction?
 
Eine unterbrochene Verbindung *innerhalb* einer Transaktion wird dazu führen, dass diese *nicht* abgelegt wird.

btw: Gibt es einen besonderen Grund warum du sowas mittelalterliches wie den OleDB Provider nimmst? :gruebel:
Für den Sql Server solltest du dir mal den namespace SqlClient ansehen. :zwinker:

Hansa 6. Jul 2005 16:22

Re: Transaction?
 
Robert_G versteht das da wohl genauso wenig wie ich. Was ich meine ist, die Transaction lieber vom Programm steuern zu lassen, als genau um 17:00 zu committen. Hat der jetzt seine ganzen 20 Seiten Inventur eingegeben und ist zu dämlich auch mal zu speichern, dann bin ich zumindest sicher, daß von der Inventur absolut gar nichts in der DB ist ! Hat er 19 Seiten eingegeben, dann muß er trotzdem wieder komplett neu anfangen. 8) Bin leider 100 km weg und kann es nicht testen. Aber glaube bei einem Crash-Test mit Firebird kam die Meldung "es ist noch eine offene Transaktion da, was soll damit gemacht werden (Commit oder Rollback ?" (sinngemäß)

HomerGER 6. Jul 2005 17:30

Re: Transaction?
 
Hi
mein Fehler
Stromausfall ist mist

Beispiel

Aus einer Tabelle soll eine Bezahlung erfolgen
In einer anderen soll die Zahlung eingehen.

Ich starte jetzt mein Update in meinem Programm und nun wird die Verbindung unterbrochen.

...
kurzform
wert1 aus Table11 Feld1 auf 0

<------ Verbindung unterbrochen

wert1 in Tabel2 Feld1 eintragen
...

Aus der Tabelle ist zwar die Zahlung ausgegangen aber nicht mehr in die andere Tabelle die Zahlung eingegangen.

Wenn ich das mit den Trasaction richtig verstanden habe....
ich wollte es in einer SP packen
Die Datenbank schreibt bei Trasaction begin noch nicht endgültig in die Datenbank erst wenn alle befehle abgearbeitet sind kommt das Commit sonst das Rollback
und ich weiß jetzt nicht wie ich es in meine SP eintragen soll oder überprüfen kann

Albi 6. Jul 2005 19:11

Re: Transaction?
 
Hallo,

vielleicht hilft dir dieser Beitrag weiter.

Hier ging zwar um Transactionen und Interbase aber das sollte auch auf MySQL anwendbar sein. Vielleicht hilft es Dir ja weiter.

Warum willst Du das unbedingt über die StoredProc regeln, die DB selber nimmt Dir doch diese Arbeit ab? Darher würde ich schon das ganze über das Programm regeln.

HomerGER 6. Jul 2005 19:22

Re: Transaction?
 
Hi
es geht um MSSQL :-)

leider nicht sehr geholfen
da das Trasaction immer vom Programm aus gestartet wird
ich will es aber über eine SP starten

ich weiß jetzt nicht ob das so richtig ist
da ich es nicht testen kann
Delphi-Quellcode:
CREATE PROCEDURE GFC_M_INSERT
   @GFC_M_ID int output,
   @GFC_M_NAME nvarchar(100),
   @GFC_M_AKTIV bit,
   @GFC_M_OUT bit,
   @GFC_M_USER_NAME nvarchar(50),
   @GFC_M_USER_TXT ntext,
   @GFC_M_USER_DATE smalldatetime
AS
SET NOCOUNT ON

BEGIN TRANSACTION

   INSERT INTO [GFC_Medien]
   (
      [GFC_M_NAME],
      [GFC_M_AKTIV],
      [GFC_M_OUT],
      [GFC_M_USER_NAME],
      [GFC_M_USER_TXT],
      [GFC_M_USER_DATE]
   )   
   VALUES
   (
      @GFC_M_NAME,
      @GFC_M_AKTIV,
      @GFC_M_OUT,
      @GFC_M_USER_NAME,
      @GFC_M_USER_TXT,
      @GFC_M_USER_DATE
   )

   SET @GFC_M_ID = @@IDENTITY

IF (@@ERROR = 0)
    COMMIT TRANSACTION
ELSE
       ROLLBACK TRANSACTION

GO

HomerGER 6. Jul 2005 19:28

Re: Transaction?
 
Zitat:

Zitat von Albi
Warum willst Du das unbedingt über die StoredProc regeln, die DB selber nimmt Dir doch diese Arbeit ab? Darher würde ich schon das ganze über das Programm regeln.

????
wenn mir es die DB schon übernimmt warum soll ich es dann noch mal im Programm machen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 Uhr.
Seite 1 von 2  1 2      

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