none
transaction scope RRS feed

  • Pregunta

  • Public Sub insertar_nueva_Matricula()
    
            Using cnn As New SqlConnection(configuracion.ConnectionString)
                Dim cmd As New SqlCommand("SP_INSERTAR_MATRICULA", cnn)
                cmd.CommandType = CommandType.StoredProcedure
                With cmd.Parameters
    
                    .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                    .AddWithValue("@Fecha_Matricula", DateTime.Now.ToShortDateString)
                    '.AddWithValue("@Fecha", DateTime.Now.ToString("MM/dd/yyyy"))
                    .AddWithValue("@Num_Estudiante", Me.txtnumestudiante.Text)
                    .AddWithValue("@Termino", Me.txtterminoacademico.Text)
                    .AddWithValue("@Num_Curso", Me.txtcurso.Text)
                    .AddWithValue("@Semestre", Me.txtsemestrematricula.Text)
                    .AddWithValue("@Candidato_Graduacion", Me.chkcandidatograduacion.Checked)
                End With
                Try
                    cnn.Open()
                    cmd.ExecuteNonQuery()
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                Finally
                    cmd.Dispose()
                End Try
            End Using
    
            Using cnn As New SqlConnection(configuracion.ConnectionString)
                cnn.Open()
                Dim cmd As New SqlCommand("SP_INSERTAR_MATRICULA_DETALLES", cnn)
                cmd.CommandType = CommandType.StoredProcedure
                For Each row As DataGridViewRow In datagridlista.SelectedRows
                    cmd.Parameters.Clear()
                    With cmd.Parameters
                        .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                        .AddWithValue("@Codigo_Clase", Convert.ToString(row.Cells("Codigo_Clase").Value))
                        .AddWithValue("@Creditos_Clases", Convert.ToString(row.Cells("Creditos_Clase")))
                        .AddWithValue("@Profesor", Convert.ToString(row.Cells("Profesor")))
                        .AddWithValue("@Seccion", Convert.ToString(row.Cells("Seccion").Value))
                        .AddWithValue("@Baja", Convert.ToBoolean(chkbaja.Checked))
                        .AddWithValue("@Tipo_Baja", String.Empty)
                        .AddWithValue("@Motivo_Baja", DBNull.Value)
                        .AddWithValue("@Fecha_Baja", DBNull.Value)
                    End With
                    Try
                        cmd.ExecuteNonQuery()
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    Finally
                        cmd.Dispose()
                    End Try
                Next
            End Using
        End Sub
    tengo el siguiente metodo y necesito encerrarlo dentro de un transaction scope.... Gracias
    viernes, 24 de noviembre de 2017 19:25

Respuestas

  • Hola:
    Prueba esto
    Public Sub insertar_nueva_Matricula()
      Try
        'Iniciamos una transaccion
         Using MiTransaccion As New Transactions.TransactionScope()
            Using cnn As New SqlConnection(configuracion.ConnectionString)
                cnn.Open()
                Using  cmd As New SqlCommand("SP_INSERTAR_MATRICULA", cnn)
                   cmd.CommandType = CommandType.StoredProcedure
                   With cmd.Parameters
                       .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                       .AddWithValue("@Fecha_Matricula", DateTime.Now.ToShortDateString)
                       '.AddWithValue("@Fecha", DateTime.Now.ToString("MM/dd/yyyy"))
                       .AddWithValue("@Num_Estudiante", Me.txtnumestudiante.Text)
                       .AddWithValue("@Termino", Me.txtterminoacademico.Text)
                       .AddWithValue("@Num_Curso", Me.txtcurso.Text)
                       .AddWithValue("@Semestre", Me.txtsemestrematricula.Text)
                       .AddWithValue("@Candidato_Graduacion", Me.chkcandidatograduacion.Checked)
                   End With
                End Using
                Using cmd As New SqlCommand("SP_INSERTAR_MATRICULA_DETALLES", cnn)
                   cmd.CommandType = CommandType.StoredProcedure
                   For Each row As DataGridViewRow In datagridlista.SelectedRows
                       cmd.Parameters.Clear()
                       With cmd.Parameters
                           .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                           .AddWithValue("@Codigo_Clase", Convert.ToString(row.Cells("Codigo_Clase").Value))
                           .AddWithValue("@Creditos_Clases", Convert.ToString(row.Cells("Creditos_Clase")))
                           .AddWithValue("@Profesor", Convert.ToString(row.Cells("Profesor")))
                           .AddWithValue("@Seccion", Convert.ToString(row.Cells("Seccion").Value))
                           .AddWithValue("@Baja", Convert.ToBoolean(chkbaja.Checked))
                           .AddWithValue("@Tipo_Baja", String.Empty)
                           .AddWithValue("@Motivo_Baja", DBNull.Value)
                           .AddWithValue("@Fecha_Baja", DBNull.Value)
                       End With
                   Next
               End Using
            End Using
            MiTransaccion.Complete()
         End Using
      Catch ex As Exception
          MessageBox.Show(ex.Message)
      End Try
    End Sub
       
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Efrain Diaz sábado, 25 de noviembre de 2017 11:01
    viernes, 24 de noviembre de 2017 20:44
  • Para encerarlo en un TransactionScope, simplemente lo declaras al principio, metes todo el código y llamas la método Complete del transactionScope si queres hacer un commit, o le haces un Dispose() si quieres un rollback. Lo más conveniente es usar para ello un "using":

    Using tran As New TransactionScope()
      Try
        ' --- Aquí todo el código que tenías dentro del procedimiento
        tran.Complete();
      Catch
        '... Aquí tratamiento de errores si es que lo requieres
        ' no se necesita rollback porque ocurre automáticamente al llegar al end using sin haber ejecutado el Complete
      End Catch
    End Using


    Editado: Dicho lo anterior, cabe señalar que en este caso concreto usar un TransactionScope es "usar más fuerza de la necesaria". Tu código usa la misma conexión en los dos bloques, por lo que sería suficiente con abrirla una sola vez en vez de dos y aplicar un vulgar SqlTransaction, en lugar de recurrir al TransactionScope.
    • Editado Alberto PoblacionMVP viernes, 24 de noviembre de 2017 20:44
    • Propuesto como respuesta Marcelo PF viernes, 24 de noviembre de 2017 20:53
    • Marcado como respuesta Efrain Diaz sábado, 25 de noviembre de 2017 11:01
    viernes, 24 de noviembre de 2017 20:41

