Principales respuestas
transaction scope

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
Respuestas
-
Hola:
Prueba estoPublic 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
-
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
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
-
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
-
Hola:
Prueba estoPublic 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