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

Como utilizar SqlTransaction

Estas en el tema de Como utilizar SqlTransaction en el foro de .NET en Foros del Web. Saludos! Haber si alguien puede ayudarme. Estoy trabajando con una tabla que la cargo en un "datatable", en el que puede añadir una fila o ...
  #1 (permalink)  
Antiguo 14/12/2011, 04:50
 
Fecha de Ingreso: julio-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Como utilizar SqlTransaction

Saludos!
Haber si alguien puede ayudarme.
Estoy trabajando con una tabla que la cargo en un "datatable", en el que puede añadir una fila o modificar otra.
El caso es que al añadirla utilizo el siguiente código donde:
---------------------------------------------------------------------------------------------
'Guarda linea
(dtasql es el SqlDataAdapter , dtbsql es el Datatable)
Dim trans as sqltransaction
Dim cmdSql as new SqlCommand


trans = cnn.BeginTransaction(IsolationLevel.ReadCommitted)
cmdSQL.Transaction = trans

FilaNueva = dtbSQL.NewRow
FilaNueva!IdCentro = NumCentro
FilaNueva!Ip = MiIP
FilaNueva!Lin = lngLinea
FilaNueva!IdArticulo = Me.txtCod.Text
FilaNueva!NombreArticulo = Me.txtDesc.Text
FilaNueva!NomColor = Me.txtColor.Text
FilaNueva!NomTalla = Me.txtTalla.Text
FilaNueva!Cantidad = CLng(txtUni.Text)
dtbSQL.Rows.Add(FilaNueva)

dtaSQL.Update(dtbSQL)
dtbSQL.AcceptChanges()
trans.Commit()
---------------------------------------------------------------------------------------------

El problema es que abro el programa, guardo una linea y no hay problemas, pero cuando intento guardar las siguientes me sale el famoso error: "executenonquery requiere que el comando tenga una transaccion...."
Cierro el programa lo vuelvo abrir y otra vez, la primera la guarda pero las siguientes no.
He visto que cuando llega a dtasql.Update(dtbsql) salta el error.
Alguien podría echarme una mano?
muchas gracias y que paséis un buen día.
  #2 (permalink)  
Antiguo 14/12/2011, 09:29
Avatar de drako_darpan  
Fecha de Ingreso: octubre-2008
Ubicación: Sinaloa
Mensajes: 617
Antigüedad: 15 años, 6 meses
Puntos: 58
Respuesta: Como utilizar SqlTransaction

Hola que tal, bueno el Begin Transaction lo que hace es un bloque en el servidor para que el pueda realizar una accion y en ese tiempo el servidor sera ocupado por dicha transaccion.

Yo te recomendaria, aunque suene algo monotono, usa SP lo cual te facilita mas la vida y no tienes que hacer mucha carga de codigo en el fuente.

Una cosas, una vez que creaste el BEGIN TRANSACTION T1 ( en SQL ), tiene que haber un COMMIT TRANSACTION T1 o ROLLBACK TRANSACTION T1, esto es por que sino la transaccion sigue retenida y no puede hacer nada mas.

El T1 es un alias
  #3 (permalink)  
Antiguo 28/12/2011, 09:09
 
Fecha de Ingreso: julio-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como utilizar SqlTransaction

Gracias por la respuesta pero por me gustaría hacerlo por código ya que me parece extraño que me salga ese error.
Como tu dices es necesario que haya un COMMIT O ROLLBACK y yo en ese caso utilizo el COMMIT como puedes ver arriba y en la parte de controlar errores lanzo el ROLLBACK. Queda de esta manera
Dim cnn as new SqlConnection
Dim dtbSql as new DataTable
Dim trans as sqltransaction
Dim cmdSql as new SqlCommand

try
trans = cnn.BeginTransaction(IsolationLevel.ReadCommitted)
cmdSQL.Transaction = trans

FilaNueva = dtbSQL.NewRow
FilaNueva!IdCentro = NumCentro
FilaNueva!Ip = MiIP
FilaNueva!Lin = lngLinea
FilaNueva!IdArticulo = Me.txtCod.Text
FilaNueva!NombreArticulo = Me.txtDesc.Text
FilaNueva!NomColor = Me.txtColor.Text
FilaNueva!NomTalla = Me.txtTalla.Text
FilaNueva!Cantidad = CLng(txtUni.Text)
dtbSQL.Rows.Add(FilaNueva)

