none
Como utilizar el transaction scope

    Pregunta

  • tengo varios metodos en mi proyecto con esta misma estructura de codigo donde se actualizan varias tablas dentro de un solo metodo, la pregunta es como puedo utilizer el transaction scope en este metodo
    Public Sub actualizar_asistencia()
            Try
                Dim uno As Int16 = 1
                Dim cero As Int16 = 0
    
                Using cnn As New SqlConnection(configuracion.ConnectionString)
                    cnn.Open()
                    Dim cmd As SqlCommand = cnn.CreateCommand()
                    For Each row As DataGridViewRow In datagridasistencia.Rows
                        cmd.Parameters.Clear()
                        cmd.CommandText = "UPDATE Asistencia_Estudiantes Set Asistencia=@Asistencia,Fecha_Asistencia=@Fecha_Asistencia," & _
                            "Fecha_Ausencia=@Fecha_Ausencia,Fecha_Dia=@Fecha_Dia " & _
                            "where Num_Estudiante=@Num_Estudiante and Codigo_Clase=@Codigo_Clase and Sesion=@Sesion and Sesion_Clase=@Sesion_Clase and Termino=@Termino and Fecha_Dia=@Fecha_Dia "
    
                        With cmd.Parameters
    
                            .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                            .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                            .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                            .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                            .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                            .AddWithValue("@Fecha_Dia", CDate(mtbfechaasistencia.Text).ToShortDateString)
    
                            If CBool(row.Cells("Asistencia").Value = True) Then
                                .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                .AddWithValue("@Fecha_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                .AddWithValue("@Fecha_Ausencia", DBNull.Value)
                                .AddWithValue("Ausencias", cero)
                            Else
                                .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                .AddWithValue("@Fecha_Asistencia", DBNull.Value)
                                .AddWithValue("@Fecha_Ausencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                .AddWithValue("@Ausencias", uno)
                            End If
                        End With
                        cmd.ExecuteNonQuery()
                    Next
                    cnn.Close()
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
            Using cnn As New SqlConnection(configuracion.ConnectionString)
                cnn.Open()
                Dim cmd As SqlCommand = cnn.CreateCommand()
                For Each row As DataGridViewRow In datagridasistencia.Rows
                    If CBool(row.Cells("Asistencia").Value = True) Then
                        cmd.Parameters.Clear()
                        cmd.CommandText =
                            "UPDATE Matricula_Detalles_Tabla " & _
                            "SET Ultima_Asistencia=@Ultima_Asistencia " & _
                            "WHERE Num_Estudiante=@Num_Estudiante AND Codigo_Clase=@Codigo_Clase AND Sesion=@Sesion AND Sesion_Clase=@Sesion_Clase AND Termino=@Termino"
    
                        With cmd.Parameters
                            .AddWithValue("@Ultima_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                            .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                            .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                            .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                            .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                            .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                        End With
                        cmd.ExecuteNonQuery()
                    End If
                Next
            End Using
    
            MessageBox.Show("Se Actualizo la asistencia correctamente")
    
            Clase_Limpiar_Datos.Limpiar(Me.Controls)
            datagridasistencia.DataSource = Nothing
            Me.DateTimePicker1.ResetText()
            Me.mtbfechaasistencia.Text = String.Empty
            txtcodigoclase.Focus()
            nu = 0
    
        End Sub

    miércoles, 15 de febrero de 2017 21:28

Respuestas

  • Hola:
    Prueba con esto

        Public Sub actualizar_asistencia()
            Try
                Dim uno As Int16 = 1
                Dim cero As Int16 = 0

                Using cnn As New SqlConnection("TU_CANEA_DE_CONEXION")
                    cnn.Open()
                    'Agregar referencia a System.Transactions
                    Using MiTransaccion As New TransactionScope
                        Dim lsQuery As String = "UPDATE Asistencia_Estudiantes Set Asistencia=@Asistencia, Fecha_Asistencia=@Fecha_Asistencia, Fecha_Ausencia=@Fecha_Ausencia, Fecha_Dia=@Fecha_Dia where Num_Estudiante=@Num_Estudiante and Codigo_Clase=@Codigo_Clase and Sesion=@Sesion and Sesion_Clase=@Sesion_Clase and Termino=@Termino and Fecha_Dia=@Fecha_Dia"
                        'PRIMER CICLO
                        For Each row As DataGridViewRow In datagridasistencia.Rows
                            Using cmd As New SqlCommand(lsQuery, cnn)
                                With cmd.Parameters
                                    .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                                    .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                                    .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                                    .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                                    .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                                    .AddWithValue("@Fecha_Dia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                    If CBool(row.Cells("Asistencia").Value = True) Then
                                        .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                        .AddWithValue("@Fecha_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Fecha_Ausencia", DBNull.Value)
                                        .AddWithValue("Ausencias", cero)
                                    Else
                                        .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                        .AddWithValue("@Fecha_Asistencia", DBNull.Value)
                                        .AddWithValue("@Fecha_Ausencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Ausencias", uno)
                                    End If
                                End With
                                cmd.ExecuteNonQuery()
                            End Using
                        Next
                        'SEGUNDO CICLO
                        lsQuery = "UPDATE Matricula_Detalles_Tabla SET Ultima_Asistencia=@Ultima_Asistencia WHERE Num_Estudiante=@Num_Estudiante AND Codigo_Clase=@Codigo_Clase AND Sesion=@Sesion AND Sesion_Clase=@Sesion_Clase AND Termino=@Termino"
                        For Each row As DataGridViewRow In datagridasistencia.Rows
                            If CBool(row.Cells("Asistencia").Value = True) Then
                                Using cmd As New SqlCommand(lsQuery, cnn)
                                    With cmd.Parameters
                                        .AddWithValue("@Ultima_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                                        .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                                        .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                                        .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                                        .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                                    End With
                                    cmd.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                        'FINAL DE MODIFICACIONES, SE CIERRA LA TRANSACCION
                        MiTransaccion.Complete()
                    End Using
                End Using
                MessageBox.Show("Se Actualizo la asistencia correctamente")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Efrain Diaz jueves, 16 de febrero de 2017 22:01
    jueves, 16 de febrero de 2017 12:16

Todas las respuestas

  • Efrain Diaz,

    Si ambas operaciones las quieres tomar como una unidad operacional (transacción) no tiene mayor sentido abrir dos conexiones, de hecho el ámbito de la transacción está limitado al ámbito de la conexión. Te dejo un enlace con algo de teoría y un ejemplo práctico:

    Transacciones locales


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 16 de febrero de 2017 3:12
  • Puedes rodearlo todo con un bloque asi:

    Using tran As New TransactionScope()
        ' Aqui tus sentencias
        tran.Commit()
    End Using

    PERO: Dado que usas dos conexiones, el TransactionScope tendra que escalar la transaccion para convertirla en transaccion distribuida, y esto requerira que tengas activado el DTC (coordinador de transacciones distribuidas) y abiertos los puertos correspondientes en el cortafuegos. No vale la pena introducir esa complejidad para un codigo tan simple como este, es preferible que lo hagas todo en una sola conexion tal como sugeria Williams Morales en la respuesta anterior.

    Y ya puestos a hacerlo en una sola conexion, puedes llamar a .BeginTransaction() sobre esa conexion y ahorrarte el TransactionScope.

    jueves, 16 de febrero de 2017 12:00
  • Hola:
    Prueba con esto

        Public Sub actualizar_asistencia()
            Try
                Dim uno As Int16 = 1
                Dim cero As Int16 = 0

                Using cnn As New SqlConnection("TU_CANEA_DE_CONEXION")
                    cnn.Open()
                    'Agregar referencia a System.Transactions
                    Using MiTransaccion As New TransactionScope
                        Dim lsQuery As String = "UPDATE Asistencia_Estudiantes Set Asistencia=@Asistencia, Fecha_Asistencia=@Fecha_Asistencia, Fecha_Ausencia=@Fecha_Ausencia, Fecha_Dia=@Fecha_Dia where Num_Estudiante=@Num_Estudiante and Codigo_Clase=@Codigo_Clase and Sesion=@Sesion and Sesion_Clase=@Sesion_Clase and Termino=@Termino and Fecha_Dia=@Fecha_Dia"
                        'PRIMER CICLO
                        For Each row As DataGridViewRow In datagridasistencia.Rows
                            Using cmd As New SqlCommand(lsQuery, cnn)
                                With cmd.Parameters
                                    .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                                    .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                                    .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                                    .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                                    .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                                    .AddWithValue("@Fecha_Dia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                    If CBool(row.Cells("Asistencia").Value = True) Then
                                        .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                        .AddWithValue("@Fecha_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Fecha_Ausencia", DBNull.Value)
                                        .AddWithValue("Ausencias", cero)
                                    Else
                                        .AddWithValue("@Asistencia", CBool(row.Cells("Asistencia").Value))
                                        .AddWithValue("@Fecha_Asistencia", DBNull.Value)
                                        .AddWithValue("@Fecha_Ausencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Ausencias", uno)
                                    End If
                                End With
                                cmd.ExecuteNonQuery()
                            End Using
                        Next
                        'SEGUNDO CICLO
                        lsQuery = "UPDATE Matricula_Detalles_Tabla SET Ultima_Asistencia=@Ultima_Asistencia WHERE Num_Estudiante=@Num_Estudiante AND Codigo_Clase=@Codigo_Clase AND Sesion=@Sesion AND Sesion_Clase=@Sesion_Clase AND Termino=@Termino"
                        For Each row As DataGridViewRow In datagridasistencia.Rows
                            If CBool(row.Cells("Asistencia").Value = True) Then
                                Using cmd As New SqlCommand(lsQuery, cnn)
                                    With cmd.Parameters
                                        .AddWithValue("@Ultima_Asistencia", CDate(mtbfechaasistencia.Text).ToShortDateString)
                                        .AddWithValue("@Num_Estudiante", Convert.ToString(row.Cells("Num_Estudiante").Value))
                                        .AddWithValue("@Codigo_Clase", Convert.ToString(txtcodigoclase.Text))
                                        .AddWithValue("@Sesion", Convert.ToString(txtseccion.Text))
                                        .AddWithValue("@Sesion_Clase", Convert.ToString(txtsesionclase.Text))
                                        .AddWithValue("@Termino", Convert.ToString(txttermino.Text))
                                    End With
                                    cmd.ExecuteNonQuery()
                                End Using
                            End If
                        Next
                        'FINAL DE MODIFICACIONES, SE CIERRA LA TRANSACCION
                        MiTransaccion.Complete()
                    End Using
                End Using
                MessageBox.Show("Se Actualizo la asistencia correctamente")
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Efrain Diaz jueves, 16 de febrero de 2017 22:01
    jueves, 16 de febrero de 2017 12:16