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;
}
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.
Gracias por el ejemplo, me resulto muy util.
ResponderEliminar