dtaSQL.Update(dtbSQL)
dtbSQL.AcceptChanges()
trans.Commit()
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Mensaje de error")
Try
trans.Rollback()
Catch err As Exception
MsgBox(err.Message, MsgBoxStyle.Exclamation, "Mensaje de error")
End Try
End Try

Es como si solo pudiera pasar una vez por el código. Una vez funciona pero dos ya no....
Si me pudieran decir al menos porque causa el error.
Gracias de antemano y lo siento por la tardanza en contestar pero ya se sabe. Estamos en fiestas y eh estado liado
  #4 (permalink)  
Antiguo 29/12/2011, 11:50
Avatar de drako_darpan  
Fecha de Ingreso: octubre-2008
Ubicación: Sinaloa
Mensajes: 617
Antigüedad: 15 años, 6 meses
Puntos: 58
Respuesta: Como utilizar SqlTransaction

Hola que tal, lo que puedes hacer es que una vez que ya se ejecuto la operacion cierres la conexion y cuando ocupes volver a grabar el registro la abras de nuevo .

Lo que puede estar pasando es que la conexion se este quedando pegada.

Encontre esta pagina, haber si te sirve:

http://www.elguille.info/colabora/pu...asEnAccess.htm

  #5 (permalink)  
Antiguo 29/12/2011, 14:29
Avatar de edbc92  
Fecha de Ingreso: octubre-2010
Ubicación: Lima - Los Olivos
Mensajes: 93
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: Como utilizar SqlTransaction

Haber, para empezar el lugar adecuado del rollback es colocarlo a la hora que te agarra la excepción, para que no uses doble try...

Y bueno un ejemplo de una transacción es esta:

Código vb:
Ver original
  1. Dim cn as new sqlconnection(strcn)
  2. dim tx as sqltransaction
  3.  
  4. try
  5. cn.open
  6.  
  7. tx=cn.begintransaction
  8.  
  9. sql="insert into encabezadoFact values (@cod,@etc)"
  10.  
  11. dim cmd as new sqlcommand(sql,cn,tx) 'Fijate que se pasan estos 3 valores
  12. cmd.parameters.addwithvalue("@cod",lblcod.text)
  13. cmd.parameters.addwithvalue("@etc",txtetc.text)
  14.  
  15. cmd.executenonquery
  16.  
  17. tx.commit
  18.  
  19. catch ex as exception
  20. tx.rollback
  21. msgbox(ex.message)
  22. finally
  23. cn.close
  24. end try

Quizás te aparezca algunos de esos con subrayado verde, algo que diga parecido a esto: Se hará caso omisa a la hora de ejecución; algo asi recuerdo...Ejecuta tu programa no pasa nada si es que aparece eso...

En fin, espero que te sirva...
__________________
"Por medio de la perseverancia el caracol llegó al arca."
CHARLES SPURGEON
  #6 (permalink)  
Antiguo 30/12/2011, 04:24
 
Fecha de Ingreso: julio-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como utilizar SqlTransaction

Cita:
Iniciado por edbc92 Ver Mensaje
Haber, para empezar el lugar adecuado del rollback es colocarlo a la hora que te agarra la excepción, para que no uses doble try...

Y bueno un ejemplo de una transacción es esta:

Código vb:
Ver original
  1. Dim cn as new sqlconnection(strcn)
  2. dim tx as sqltransaction
  3.  
  4. try
  5. cn.open
  6.  
  7. tx=cn.begintransaction
  8.  
  9. sql="insert into encabezadoFact values (@cod,@etc)"
  10.  
  11. dim cmd as new sqlcommand(sql,cn,tx) 'Fijate que se pasan estos 3 valores
  12. cmd.parameters.addwithvalue("@cod",lblcod.text)
  13.  
  14.  
  15.  
  16. cmd.parameters.addwithvalue("@etc",txtetc.text)
  17.  
  18. cmd.executenonquery
  19.  
  20. tx.commit
  21.  
  22. catch ex as exception
  23. tx.rollback
  24. msgbox(ex.message)
  25. finally
  26. cn.close
  27. end try

