Tengo un problema, y parece que a todos los artículos o ejemplos que encontré no les importa.No se puede acceder al objeto SqlTransaction para deshacer en el bloque catch
Quiero hacer algunas acciones de base de datos en una transacción. Lo que quiero hacer es muy similar a la mayoría de los ejemplos:
using (SqlConnection Conn = new SqlConnection(_ConnectionString))
{
try
{
Conn.Open();
SqlTransaction Trans = Conn.BeginTransaction();
using (SqlCommand Com = new SqlCommand(ComText, Conn))
{
/* DB work */
}
}
catch (Exception Ex)
{
Trans.Rollback();
return -1;
}
}
Pero el problema es que el SqlTransaction Trans
se declara dentro del bloque try
. Por lo tanto, no es accesible en el bloque catch()
. La mayoría de los ejemplos solo hacen Conn.Open()
y Conn.BeginTransaction()
antes del bloque try
, pero creo que es un poco arriesgado, ya que ambos pueden arrojar múltiples excepciones.
¿Estoy equivocado o la mayoría de las personas simplemente ignoran este riesgo? ¿Cuál es la mejor solución para poder retrotraer, si ocurre una excepción?
P.S. ¿Estás seguro de que quieres devolver -1 (un código de error) en lugar de lanzar una excepción? –