Todas las respuestas

  • Para encerarlo en un TransactionScope, simplemente lo declaras al principio, metes todo el código y llamas la método Complete del transactionScope si queres hacer un commit, o le haces un Dispose() si quieres un rollback. Lo más conveniente es usar para ello un "using":

    Using tran As New TransactionScope()
      Try
        ' --- Aquí todo el código que tenías dentro del procedimiento
        tran.Complete();
      Catch
        '... Aquí tratamiento de errores si es que lo requieres
        ' no se necesita rollback porque ocurre automáticamente al llegar al end using sin haber ejecutado el Complete
      End Catch
    End Using


    Editado: Dicho lo anterior, cabe señalar que en este caso concreto usar un TransactionScope es "usar más fuerza de la necesaria". Tu código usa la misma conexión en los dos bloques, por lo que sería suficiente con abrirla una sola vez en vez de dos y aplicar un vulgar SqlTransaction, en lugar de recurrir al TransactionScope.
    • Editado Alberto PoblacionMVP viernes, 24 de noviembre de 2017 20:44
    • Propuesto como respuesta Marcelo PF viernes, 24 de noviembre de 2017 20:53
    • Marcado como respuesta Efrain Diaz sábado, 25 de noviembre de 2017 11:01
    viernes, 24 de noviembre de 2017 20:41
  • un ejemplo

    Try
                            Using scope_Gae As New TransactionScope
                                Using cn_Gae As New MySqlConnection(s_cadenaRusticaAuditoria)
                                    cn_Gae.Open()
                                    Using cmd As New MySqlCommand(Sql_NoGae, cn_Gae)
                                        cmd.CommandTimeout = 0
                                        cmd.CommandType = CommandType.Text
                                        cmd.ExecuteNonQuery()
                                    End Using
                                End Using
                                scope_Gae.Complete()
                            End Using
                        Catch ex As Exception

                        End Try

     
    • Editado Anis_1 viernes, 24 de noviembre de 2017 20:43
    viernes, 24 de noviembre de 2017 20:42
  • Hola:
    Prueba esto
    Public Sub insertar_nueva_Matricula()
      Try
        'Iniciamos una transaccion
         Using MiTransaccion As New Transactions.TransactionScope()
            Using cnn As New SqlConnection(configuracion.ConnectionString)
                cnn.Open()
                Using  cmd As New SqlCommand("SP_INSERTAR_MATRICULA", cnn)
                   cmd.CommandType = CommandType.StoredProcedure
                   With cmd.Parameters
                       .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                       .AddWithValue("@Fecha_Matricula", DateTime.Now.ToShortDateString)
                       '.AddWithValue("@Fecha", DateTime.Now.ToString("MM/dd/yyyy"))
                       .AddWithValue("@Num_Estudiante", Me.txtnumestudiante.Text)
                       .AddWithValue("@Termino", Me.txtterminoacademico.Text)
                       .AddWithValue("@Num_Curso", Me.txtcurso.Text)
                       .AddWithValue("@Semestre", Me.txtsemestrematricula.Text)
                       .AddWithValue("@Candidato_Graduacion", Me.chkcandidatograduacion.Checked)
                   End With
                End Using
                Using cmd As New SqlCommand("SP_INSERTAR_MATRICULA_DETALLES", cnn)
                   cmd.CommandType = CommandType.StoredProcedure
                   For Each row As DataGridViewRow In datagridlista.SelectedRows
                       cmd.Parameters.Clear()
                       With cmd.Parameters
                           .AddWithValue("@Num_Matricula", Me.txtidmatricula.Text)
                           .AddWithValue("@Codigo_Clase", Convert.ToString(row.Cells("Codigo_Clase").Value))
                           .AddWithValue("@Creditos_Clases", Convert.ToString(row.Cells("Creditos_Clase")))
                           .AddWithValue("@Profesor", Convert.ToString(row.Cells("Profesor")))
                           .AddWithValue("@Seccion", Convert.ToString(row.Cells("Seccion").Value))
                           .AddWithValue("@Baja", Convert.ToBoolean(chkbaja.Checked))
                           .AddWithValue("@Tipo_Baja", String.Empty)
                           .AddWithValue("@Motivo_Baja", DBNull.Value)
                           .AddWithValue("@Fecha_Baja", DBNull.Value)
                       End With
                   Next
               End Using
            End Using
            MiTransaccion.Complete()
         End Using
      Catch ex As Exception
          MessageBox.Show(ex.Message)
      End Try
    End Sub
       
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Efrain Diaz sábado, 25 de noviembre de 2017 11:01
    viernes, 24 de noviembre de 2017 20:44