SqlTransaction en VB

SqlTransaction en VB

¿Qué pasa si en alguna en un procesos de actualización de datos de una base de datos falla a la mitad? Lo normal en la mayoría de los casos es deshacer todo lo que se ha hecho y dejar la base de datos como estaba. Este proceso sería muy complicado hacerlo a mano, por no decir imposible. Para esto están las transacciones, que de una manera muy fácil nos ayudan a resolver este tipo de problemas, sobre todo es util cuando hay varias tablas involucradas en los cambios a realizar, pues  las operaciones son indivisibles, lo que significa que o se ejecutan todas las operaciones o no se ejecuta ninguna. En el Caso de las Transacciones con las Bases de Datos, si la Transacción ha dado error se hace un “Rollback” para deshacer todos los cambios.


Aquí ingresaremos datos a una tabla llamada personal dentro de una base de datos llamada empleado, lo primero que hacemos es crear una cadena de conexión y abrir una conexión con ésta. Con esta conexión abierta creamos la transacción (con el método “BeginTransaction”) y ejecutamos la instrucción de insertar datos. Si todo ha ido bien, hacemos un “Commit” de la transacción y si algo ha fallado hacemos un “Rollback”. Es importante hacer un ”Commit” ya que si no, el sistema hará un “Rollback” automáticamente al cerrar la conexión.

este es el diseño del formulario a utilizar tanto en VB como en C#
Ejemplo Transacciones en VB
ImportsSystem.Data
ImportsSystem.Data.SqlClient
PublicClass Form1
    Dimconexion As NewSqlConnectionStringBuilder
       
    Private Sub Form1_Load(ByValsender As System.Object, ByVal e AsSystem.EventArgs) HandlesMyBase.Load
        Withconexion
            .DataSource = "USER-PC\PABLETORETO"
            .InitialCatalog = "empleado"
            .IntegratedSecurity = True
        End With
    End Sub
    Private Sub Agregar_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) HandlesAgregar.Click
        Usingcon As New SqlConnection(conexion.ConnectionString)
            con.Open()
            'Crear el objeto Transaction
            Dim transaccion As SqlTransaction = con.BeginTransaction
            Dim sentencia As String = "insert into personal " & _
        "(nombre, apellido, puesto, sueldo) " & _
        "VALUES (@nombre, @apellido, @puesto, @sueldo)"
            Dim cmd As New SqlCommand(sentencia, con)
            Withcmd
                .Parameters.AddWithValue("@nombre", nombre.Text)
                .Parameters.AddWithValue("@apellido", apellido.Text)
                .Parameters.AddWithValue("@puesto", puesto.Text)
                .Parameters.AddWithValue("@sueldo", sueldo.Text)
            End With
            'Asignamos la transacción al método Transaction del comando, esto siempre debemos
            'hacerlo en todos los comandos que modifiquen los datos, si no lo asignamos, recibiremos un error.
            cmd.Transaction = transaccion
            Try
                cmd.ExecuteNonQuery()
                transaccion.Commit()
                MessageBox.Show("Se han actualizado los datos")
            Catch ex As Exception
                ' Si hay error, desahacemos lo que se haya hecho
                transaccion.Rollback()
                MessageBox.Show("No se han actualizado los datos" & vbCrLf & ex.Message)
            End Try
        End Using
    End Sub
End Class
Ejemplo Transacciones en C#
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Data.SqlClient;
namespacetransaccionesC
{
    public partial class Form1 : Form
    {
        publicForm1()
        {
            InitializeComponent();
        }
        SqlConnectionStringBuilderconexion = new SqlConnectionStringBuilder();
        privatevoid Form1_Load(objectsender, EventArgs e)
        {
          conexion.DataSource = @"USER-PC\PABLETORETO";
          conexion.InitialCatalog = "empleado";
          conexion.IntegratedSecurity = true;
    }
        privatevoid Agregar_Click(objectsender, EventArgs e)
        {
            using(SqlConnection con = new SqlConnection(conexion.ConnectionString)) {
                    con.Open();
                    //Crear el objeto Transaction
                    SqlTransaction transaccion = con.BeginTransaction();
                    string sentencia = "insert into personal " + "(nombre, apellido, puesto, sueldo) " + "VALUES (@nombre, @apellido, @puesto, @sueldo)";
                    SqlCommand cmd = new SqlCommand(sentencia, con);
                    cmd.Parameters.AddWithValue("@nombre", nombre.Text);
                    cmd.Parameters.AddWithValue("@apellido", apellido.Text);
                    cmd.Parameters.AddWithValue("@puesto", puesto.Text);
                    cmd.Parameters.AddWithValue("@sueldo", sueldo.Text);
                    //Asignamos la transacción al método Transaction del comando, esto siempre debemos
                    //hacerlo en todos los comandos que modifiquen los datos, si no lo asignamos, recibiremos un error.
                    cmd.Transaction = transaccion;
                    try{
                           cmd.ExecuteNonQuery();
                           transaccion.Commit();
                           MessageBox.Show("Se han actualizado los datos");
                    } catch (Exceptionex) {
                           // Si hay error, desahacemos lo que se haya hecho
                           transaccion.Rollback();
                           MessageBox.Show("No se han actualizado los datos" + ex.Message);
                    } } }
Cómo hemos visto el uso de transacciones desde .NET es muy fácil y hace nuestras aplicaciones más robustas. Pero, ¿qué pasa cuando entran en juego varias bases de datos, o incluso varios gestores de base de datos (varios Sql Server)? Para eso tenemos el TransactionScope, que podemos ver en http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

Brak komentarzy