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:
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.Ver original
Public 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
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.