miércoles, 3 de febrero de 2010

Transacciones en C# con SQL Server

A continuación pongo un pequeño ejemplo de como implementar una transacción dentro de una operación CRUD contra una base de datos.

private static int Insert(TransporteEntidad transporte)
{
string sql = @"INSERT INTO Transportes ([Nombre]
,[Activo]
,[Fecha_Activo])
VALUES (@Nombre,
@Activo,
@Fecha_Activo)"
using SqlConnection conn = new SqlConnectionConfigurationManager.ConnectionStrings["CadenaConexion"].ToString()))
{
SqlCommand command = new SqlCommand(sql, conn);
SqlTransaction transaccion = null;
command.Parameters.AddWithValue("Nombre", transporte.Nombre);
command.Parameters.AddWithValue("Activo", transporte.Activo);
command.Parameters.AddWithValue("Fecha_Activo", transporte.Fecha_Activo);
conn.Open();
transaccion = conn.BeginTransaction(IsolationLevel.RepeatableRead);
command.Transaction = transaccion;
int resultado;
try
{
resultado = command.ExecuteNonQuery();
transaccion.Commit();
}
catch (Exception ex)
{
transaccion.Rollback();
resultado = 0;
new Excepciones(ex, "ROLLBACK")
}
return resultado;
}
Como comentario simplemente decir que el método BeginTransaction() admite varios tipos de parámetros, dependiendo del modo de aislamiento que queramos usar en nuestra base de datos. Podemos ver un poco mas en http://msdn.microsoft.com/es-es/library/system.data.isolationlevel.aspx  Otra página bastante interesante para mi es Transacciones y modos de aislamiento en SQL Server y .NET, en la cual pone además un ejemplo básico de utilización en SQL Server y otro en ADO .NET

Respecto a la instruccion using(){}, con ella conseguimos asegurarnos de que siempre se cierre la conexión, pase lo que pase (por eso no necesitamos incluir el conn.Close();

En el caso de querer realizar operaciones en bloque con tablas relacionadas por ejemplo, podremos usar SqlTransaction, de forma que abstraemos el manejo de transacciones a las demás capas de la arquitectura (si trabajamos en una arquitectura de n-capas) aunque puede ser una solución costosa en diseño si no se planifica bien (yo aún no lo he ocnseguido) o también podemos usar TransactionScope si queremos manejar las operaciones desde la capa de negocio, por ejemplo. Pero esto, para otra ocasión.

1 comentario: