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

Transacciones en capas con transactionscope

Estas en el tema de Transacciones en capas con transactionscope en el foro de .NET en Foros del Web. buenas a toda la Comunidad: Estoy en apretos por un inconveniente en el manejo de bloque de transaccciones a través del TransactionScope de visual.NET. El ...
  #1 (permalink)  
Antiguo 11/09/2009, 09:53
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Transacciones en capas con transactionscope

buenas a toda la Comunidad:
Estoy en apretos por un inconveniente en el manejo de bloque de transaccciones a través del TransactionScope de visual.NET. El problema esta en que tengo una clase "Conexiones" en la que tengo todos los conectores que apuntan hacia las distintas bases de datos , esto implica que tenga que hacer referencia desde mi proyecto de aplicacion Web al proyecto "Conexiones". Es aqui donde transactionScope esta haciendo aguas. Da la sensación de que pierde la linea de la transacción al pasar de librerias de un Proyecto a otro.Repito es una solución con dos proyectos donde uno referencia a otro.
Tengo la Capa de servicio en la que uso el bloque TransactionScope desde el cual llamo a dos Negocios que hacen dos inserciones.El servicio llama a dos Negocios insertar tabla1 y luego insertar tabla2. En la segunda inserción genero una excepción para que haga el rollback(es decir, solo salteo el Complete del TransactionScope). Cuando voy a la base de datos la primer inserción se realizó cosa que no debería ocurrir . Ojala me haya hecho entender y alguien me tire un salvavidas. Desde ya muchas Gracias!
  #2 (permalink)  
Antiguo 11/09/2009, 15:29
Avatar de xjuanch0x  
Fecha de Ingreso: septiembre-2009
Mensajes: 125
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Transacciones en capas con transactionscope

Man porque no usas la Entreprise Librery, te permite manejar multiples capas de manera
transparente y explica algo, las inserciones las haces con procedimientos almacenados o con codigo embebido (quemado en la aplicacion).
  #3 (permalink)  
Antiguo 11/09/2009, 16:04
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Transacciones en capas con transactionscope

Actualmente estoy utilizando Stored Procedures , para evitar inyecciones ,voy a buscar informacón sobre El Enterprise Library . Muchas Gracias por la ayuda!!
  #4 (permalink)  
Antiguo 11/09/2009, 16:09
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Transacciones en capas con transactionscope

Una última pregunta , donde puedo conseguir la LIbreria???
  #5 (permalink)  
Antiguo 11/09/2009, 16:12
Avatar de xjuanch0x  
Fecha de Ingreso: septiembre-2009
Mensajes: 125
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Transacciones en capas con transactionscope

en Internet
Usa google :)
  #6 (permalink)  
Antiguo 11/09/2009, 16:25
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Transacciones en capas con transactionscope

jajajajaajajaa Gracias!
  #7 (permalink)  
Antiguo 14/09/2009, 07:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Transacciones en capas con transactionscope

Hola a toda la comunidad!! la verdad es que no he logrado solucionar este tema y me esta poniendo los pelos de punta, he probado de todo y no he llegado a solucionar el problema. Me he bajado la Enterprise Library, pero creo que no lo estoy usando bien. Como estoy en una aplicación Web , edite el Web Config con el Enterprise Library pero no obtuve resultados, probé utilizar referencias por proyectos y por dll , y sigo sin resultados. Por favor me tienen que salvar el pellejo!!
  #8 (permalink)  
Antiguo 14/09/2009, 08:38
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: Transacciones en capas con transactionscope

Si queres usar E.L con TranSco a lo mejor te sirver este artículo:
http://msguayaquil.com/blogs/julioc/...brary-3-0.aspx
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #9 (permalink)  
Antiguo 14/09/2009, 09:17
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
El problema con mas nivel de detalle

