none
TransactionScope en 3 capas RRS feed

  • Pregunta

  • Buenas noches a todos queria hacerles una consulta, espero q me puedan guiar.

    Estoy trabajando con 3 capas ( o eso almenos intento :D ), un sistema de ventas, por ejemplo este codigo se ejecuta al momento de hacer click en Grabar la Compra por ejemplo tiene mas cosas pero es un codigo simplificado para q me puedan entender.

    CAPA PRESENTACION

    Dim Detalle As New DetalleMovimientoBL Dim Movimiento As New MovimientoBL Dim Producto As New ProductoBL Try If Movimiento.Agregar(mtxtDNI.Text, Date.Now, Date.Now, diTotal.Value, diSaldo.Value, IIf(Text = "Compra", 1, 0), cboTipoPago.SelectedIndex, Nothing) Then

    Dim EstadoCuenta As New EstadoCuentaBL
                            Dim Amortizacion As New AmortizacionBL If Amortizacion.Agregar(Var1, Var2, …) Then Dim LastAmortizacion As Integer = Amortizacion.ObtenerNumUltAmortizacion If EstadoCuenta.Agregar(Var1, Var2, …) Then MessageBox.Show("Se Registro Una Nueva "), Empresa, MessageBoxButtons.OK, MessageBoxIcon.Information) Else MsgBox("No se grabo la deuda hubo un error.") End If End If End If Dim Cta As New CuentaBL If Cta.Registrar(cboCuentas.SelectedValue, mtxtDNI.Text, diAbono.Value, IIf(Text = "Compra", 1, 0)) Then MsgBox("Se Registro Pago")

                        Movimiento.Commit()
                        Movimiento.Dispose() End If End If Catch ex As Exception

    Movimiento.Dispose() MsgBox("Hubo un error: " & ex.Message) End Try

    CAPA NEGOCIO

    Solo puse la clase movimiento ya q de las demas clases es similar retorna un valor booleano y bueno les puse de relleno VAR1, etc... en ves del nombre de las variables reales para q me puedan entender ya q practicamente se repite,  obviamente q mi codigo

    Imports Data
    Imports System.Transactions
    Public Class MovimientoBL
        Dim ts As TransactionScope
        Sub Commit()
            ts.Complete()
        End Sub
        Sub Dispose()
            ts.Dispose()
        End Sub Dim Movimiento As New clsMovimiento Function Agregar(ByVal CodigoCliente As String, ByVal FechaEmision As Date, ByVal FechaVencimiento As Date, ByVal Total As Decimal, ByVal Saldo As Decimal, ByVal TipoProceso As UShort, ByVal TipoDeuda As UShort, ByVal Observacion As String) As Boolean

    ts = New TransactionScope Movimiento.CodigoCliente = CodigoCliente Movimiento.FechaEmision = FechaEmision Movimiento.FechaVencimiento = FechaVencimiento Movimiento.Total = Total Movimiento.Saldo = Saldo Movimiento.TipoProceso = TipoProceso Movimiento.TipoDeuda = TipoDeuda Movimiento.Observacion = Observacion Return Movimiento.Agregar() End Function End Class

    CAPA DATO


    Public Class clsMovimiento Dim cn As New ConMySql(User, Pass) Private _NumeroMovimiento As String Private _Var1 As String Private _Var2 As String Property NumeroMovimiento As String Get Return _NumeroMovimiento End Get Set(ByVal value As String) _NumeroMovimiento = value End Set End Property Property Var1 As String Get Return _ Var1 End Get Set(ByVal value As String) _ Var1 = value End Set End Property Property Var2 As Date Get Return _ Var2 End Get Set(ByVal value As Date) _ Var2 = value End Set End Property Function Agregar() As Boolean cn.Ejecutar("INSERT INTO movimiento VALUES (NULL, '" & _ NumeroMovimiento & "', '" & _var1.ToString("yyyy-MM-dd HH:mm:ss") & "', '" & _var2.ToString("yyyy-MM-dd ')", "ENQ") If cn.resultado = 1 Then Return True Else Return False End If End Function End Class ''' AQUI ESTA LA OTRA CLASE CONMYSQL Imports MySql.Data.MySqlClient Public Class ConMySql Public cadCadena As MySqlConnection, DA As MySqlDataAdapter, DS As DataSet, cmd As MySqlCommand, _ resultado As String, objRegist As DataRow Sub New(ByVal Usuario As String, ByVal Clave As String) cadCadena = New MySqlConnection("Server=XXXXX; Port=XXXX; Database=XXXX; Uid=" & Usuario & "; Pwd=" & Clave) cmd = New MySqlCommand(Nothing, cadCadena) End Sub Sub Ejecutar(ByVal cmdSql As String, Optional ByVal Modo As String = "DAR", Optional ByVal NombreTabla As String = "OUT") Try If Modo.ToUpper.Trim = "ENQ" Then cmd.CommandText = cmdSql cmd.CommandType = CommandType.Text cmd.Connection.Open() resultado = cmd.ExecuteNonQuery() cmd.Connection.Close() End If Catch ex As Exception MsgBox(ex.Message, vbOKOnly, "INFORMACION SISTEMA") If cmd IsNot Nothing Then cmd.Connection.Close() End If End Try End Sub End Class

    Bueno como veran el proceso afecta varias tablas de la BD entonces vi por conveniente usar transacciones para el congruencia e integridad de datos, es donde encontre TransactionScope.

    Es ahi donde esta mi duda no se si este bien o no de la forma que hice, deberia de hacerlo con "Using" y en la capa de negocio pero como lo tengo estructurado yo no se puede ( o al menos eso creo ).
    Estare agradecido de cualquier alcance que me puedan dar, leere todas las opiniones y consejos, gracias.

    viernes, 8 de julio de 2016 2:22