lunes, 16 de julio de 2007

Control de concurrencia pesimista en ADO.NET (VB.NET)

Como lo prometido es deuda, aquí esta el código en VB.NET del anterior artículo


Imports System
Imports System.Text
Imports System.Data
Imports System.Data.SqlClient

Namespace BloqueoPesimista

Module Module1

Sub Main()
Dim ds As DataSet = New DataSet()
Dim conexion As SqlConnection = New SqlConnection()
Dim transaccion As SqlTransaction
Dim comando As SqlCommand = New SqlCommand()
Dim da As SqlDataAdapter = New SqlDataAdapter()

Console.WriteLine("Pulse una tecla para iniciar...")
Console.ReadKey()

Try
' La cadena de conexión indica que atacamos a la base de datos Northwind del servidor local
conexion = New SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True")

comando.Connection = conexion
comando.CommandType = CommandType.Text

' El SELECT tiene un parámetro para evitar SQL Injection
comando.CommandText = "SELECT ProductID, ProductName FROM Products WITH (Rowlock,Xlock) " & _
"WHERE ProductID = @ID"
comando.Parameters.AddWithValue("@ID", 1)
da.SelectCommand = comando

'Abrimos la conexión y ejecutamos en comando
'Nota: también se puede hacer con la sentencia Using() que nos evita abrir y cerrar la conexión
conexion.Open()

' La transacción no tiene constructor, se crea a partir de la conexión a través de un Class Factory
transaccion = conexion.BeginTransaction(IsolationLevel.ReadCommitted)

' Una vez creada la transacción la asignamos al comando
comando.Transaction = transaccion

' Ejecutamos el comando mediante el SQLDataAdapter
da.Fill(ds, "Products")

' Mostramos el registro bloqueado
Console.WriteLine("Registro con ProductID = {0} está bloqueado.", ds.Tables("Products").Rows(0)("ProductID"))

Console.WriteLine("Pulse una tecla para finalizar el bloqueo...")
Console.ReadKey()

' Finalizamos la transacción, aquí ya se deshace el bloqueo
transaccion.Rollback()

' Cerramos la conexión
conexion.Close()

Catch ex As Exception
If conexion.State <> ConnectionState.Closed Then
conexion.Close()
End If

Console.WriteLine(ex.Message)
Console.ReadKey()

End Try

End Sub

End Module

End Namespace