2012-12-19 11 views
9

Ich habe 2 Tabellen Anfrage und Details. auf Speichern klicken IRoll zurück in C#

fbsave(); 
fbsavedetails(); 

fbsave() die Daten in Tabelle Anfrage speichern geschrieben und fbsavedetails() speichert die Daten im Detail Tabelle.

Wenn nun ein Fehler in fbsavedetails() auftritt, sollten beide Schritte zurückgesetzt werden.

ist es möglich?

+0

MS Access oder SQL Server konfiguriert werden? – andy

+2

Wie machen Sie Ihre Datenschicht? Gespeicherte Prozeduren? linq-zu-sql? in Verbindung gebracht? getrennt? –

+0

Sie können tun, was Sie wollen, indem Sie Transaktionen verwenden, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer

Antwort

8

Sie können explizit eine Transaktion erstellen und um übergeben, das heißt

using(var connection = ...) 
{ 
    connection.Open(); 
    using (var tran = connection.BeginTransaction()) 
    { 
     try 
     { 
      FBSave(connection, tran); 
      FBSaveDetails(connection, tran); 
      tran.Commit(); 
     } 
     catch 
     { 
      tran.Rollback(); 
      throw; 
     } 
    } 
} 

Beachten Sie, dass hier Sie Muss auch die Transaction auf jedem Befehl gesetzt, also warum Sie es in geben müssen, und alle Befehle müssen sich auf demselben Verbindungsobjekt befinden.


Oder: Sie können TransactionScope verwenden; es ist wichtig, dass die Open()innerhalb der TransactionScope geschieht automatisches enlistment zu erhalten:

using(var tran = new TransactionScope()) 
{ 
    FBSave(); 
    FBSaveDetails(); 
    tran.Complete(); 
} 

oder:

using(var tran = new TransactionScope()) 
using(var connection = ...) 
{ 
    connection.Open(); 
    FBSave(connection); 
    FBSaveDetails(connection); 
    tran.Complete(); 
} 

mit dem TransactionScope Ansatz, die Sie nicht etwas Besonderes festlegen müssen - die meisten es ist automatisch. Sie können die Verbindung natürlich optional in die Methoden übergeben, aber sie könnten auch ihre eigene Verbindung erhalten, und in den meisten Fällen würde es gut funktionieren.

+0

Führt der "innerhalb von TransactionScope öffnen, um automatisches Eintreten zu erhalten" die Notwendigkeit von DTC aus? –

+0

@MrMoose nein, aber Sie * können * in der Regel die Notwendigkeit für DTC einfach durch die Weitergabe der Verbindung vermeiden: Wenn Sie nur ein Verbindungsobjekt innerhalb der 'TransactionScope' verwenden, dann wird es von der LTM statt DTC behandelt (in allen Versionen von SQL Server> = 2005, IIRC) –

7

Sie können TransactionScope verwenden.

using(var scope = new TransactionScope()) 
{ 
    //Complete the transaction only when both inserts succeed. 
    scope.Complete(); 
} 

Wenn Sie den Transaktionsbereich nicht abschließen, wird ein Rollback ausgeführt.

1

gibt es zwei Möglichkeiten, dieses Problem

  1. Verwendung DbTransaction zu lösen und die DbTransaction um die beiden Methode übergeben, begehen die Transaktion, wenn der Erfolg und Rollback, wenn Fehler Nachteile passiert: DbTransaction müssen herumgereicht werden.
  2. Verwendung Transaction Profis: Leichtigkeit Nachteile zu verwenden: Zugriff nicht unterstützt wird, und wenn die Datenbank SQL2000 ist, wird msdtc erforderlich