/ / Sintassi appropriata per la transazione sql con l'utilizzo di wrapper - .net, sql-server

Sintassi appropriata per la transazione sql con l'uso di wrapper - .net, sql-server

Ho bisogno di aggiungere transazioni per un'istruzione sql in un'applicazione di database, fino a questo punto, non ho avuto bisogno di farlo, dato che stavo principalmente tirando i dati, o facendo piccole modifiche ai dati esistenti.

Sto usando abbastanza un costrutto ordinatocon successo usando istruzioni nidificate, ma voglio verificare con persone che conoscono meglio di me se questo costrutto modificato funzionerà come previsto con la transazione incorporata.

        using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection()) {
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();
using (SqlTransaction tran = cmd.Connection.BeginTransaction()) {
// do the work (try catch wraps the statements)
// commit transaction if no errors found or rollback
}
cmd.Connection.Close();
}

Grazie in anticipo Saluti balestruccio

risposte:

1 per risposta № 1

C'è una classe integrata TransactionScope è più facile da usare Istanziarlo in a using blocco e qualsiasi cosa al suo interno farà parte della stessa transazione.

using(var ts = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection())
{
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();

// Do the work

ts.Complete();

cmd.Connection.Close();
}

Se si verificano eccezioni, ilcorso di transazioneinterromperà automaticamente tutte le operazioni quando disposta. Il transactioncope influenza anche qualsiasi operazione eseguita in qualsiasi funzione chiamata, senza la necessità di passare le connessioni db in giro.


1 per risposta № 2

Come hai scritto, non funziona - devi associare il comando alla transazione tramite la classe SqlCommand Proprietà transazione . Inoltre, potrebbe essere necessario aprire prima la connessione per avviare la transazione

L'utilizzo di TransactionScope è più semplice, ma richiede che il server di database sia configurato per l'uso di MSDTC

Utilizziamo un ambiente condiviso in cui lavoro e MSDTC non è un'opzione.


0 per risposta № 3

Invece di SqlTransaction, considera l'utilizzo TransactionScope.

Con TransactionScope dovrai avvolgerlo using dichiarazione intorno al SqlConnection creazione. Per poter effettuare il commit, devi chiamare Complete prima della fine del blocco.

using (var tx = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection())
{
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();

// do the work (try catch wraps the statements)
// commit transaction if no errors found or rollback

tx.Complete(); // commits transaction
}