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 № 1C'è 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
}