Share via


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

  1. 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.
  2. 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.
  3. A continuación se ejecutan los comandos deseados.
  4. 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)