Quizás te aparezca algunos de esos con subrayado verde, algo que diga parecido a esto: Se hará caso omisa a la hora de ejecución; algo asi recuerdo...Ejecuta tu programa no pasa nada si es que aparece eso...

En fin, espero que te sirva...
Gracias por la respuesta.
Veras hice lo que me dijeron y tampoco. Cierro la conexión, la vuelvo abrir pero sigue saliendo el error de:
"ExecuteNonQuery requiere que el comando tenga una transacción cuando la conexión asignada al mismo esta en una transacción local pendiente. No se ha inicializado la propiedad transaction del comando"
La verdad es que no entiendo porque me pone esto si justo antes de asignar los valores del DataRow le digo a la base de datos que voy a comenzar una transacción y al command le asigno la transacción.
Porque me dice que el comando requiere una transacción si ya se la asigno.
El programa trabaja con un tabla que se muestra en un datagridview asociado a un DataAdapter en el que inserto una fila o cambio los valores de una fila i luego lanzo el DataAdapter.Update(DataTable)
A lo mejor esto puede seros de ayuda.
Gracias a todos por ayudarme
  #7 (permalink)  
Antiguo 30/12/2011, 10:20
Avatar de drako_darpan  
Fecha de Ingreso: octubre-2008
Ubicación: Sinaloa
Mensajes: 617
Antigüedad: 15 años, 6 meses
Puntos: 58
Respuesta: Como utilizar SqlTransaction

Hola que tal, puedes debugear el programa y ver donde o en que momento sale la Excepcion.

Yo creo que el error puede estar en los 2 try.

Código VB:
Ver original
  1. Try
  2.     dtaSQL.Update(dtbSQL)
  3.     dtbSQL.AcceptChanges()
  4.     trans.Commit()
  5.    
  6.     Catch err As Exception
  7.         trans.Rollback()
  8.         MsgBox(err.Message, MsgBoxStyle.Exclamation, "Mensaje de error")
  9. End Try

Intenta dejandolo asi, a lo mejor tienes un error por algun catch. La otra es puedes identificar con

Código VB:
Ver original
  1. Try
  2.     dtaSQL.Update(dtbSQL)
  3.     dtbSQL.AcceptChanges()
  4.     trans.Commit()
  5.     Catch ex As Exception
  6.     MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Mensaje de error...1")
  7.    
  8.         Catch err As Exception
  9.             trans.Rollback()
  10.             MsgBox(err.Message, MsgBoxStyle.Exclamation, "Mensaje de error...2")
  11. End Try

Para ver cual es el error que se esta ejecutando primero.
  #8 (permalink)  
Antiguo 02/01/2012, 03:05
 
Fecha de Ingreso: julio-2011
Ubicación: Barcelona
Mensajes: 9
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Como utilizar SqlTransaction

Cita:
Iniciado por drako_darpan Ver Mensaje
Hola que tal, puedes debugear el programa y ver donde o en que momento sale la Excepcion.

Yo creo que el error puede estar en los 2 try.

Código VB:
Ver original
  1. Try
  2.     dtaSQL.Update(dtbSQL)
  3.     dtbSQL.AcceptChanges()
  4.     trans.Commit()
  5.    
  6.     Catch err As Exception
  7.         trans.Rollback()
  8.         MsgBox(err.Message, MsgBoxStyle.Exclamation, "Mensaje de error")
  9. End Try

Intenta dejandolo asi, a lo mejor tienes un error por algun catch. La otra es puedes identificar con

Código VB:
Ver original
  1. Try
  2.     dtaSQL.Update(dtbSQL)
  3.     dtbSQL.AcceptChanges()
  4.     trans.Commit()
  5.     Catch ex As Exception
  6.     MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Mensaje de error...1")
  7.    
  8.         Catch err As Exception
  9.             trans.Rollback()
  10.             MsgBox(err.Message, MsgBoxStyle.Exclamation, "Mensaje de error...2")
  11. End Try

Para ver cual es el error que se esta ejecutando primero.

El error lo da cuando lanzo el Update al DataAdapter. Y tampoco me permite colocar los dos catch. La verdad es que al final lo haré a través de consultas de acción porque no consigo eliminar el error. Si alguien supiera porque pasa esto lo agradecería de verdad.
Feliz Año

Etiquetas: sql, tabla
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 16:44.