AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Transaktion (Zähler erhöhen & anschliessendes INSERT)
Thema durchsuchen
Ansicht
Themen-Optionen

Transaktion (Zähler erhöhen & anschliessendes INSERT)

Ein Thema von Fellmer Lloyd · begonnen am 18. Aug 2006 · letzter Beitrag vom 18. Aug 2006
Antwort Antwort
Fellmer Lloyd
(Gast)

n/a Beiträge
 
#1

Transaktion (Zähler erhöhen & anschliessendes INSERT)

  Alt 18. Aug 2006, 09:16
Datenbank: MS SQL • Version: 2005 • Zugriff über: ADO
Hallo Alle!

Ich arbeite mit folgender Datenbank:
- MS SQL 2005 Standard
- Zugriff per ADO (aus VB)

Ich habe zwei Tabellen erstellt.
Die erste (TestCounter) enthält mehrere Zähler, allerdings ist nur einer relevant.
http://nathan-systems.ch/images/TabelleCounter.gif

Die zweite Tabelle (TestTable) enthält Datensätze, welche jeweils einen Eindeutigen Zählerwert enthalten sollen.
D.h. ich will neben der Tabellen ID einen weiteren Wert, welcher durchlaufend nummeriert wird.
Diese Tabelle wird später mit weiteren Informationsfeldern ergänzt (Name, Adresse usw.).
http://nathan-systems.ch/images/TabelleTest.gif

Bei jedem neuen Datensatz in der Tabelle "TestTable" soll der Zähler erhöht werden und ins Insert eingebunden werden.
Da ich keine Datensätze ohne Zähler-Wert und keine Lücken in der Zählerfolge haben will, möchte ich das ganze gerne per Transaktion lösen.
D.h. falls etwas schief geht (Programmfehler, Ungültige Daten, Server brennt ab, User zieht den Stecker usw. ) soll alles rückgängig gemacht werden (keine Änderung der Daten).

Leider kenne ich mich mit solchen Transaktionen nicht aus... könnt ihr mir da weiterhelfen?
Das SQL Query habe ich soweit schon erstellt:
SQL-Code:
-- Deklarationen
DECLARE @NewCountValue int
DECLARE curNewCount CURSOR FOR SELECT [Value] FROM dbo.TestCounter WHERE ID = 'TestCounter'

-- Zähler erhöhen
UPDATE
  dbo.TestCounter
SET
  [Value] = (SELECT MAX(Value)+1 FROM TestCounter WHERE ID = 'TestCounter')
WHERE
  ID = 'TestCounter'

-- Cursor öffnen & neuen (erhöhter) Wert auslesen
OPEN curNewCount
IF @@Cursor_Rows <> 0
BEGIN
  FETCH NEXT FROM curNewCount INTO @NewCountValue
END

-- Tabelleneintrag mit neuem Wert erstellen
INSERT INTO dbo.TestTable (IdCount) VALUES (@NewCountValue)

-- Cursor schliessen freigeben
CLOSE curNewCount
DEALLOCATE curNewCount

--SELECT @NewCountValue
Wie kann ich dieses Query nun als sichere Transaktion verpacken (Commit usw.)?
Wie sieht es aus, wenn mehrere Benutzer gleichzeitig einen Datensatz erstellen?

Danke im Vorraus!

Gruss Fellmer
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 09:20
Unterstützt MSSQl keine Sequenzen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 09:23
Zitat von Fellmer Lloyd:
Bei jedem neuen Datensatz in der Tabelle "TestTable" soll der Zähler erhöht werden und ins Insert eingebunden werden.
Da ich keine Datensätze ohne Zähler-Wert und keine Lücken in der Zählerfolge haben will, möchte ich das ganze gerne per Transaktion lösen.
Warum nutzt du nicht Autoinc Felder... Was ist der Sinn daran, keine Lücken entstehen zu lassen.. Warum stört das?

Grund der Frage: Eine ID soll auf Ewigkeit eindeutig sein. Wenn Du einen Record löschst, ist er weg. Das rechtfertigt aber noch nicht, wieder einen neuen Datensatz mit gleicher ID anzulegen.

Stell Dir vor du hast eine Kundentabelle, und eine Verkaufstabelle, in der eine Spalte über eine ID auf den Kunden referiert. Löschst Du den Kunden, verweist die Rechnung ins Leere... An sich schon schlimm genug. Legst Du aber jetzt einen neuen Kunden mit der alten ID an, so verweist die Rechnung auf einen falschen Kunden, was noch schlimmer ist.
  Mit Zitat antworten Zitat
Fellmer Lloyd
(Gast)

n/a Beiträge
 
#4

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 10:07
@mkinzler: Hier muss ich passen, da ich nicht weiss was eine Sequenz ist (Datenbank bezogen).

@Jelly: AutoInc ist nicht möglich, weil werte in dieser Spalte manchmal geändert werden müssen (Lange Geschichte und leider nicht zu ändern).
Mit den ID's habe ich mich evtl. falsch ausgedrückt: Ich will natürlich keinen neuen Datensatz mit gleicher ID (habe ich das so erklärt?).

Die ganze Datenstruktur inkl. Zähler habe ich nur zur veranschaulichung beschrieben, da ist noch mehr dahinter.
Eigentlich möchte ich nur wissen wie das ganze per Transaktion funktioniert.

Also wie die SQL Befehle lauten um das ganze Query entweder komplett (keine Fehler) oder gar nicht (irgend ein Fehler) auszuführen.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 10:14
Zitat von mkinzler:
Unterstützt MSSQl keine Sequenzen?
Das nennt sich dort globale Variablen... Angesprochen werden die mit einem doppelten @, also z.B.

@@id
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 10:16
Zitat:
@mkinzler: Hier muss ich passen, da ich nicht weiss was eine Sequenz ist (Datenbank bezogen).
Sequenzen sind Teil des SQL2003-Standards. dabei handelt es sich um Tabellenunabhängige Variablen die in einer critical section erhöht werden können.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 10:22
Hallo,

viell. hilft das hier ja eiter

http://www.devtrain.de/artikel_371.aspx

Heiko
Heiko
  Mit Zitat antworten Zitat
Fellmer Lloyd
(Gast)

n/a Beiträge
 
#8

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 12:57
Danke für die Antworten.

@Hoika: Danke, der Link hat mir sehr weitergeholfen.
Ich die Anweisungen nun in einen TRY Block gepackt. Bei einem Fehler (CATCH Block) wird nun ein ROLLBACK ausgeführt.
SQL-Code:
BEGIN TRANSACTION InsertTest;

BEGIN TRY
  -- Anweisungen (Zähler erhöhen & INSERT)
  -- {...}

  COMMIT TRANSACTION InsertTest;
  SELECT 0 AS Result; -- 0 = Erfolgreich
END TRY

BEGIN CATCH
  ROLLBACK TRANSACTION InsertAccount;
  SELECT 1 AS Result; -- <>0 = Fehler
END CATCH
Gruss Fellmer
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Transaktion (Zähler erhöhen & anschliessendes INSERT

  Alt 18. Aug 2006, 15:12
Mein erster VB-Tip.

tratra

*Rotkäppchen aufmach*


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
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