Einzelnen Beitrag anzeigen

Fellmer Lloyd
(Gast)

n/a Beiträge
 
#1

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

  Alt 18. Aug 2006, 10: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