La base de datos es Postgres y la tabla es efectivamente transaccional .Utilizo el dirver Npgsql de la misma firma para conectarme a la base de datos, por último utilizo Stored Procedures.La arquitectura que implemento es la orientada a servicio. Capa de datos, Negocio , Servicio,UI. Cada capa la manejo como una librería o proyecto distinta y voy referenciando de una capa a otra entre si (Negocio a datos, servicio a negocio y Ui a servicio). Estoy utilizando TransactionScope como gestor de bloque de transacciones en la Capa de servicio, la cual llama a dos negocios de inserción dentro de la misma transacción y obviamente dentro del mismo servicio.
Tengo una clase mensajes que realiza el control de flujo de errores que contiene tablas con los distintos tipos como Mensajes,Errores,Excepciones y Advertencias, cuyos datos utilizo a la hora de capturar/almacenar todo tipo de mensajes y presentarlos en la Ui
El método "EstaBien" indica que ni la tabla de errores ni excepciones contienen registros por lo tanto puede darse entendida como correcta la transacción por que se supone no hubo ningún inconveniente.
Por ello es que pregunto al final del "try" si no hubo ningún inconveniente, para por dar el "Complete!" del transactionScope. El problema es que en el segundo negocio invocado en el servicio "NegocioInsertarConsumosTelefonicosClaroTodo", existe un error de negocio por el cual grabo una excepción que al preguntar si estaBien saltea el Complete cuestión por la cual el primer negocio de inserción debería descartarse, cosa que no ocurre.
La descripción de servicio. Insertar una tabla de cabecera(primer método invocado) y otra tabla con los detalles de dicha cabecera. Repito la cabecera si inserta sin problemas pero genero un error de negocio en el otro metodo(insertar detalle mas precisamente: NegocioInsertarConsumosTelefonicosClaroTodo) genero un error de negocio(Fila nula de excel), por el cual se saltea el complete del transactionScope, motivo por el cual no debería afectarse la primer tabla(la cabecera). Estas son las capas en resumidas cuentas:
Capa Servicio:
Public Shared Function ServicioInsertarConsumosTelefonicosClaroTodo(ByVal tabla As DataTable, ByVal numero As String, ByVal legajo As String, ByVal fechaInicio As Date, ByVal fechaFin As Date) As DataSet
Dim resultado As New DataSet
Try
Using transaccion = New TransactionScope()
If Mensajes.EstaBien(resultado) Then
resultado = NegocioConsumosTelefonicosClaro.NegocioInsertarLot esConsumosTelefonicosClaro(numero, legajo, fechaInicio, fechaFin)
End If
If Mensajes.EstaBien(resultado) Then
resultado = NegocioConsumosTelefonicosClaro.NegocioInsertarCon sumosTelefonicosClaroTodo(tabla, numero, legajo)
End If
If Mensajes.EstaBien(resultado) Then
transaccion.Complete()
Mensajes.InsertarMensaje(resultado, TipoMensaje.mensaje, 0, "El registro se ha insertado correctamente", "El registro se ha insertado correctamente")
End If
End Using
Catch ex As Exception
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, Err.Number, ex.Message, ex.StackTrace)
End Try
Return resultado
End Function

Negocios:

Public Shared Function NegocioInsertarConsumosTelefonicosClaroTodo(ByVal tabla As DataTable, ByVal numero As String, ByVal legajo As String) As DataSet
Dim resultado As New DataSet
Dim lote As Double
Dim aire As Double
Dim redFija As Double
Dim total As Double

If Mensajes.EstaBien(resultado) Then
resultado = DatosConsumosTelefonicosClaro.DatosLeerMaximoLote( numero, legajo)
lote = CType(resultado.Tables(TablasSistemaGt.pleo_lotesc onsumostelefonicosclaro.ToString).Rows(0)(0), Double)
If Mensajes.EstaBien(resultado) Then
For Each fila As DataRow In tabla.Rows
If Not IsNumeric(fila("numero")) Or Not IsNumeric(fila("celular")) Or Not IsNumeric(fila("minutos")) Then
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, 0, "No se puede insertar registros,hay filas nulas!", "No se puede insertar registros,hay filas nulas!")
Exit For
End If
Next
If Mensajes.EstaBien(resultado) Then
For Each fila As DataRow In tabla.Rows
aire = CType(Replace(fila("aire").ToString, ".", ","), Double)
redFija = CType(Replace(fila("red fija").ToString, ".", ","), Double)
total = CType(Replace(fila("total").ToString, ".", ","), Double)
resultado = DatosConsumosTelefonicosClaro.DatosInsertarConsumo sTelefonicosClaro(fila("celular").ToString, CType(fila("Fecha"), Date), CType(fila("hora"), Date), fila("destino").ToString, fila("numero").ToString, fila("tipo").ToString, fila("tarifa").ToString, CType(fila("minutos"), Double), aire, redFija, total, lote)
Next
End If
End If
End If
Return resultado
End Function
Public Shared Function NegocioInsertarLotesConsumosTelefonicosClaro(ByVal numero As String, ByVal legajo As String, ByVal fechaInicio As Date, ByVal fechaFin As Date) As DataSet
Dim resultado As New DataSet
Dim fechaInicioAuxiliar As String
Dim fechaFinAuxiliar As String

