lunes, 29 de marzo de 2010

Transacciones

Ejemplo simple en vb.net y Ado.Net para crear transacciones

En el siguiente código se utiliza el método beginTransaction del objeto sqlConnection, para indicar que iniciamos una nueva transacción, y con los métodos Commit y RollBack del objeto sqlTransaction, poder confirmar o cancelar la transacción iniciada ,y de esta forma tener la seguridad de que al ejecutar mas de una sentencia sql u operación en la base de datos, si alguna falla , poder cancelar todo

Lo siguiente, si al ejecutar el segundo comando, se produce una excepción, se ejecuta el método RollBack para cancelar y deshacer la operación, si no se produce error, se ejecuta Commit para confirmar las dos operaciones realizadas

Código fuente
Option Explicit On
Option Strict On

Imports System.Data.SqlClient

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

Dim cs As String = "server=(local)\SQLEXPRESS;" & _
"integrated security=sspi;" &"database=catalogo"

'Instanciar nuevo SqlTransaction
Dim objTransac As SqlTransaction = Nothing
Dim cn As New SqlConnection(cs)

Try

' abrir una nueva conexión a la bd
cn.Open()

' Establecer e iniciar la nueva transacción con BeginTransaction
objTransac = cn.BeginTransaction

' comando 1
' '''''''''''''''''''''''''''''''''''''''''''''
' Inicializar nuevo SqlCommand
Dim cmdInert As New SqlCommand("Insert Into .... )", cn)

With cmdInert
' Establecer la transacción para el Insert
.Transaction = objTransac
.ExecuteNonQuery() ' ejecutar
End With

' comando 2
' '''''''''''''''''''''''''''''''''''''''''''''
Dim cmdUpdate As New SqlCommand("Update .... ", cn)

With cmdUpdate
' establecer la transacción para el comando Update
.Transaction = objTransac
.ExecuteNonQuery() ' ejecutar
End With

' Confirmar la transacción a la base de datos con el método Commit
objTransac.Commit()

' errores
Catch ex As Exception
' cancelar la trnsacción en caso de error en el
'segundo comando con el método Rollback
If Not objTransac Is Nothing Then
objTransac.Rollback() 'deshacer
End If

MsgBox(ex.Message.ToString)
Finally
' cerrar la conexión
If Not cn Is Nothing Then
If cn.State = ConnectionState.Open Then
cn.Close()
End If
End If
End Try
End Sub
End Class

No hay comentarios:

Publicar un comentario