Buenas a todos.
Me estaba planteando cómo cambiar esto, para mejorarlo. La cosa es que en cada una de mis clases tengo un método parecido al siguiente, que corresponde al método "Eliminar" de mi clase "Distritos":
Código vb.net:
Ver originalPublic Sub Eliminar(ByVal CodigoDistrito As String)
Dim sSQL As String
Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnStr").ConnectionString)
Conn.Open()
Dim cM As New SqlCommand
Dim miTrans As SqlTransaction = Conn.BeginTransaction
Try
'Eliminamos Actuaciones
sSQL = "DELETE FROM [Actuaciones] WHERE CodigoDistrito=@CodigoDistrito"
cM = New SqlCommand(sSQL, Conn, miTrans)
cM.Parameters.Add("@CodigoDistrito", SqlDbType.VarChar, 15).Value = CodigoDistrito
cM.ExecuteNonQuery()
'Eliminamos Distrito
sSQL = "DELETE FROM [Distritos] WHERE Codigo=@Codigo"
cM = New SqlCommand(sSQL, Conn, miTrans)
cM.Parameters.Add("@Codigo", SqlDbType.VarChar, 15).Value = CodigoDistrito
cM.ExecuteNonQuery()
miTrans.Commit()
Catch ex As Exception
miTrans.Rollback()
Throw New Exception(ex.Message)
End Try
Conn.Dispose()
End Sub
Luego, dispongo también de mi clase "Actuaciones", que se trata de una colección de "Distritos". Dicho de otro modo, las "Actuaciones" están relacionadas con un "Distrito". Es por eso, que al eliminar un "Distrito", antes se eliminan todas sus "Actuaciones" y finalmente, se elimina el "Distrito", todo esto dentro de una misma SqlTransaction.
Bien, ahora cuál es la modificación que me gustaría realizar...
Verán, en mi clase "Actuaciones" ya dispongo del método "Eliminar" pero en ese caso sin usar Transacciones, puesto que sólo realizo una eliminación de una Tabla. Pero el código utilizado, es exactamente el mismo que la parte correspondiente a eliminar las "Actuaciones", de la funcion anterior.
Por lo tanto, estoy repitiendo código.
Me gustaría sustituir la parte de código que elimina las "Actuaciones" en esta función, por una llamada a la función "Eliminar" de la clase "Actuaciones", de forma que le pueda pasar el obteto SqlTransaction, y todo se siga realizando en una misma transacción, así evitaría repetir código.
Pero no sé como realizar esta modificación por lo siguiente.
En la función "Eliminar" de la clase "Actuaciones" también se crea un nuevo objeto SqlConnection, que se abre, se asigna a un SqlCommand y se ejecuta la SQL. Luego, se cierra la conexión y se hace el Dispose.
Pero todo esto no se debería hacer si la operación forma parte de una transacción, puesto que la misma conexión se debe seguir utilizando, una vez eliminadas las "Actuaciones", para eliminar los "Distritos", de forma que se haga en una misma transacción.
Pero en el momento que llamamos a la funcion "Eliminar" de la clase "Actuaciones", solamente para eliminar una "Actuación" puntual, entonces si debería crear una conexión nueva, y al ejecutar la SQL, cerrar la conexión y hacerle el Dispose. Así que en este caso, no debería cerrarse y hacer el Dispose, sino quedar abierta para las siguientes instrucciones.
¿Como puedo compaginar una cosa con la otra? ¿Cuál es la forma correcta de implementar estas cosas?
Gracias por vuestras opiniones.
Saludos.