Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/07/2009, 03:12
Avatar de moNTeZIon
moNTeZIon
 
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Actualizando mi capita de datos...

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 original
  1. Public Sub Eliminar(ByVal CodigoDistrito As String)
  2.             Dim sSQL As String
  3.             Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnStr").ConnectionString)
  4.             Conn.Open()
  5.             Dim cM As New SqlCommand
  6.             Dim miTrans As SqlTransaction = Conn.BeginTransaction
  7.             Try
  8.                 'Eliminamos Actuaciones
  9.                 sSQL = "DELETE FROM [Actuaciones] WHERE CodigoDistrito=@CodigoDistrito"
  10.                 cM = New SqlCommand(sSQL, Conn, miTrans)
  11.                 cM.Parameters.Add("@CodigoDistrito", SqlDbType.VarChar, 15).Value = CodigoDistrito
  12.                 cM.ExecuteNonQuery()
  13.                 'Eliminamos Distrito
  14.                 sSQL = "DELETE FROM [Distritos] WHERE Codigo=@Codigo"
  15.                 cM = New SqlCommand(sSQL, Conn, miTrans)
  16.                 cM.Parameters.Add("@Codigo", SqlDbType.VarChar, 15).Value = CodigoDistrito
  17.                 cM.ExecuteNonQuery()
  18.                 miTrans.Commit()
  19.             Catch ex As Exception
  20.                 miTrans.Rollback()
  21.                 Throw New Exception(ex.Message)
  22.             End Try
  23.             Conn.Close()
  24.             Conn.Dispose()
  25.         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.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 02/07/2009 a las 05:10