Realizar una transacción mediante ADO.NET
Con los objetos Connection y Transaction puede comenzar una transacción, confirmarla y deshacerla. Para realizar una transacción hay que seguir los siguientes pasos.
Para realizar una transacción
- Se llama al método BeginTransaction del objeto Connection para indicar el comienzo de la transacción. El método BeginTransaction devuelve una referencia a Transaction. Esta referencia se asigna a los objetos Command inscritos en la transacción.
- El objeto Transaction se asigna a la propiedad Transaction del Command que se desea ejecutar. Si se ejecuta un comando (Command) en una conexión (Connection) que tiene una transacción (Transaction) activa y no se ha asignado el objeto Transaction a la propiedad Transaction del objeto Command, se inicia una excepción.
- A continuación se ejecutan los comandos deseados.
- Finalmente se llama al método Commit del objeto Transaction para completar la transacción o al método Rollback para cancelarla.
En el ejemplo de código siguiente se demuestra la lógica de las transacciones que se realizan mediante ADO.NET con Microsoft® SQL Server™.
Dim myConnection As SqlConnection = New SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;")
myConnection.Open()
' Start a local transaction.
Dim myTrans As SqlTransaction = myConnection.BeginTransaction()
' Enlist the command in the current transaction.
Dim myCommand As SqlCommand = myConnection.CreateCommand()
myCommand.Transaction = myTrans
Try
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
myCommand.ExecuteNonQuery()
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"
myCommand.ExecuteNonQuery()
myTrans.Commit()
Console.WriteLine("Both records are written to database.")
Catch e As Exception
Try
myTrans.Rollback()
Catch ex As SqlException
If Not myTrans.Connection Is Nothing Then
Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
" was encountered while attempting to roll back the transaction.")
End If
End Try
Console.WriteLine("An exception of type " & e.GetType().ToString() & _
"was encountered while inserting the data.")
Console.WriteLine("Neither record was written to database.")
Finally
myConnection.Close()
End Try
[C#]
SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();
// Start a local transaction.
SqlTransaction myTrans = myConnection.BeginTransaction();
// Enlist the command in the current transaction.
SqlCommand myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (SqlException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
"was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
Vea también
Utilizar proveedores de datos de .NET Framework para obtener acceso a datos | OleDbConnection (Clase) | OleDbTransaction (Clase) | SqlConnection (Clase) | SqlTransaction (Clase) | OdbcConnection (Clase) | OdbcTransaction (Clase)