2012-03-29 18 views
10

Używam "TransactionScope", i muszę po prostu zrobić trochę DML w ramach kodu C#, który udało mi się.

Muszę się dowiedzieć, jaki jest jaki jest status Transakcji, czyli czy zakończyła się pomyślnie, czy nie?

Ponieważ na podstawie statusu transakcji, jeśli transakcja jest zakończona, muszę wykonać przekierowanie na inną stronę, w przeciwnym razie, jeśli transakcja nie zakończy się pomyślnie, muszę wyświetlić błąd na stronie.

Chcę przekierować po co następuje: -
scope.Complete();
scope.Dispose();Jak znaleźć status transakcji

Proszę mi pomóc w tym zakresie.

Odpowiedz

10

Jeśli visit the MSDN page dla TransactionScope, to znajdzie to dobrze udokumentowany przykład:

try 
{ 
    // Create the TransactionScope to execute the commands, guaranteeing 
    // that both commands can commit or roll back as a single unit of work. 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     using (SqlConnection connection1 = new SqlConnection(connectString1)) 
     { 
      // Opening the connection automatically enlists it in the 
      // TransactionScope as a lightweight transaction. 
      connection1.Open(); 

      // Create the SqlCommand object and execute the first command. 
      SqlCommand command1 = new SqlCommand(commandText1, connection1); 
      returnValue = command1.ExecuteNonQuery(); 
      writer.WriteLine("Rows to be affected by command1: {0}", returnValue); 

      // If you get here, this means that command1 succeeded. By nesting 
      // the using block for connection2 inside that of connection1, you 
      // conserve server and network resources as connection2 is opened 
      // only when there is a chance that the transaction can commit. 
      using (SqlConnection connection2 = new SqlConnection(connectString2)) 
      { 
       // The transaction is escalated to a full distributed 
       // transaction when connection2 is opened. 
       connection2.Open(); 

       // Execute the second command in the second database. 
       returnValue = 0; 
       SqlCommand command2 = new SqlCommand(commandText2, connection2); 
       returnValue = command2.ExecuteNonQuery(); 
       writer.WriteLine("Rows to be affected by command2: {0}", returnValue); 
      } 
     } 

     // The Complete method commits the transaction. If an exception has been thrown, 
     // Complete is not called and the transaction is rolled back. 
     scope.Complete(); 

    } 

} 
catch (TransactionAbortedException ex) 
{ 
    writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message); 
} 
catch (ApplicationException ex) 
{ 
    writer.WriteLine("ApplicationException Message: {0}", ex.Message); 
} 

Komentarz, który zawiera największą wartość jest taka:

The Complete metoda zatwierdza transakcję. Jeśli został zgłoszony wyjątek, nie jest wywoływana funkcja Complete, a transakcja jest wycofywana.

Tak więc, jeśli nie są zgłaszane żadne wyjątki, można kontynuować. Umieść przekierowanie po scope.Complete(). Jeśli zostanie zgłoszony wyjątek, transakcja nie powiodła się i została automatycznie wycofana. Można dokładnie sprawdzić status transakcji (jak inni napisali) po wywołaniu Complete() i zanim przekierować poprzez Transaction.Current.TransactionInformation.Status:

if (Transaction.Current.TransactionInformation.Status == TransactionStatus.Committed) 
{ 
    // do redirect 
} 
+0

Wielkie dzięki, rozwiązałeś mój problem w szczegółach . –

1

Jak o:

TransactionStatus status = Transaction.Current.TransactionInformation.Status; 
2

najlepszą metodą Mam znalezionych dla przechwytywania to najskuteczniej/jest prawidłowo następuje:

Wewnątrz transactioncope za pomocą instrukcji i przed wywołaniem scope/Complete().

//Register for the transaction completed event for the current transaction 
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted); 

Następnie należy utworzyć funkcję obsługi zdarzenia w następujący sposób:

/// <summary> 
/// Handles the TransactionCompleted event of the Current control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Transactions.TransactionEventArgs"/> instance containing the event data.</param> 
static void Current_TransactionCompleted(object sender, TransactionEventArgs e) 
{ 
    if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed) 
    { 
     /// Yay it's committed code goes here! 
    } 
} 

Cytując MSDN

„Możesz zarejestrować się na to wydarzenie, a nie stosowanie parującego wstępowania aby uzyskać informacje wynik dla transakcji.Parametr przekazany do delegata TransactionCompletedEventHandler jest instancją transakcji. Następnie można wywołać właściwość TransactionInformation dla konkretnej instancji, aby uzyskać wystąpienie TransactionInformation, którego właściwość Status zawiera status transakcji z wartością Zaakceptowane lub Przerwane. "

Powiązane problemy