Foros del Web » Programación para mayores de 30 ;) » .NET »

Actualizando mi capita de datos...

Estas en el tema de Actualizando mi capita de datos... en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/07/2009, 03:12
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 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
  #2 (permalink)  
Antiguo 02/07/2009, 14:18
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 8 meses
Puntos: 15
Respuesta: Actualizando mi capita de datos...

OK a ver si mi idea te gusta.

Te expondré la idea lo mejor que pueda:
- El punto es tener el proceso de SqlTransaction en un método aparte
- A este método le pasas ya sea un Array de SqlCommand[] ó que tengas una lista
List<SqlCommand> donde cargues los comandos allí
- Después el método procesa los Comandos que mandes y los liga a la conexión que
el SqlTransaction maneja.
- Todos tus métodos actuales solo preparan el SqlCommand y usan siempre el otro método
que procesa el SqlTransaction
- Como tu usas Parameters puedes tener ya los querys definidos en un HasTable ó Dictionary por Key y Value donde el Key sea un nombre que indentifique el query que esta en el Value, así tienes todos tus query en un solo lugar y cuando los necesites entre los métodos solo los llamas por el Key y entonces le mandas sus parametros cuando prepares el SqlCommand.
- Creo que así tendrías: Centralizado el SqlTransaction en un solo método, Centralizado los Query en un Dictionary, Solo preparas los SqlCommand en cada método tuyo.

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

Muchísimas gracias por tu opinión, dwaks
Antes de hacer este cambio de centralizar las querys, voy centrarme en el tema de la transaction.
A ver si este resumen vale para explicar el método que me has explicado.
Representa que en el método "Eliminar" de "Actuaciones" solamente construyo un SQLCommand, con la query correspondiente para eliminar una o varias actuaciones. Una vez lo tengo, lo paso como parámetro a ese método independiente, en el que siempre se crea una conexión, una transacción, y el mismo método es el que ejecuta el "Connection.Open", el "Conection.BeginTransaction", y los "Execute" de los Comandos (en este caso un solo comando).
La diferencia en el caso de eliminar un "Distrito" es que este método va a recibir más comandos, de forma que los ejecutará en la misma transacción.
O sea que reciba un Comando, o reciba varios, siempre se va a ejecutar en una transacción.
Lo he entendido así, y la verdad es que ya me están entrando ganas de implementarlo.
Digamos que yo las transacciones las utilizo solo cuando tengo que ejecutar varios comandos. Cuando solo quiero ejecutar uno, no utilizo ninguna transacción.+
Imagino que tampoco hay problema por ejecutar estas querys aisladas en una transaction, aunque no sea necesario hacerlo, verdad?
Gracias una vez más por la explicación, dwaks. Creo que me has hecho ver la luz
Un saludo!
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 03/07/2009, 10:24
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Respuesta: Actualizando mi capita de datos...

Buenas!
Este es el método que hice para ejecutar el uno o varios comandos en una misma transacción:
Código vb.net:
Ver original
  1. Public Shared Sub EjecutarTransaccion(ByVal ListaComandosSQL As List(Of SqlCommand))
  2.         Dim Conn As New SqlConnection(Entorno.ConnStr)
  3.         Conn.Open()
  4.         Dim miTrans As SqlTransaction = Conn.BeginTransaction
  5.         Try
  6.             For Each miComando As SqlCommand In ListaComandosSQL
  7.                 miComando.Connection = Conn
  8.                 miComando.Transaction = miTrans
  9.                 miComando.ExecuteNonQuery()
  10.             Next
  11.             miTrans.Commit()
  12.         Catch ex As Exception
  13.             miTrans.Rollback()
  14.             Throw New Exception(ex.Message)
  15.         End Try
  16.         Conn.Close()
  17.         Conn.Dispose()
  18.     End Sub
Ahora la cosa será, desde los demás métodos, simplemente construir los comandos con sus parámetros, y cuando los tenga, pasárselo/s a este método para que los ejecute en una transacción.
Cualquier cosa "rara" que veais, o cualquier consejo al respecto, es bien recibido.
Un saludo!
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 03/07/2009 a las 10:36
  #5 (permalink)  
Antiguo 03/07/2009, 13:57
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 8 meses
Puntos: 15
Respuesta: Actualizando mi capita de datos...

Me gusta tu método y me alegra que me entendieras bien.

Saludos,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:32.