If String.IsNullOrEmpty(numero) Then
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, 0, "No se puede insertar,el numero no es válido", "No se puede insertar,el numero no es válido")
ElseIf String.IsNullOrEmpty(legajo) Then
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, 0, "No se puede insertar,el legajo no es válido", "No se puede insertar,el legajo no es válido")
Else
resultado = DatosPersonas.DatoLeerPersonas(legajo)
If resultado.Tables(TablasSistemaGt.pleo_personas.ToS tring).Rows.Count <= 0 Then
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, 0, "El legajo es inexistente", "Debe dar el alta del mismo")
Else
resultado = DatosCelulares.DatoLeerCelulares(CType(numero, Double))
If resultado.Tables(TablasSistemaGt.pleo_celulares.To String).Rows.Count <= 0 Then
Mensajes.InsertarMensaje(resultado, TipoMensaje.error, 0, "El celular es inexistente", "De dar el alta del mismo")
Else
fechaInicioAuxiliar = Format(fechaInicio, "yyyy-MM-dd").ToString
fechaFinAuxiliar = Format(fechaFin, "yyyy-MM-dd").ToString
resultado = DatosConsumosTelefonicosClaro.DatosInsertarLotesCo nsumosTelefonicosClaro(numero, legajo, fechaInicioAuxiliar, fechaFinAuxiliar)
End If
End If
End If
Return resultado
End Function
  #10 (permalink)  
Antiguo 14/09/2009, 09:18
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Transacciones en capas con transactionscope

Y Por último la clase de conexión a postgres con un singleton para obtener la instancia de conexión.

Public Class ConexionPostgresNpgsql
Public Shared Function ObtenerDatosNpgsql(ByVal nombreFuncion As String, ByVal ParamArray parametros() As ParametroNpgsql) As DataSet
Dim resultado As New DataSet

Dim Cn As New NpgsqlConnection(Configuracion.ObtenerInstancia.Co nnectionString)
Dim Cmd As New NpgsqlCommand()

Cmd.Connection = Cn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = nombreFuncion
For Each parametro As ParametroNpgsql In parametros
Dim nuevoParametro As New NpgsqlParameter
nuevoParametro.Value = parametro.Valor
nuevoParametro.NpgsqlDbType = parametro.Tipo
Cmd.Parameters.Add(nuevoParametro)
Next
Dim Da As New NpgsqlDataAdapter(Cmd)
Da.Fill(resultado)
'Cn.Close()
Return resultado
End Function
End Class


Public Class ParametroNpgsql
Private _tipo As NpgsqlTypes.NpgsqlDbType
Private _valor As Object

Public Property Tipo() As NpgsqlTypes.NpgsqlDbType
Get
Return _tipo
End Get
Set(ByVal value As NpgsqlTypes.NpgsqlDbType)
_tipo = value
End Set
End Property
Public Property Valor() As Object
Get
Return _valor
End Get
Set(ByVal value As Object)
_valor = value
End Set
End Property

Public Sub New(ByVal tipo As NpgsqlTypes.NpgsqlDbType, ByVal valor As Object)
Me.Tipo = tipo
Me.Valor = valor
End Sub
End Class

Bueno espero haber sido mas claro y poder solucionar el problema. Desde ya muchas Gracias!!!
  #11 (permalink)  
Antiguo 23/09/2009, 07:41
 
Fecha de Ingreso: septiembre-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Solución

Bueno gente, veo que nadie mas aportó ideas al tema, por supuesto yo seguí trabajando y llegué a una conclusión. La realidad de la milanesa es que postgres , por lo menos en la versión 8.3.5 , no soporta transactionScope o podemos verlo al revés , Microsoft no compatibilizó su herramienta con nuestro amigo elefantecito azul. En fin lo probé en sql server y funciona de maravillas con capas y todo. No necesite la librería Enterprise ni nada de eso. Bueno espero les sirva de algo a cualquiera que esté pasando por el mismo problema.
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 14:27.