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

Infraccion de concurrencia: Update command...

Estas en el tema de Infraccion de concurrencia: Update command... en el foro de .NET en Foros del Web. Buenos dias, He buscado en los foros de NET, WebForms y WinForms la palabra "concurrencia" y aparecen un par de posts incompletos, así que, lo ...
  #1 (permalink)  
Antiguo 23/11/2005, 11:24
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Infraccion de concurrencia: Update command...

Buenos dias,

He buscado en los foros de NET, WebForms y WinForms la palabra "concurrencia" y aparecen un par de posts incompletos, así que, lo planteo de nuevo.

El comportamiento es el siguiente. En un datagrid, hago altas sin problemas. Hago modificaciones sin problemas a filas que ya existen. Pero hay un caso peculiar:
Si hago una alta y relleno cuatro o cinco campos y luego le doy a "guardar cambios" (que no hace más que un Update del dataset a traves de un dataadapter) me lo guarda bien, pero una vez guardado, me voy a cualquier campo del mismo registro y lo modifico, cuando le vuelvo a dar a guardar, me salta el error:

Infraccion de concurrencia: Update command afectó a 0 registros

Dada esta situación específica, a alguien se le ocurre qué me puede estar pasando?

Gracias a todos.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 23/11/2005, 13:52
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
A esto se le conoce como concurrencia optimista, dependiendo de como hayas generado el CommandText de las propiedades DeleteCommand, UpdateCommand del DataAdapter, este hace una comprobación para que los datos no hayan variado con respecto a la versión _original_ con la que llegó al DataSet (esto es útil para mantener una consistencia en tus datos), si en la ejecución de estos métodos (se ejecuta por cada fila) se devuelve 0 filas afectadas, quiere decir que los datos han variado y ya no son los mismos por lo tanto se lanza la excepción, puedes utilizar el evento RowUpdated del DataAdapter, para decidir que acción tomar.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #3 (permalink)  
Antiguo 24/11/2005, 03:10
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Pero el evento RowUpdated salta cada vez que se hace una modificación?
Que debería hacer en ese evento, un da.Update tambien?

De todas formas, te comento que genero la SelectCommand del dataadapter con algo como: "SELECT * FROM Urgencias WHERE... ORDER BY.."
Es que debería especificar los campos uno por uno para que genere bien los demás comandos el commandbuilder o algo así?
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 24/11/2005, 12:39
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Asigna manualmente esas propiedades (UpdateCommand, DeleteCommand), si lo que quieres es ganar rendimiento y evitar ese _error_.

http://msdn.microsoft.com/library/sp...edcommands.asp
http://msdn.microsoft.com/library/de...adonetbest.asp

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 25/11/2005, 03:54
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Gracias por tus respuestas xknown. Me lo estoy mirando.

Pero, no hay la forma de poder utilizar un gran objeto como es CommandBuilder, evitando el error de concurrencia? Por alguna cosa que ya he leido por ahi, veo que la concurrencia optimista trata de cuando varias personas modifican a la vez los datos. Pero por ahora me ocurre utilizando la aplicación yo solo.

Cita:
Iniciado por xknown
si en la ejecución de estos métodos (se ejecuta por cada fila) se devuelve 0 filas afectadas, quiere decir que los datos han variado y ya no son los mismos por lo tanto se lanza la excepción, puedes utilizar el evento RowUpdated del DataAdapter, para decidir que acción tomar.
Pero porqué lanza una excepción? Si han cambiado los datos, pues que los updatee... no?
Por algo pregunto justo antes de updatear: If miDataSet.HasChanges Then...

Hay algo aqui que no entiendo.
Gracias por la aclaracion que puedan darme.
__________________
..:: moNTeZIon ::..
  #6 (permalink)  
Antiguo 25/11/2005, 04:30
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Si haces un AccepChanges en el datatable tras el update no solventas este problema???
  #7 (permalink)  
Antiguo 25/11/2005, 04:47
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Hola Jose,

Mira, siguiendo tu propuesta, me queda así el codigo para Guardar los cambios:

Código:
Private Sub GuardarCambios_miDataSet()
    Me.BindingContext(miDataSet, "Urgencias").EndCurrentEdit()
    If miDataSet.HasChanges Then
      Try
        daUrgencias.Update(miDataSet, "Urgencias")
        miDataSet.AcceptChanges()
      Catch eX As Exception
        MessageBox.Show(eX.Message)
      End Try
    End If
  End Sub
Pero me sigue mandando el error, si modifico cualquier campo de un registro que acabo de dar de alta. No ocurre, en cambio, con otros registros que modifico. Solamente me lanza la excepcion modificando los que acabo de dar de alta.
__________________
..:: moNTeZIon ::..
  #8 (permalink)  
Antiguo 25/11/2005, 04:50
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
Perdón, dijiste en el datatable.
He cambiado la linea de accept changes por:

miDataSet.Tables("Urgencias").AcceptChanges()

Pero nada.

Y probando como me comenta xknown, especificando los comandos a pelo, me manda este error al hacer el update:

Código:
No se han especificado valores para algunos de los parametros requeridos.
Que es cierto, he escrito los comandos, asignando cada campo a un parametro con el mismo nombre, pero no especifico los parámetros. Lo he de hacer? No debe coger los nuevos valores de cada registro modificado?

Está costando.. Gracias por la paciencia.
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 25/11/2005 a las 05:11
  #9 (permalink)  
Antiguo 19/03/2009, 02:23
 
Fecha de Ingreso: marzo-2009
Mensajes: 1
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Infraccion de concurrencia: Update command...

Veo que es un poco tarde para responderte, pero al menos quede registro para el resto de usuarios con el mismo problema.

El problema que comentas es debido a que la llave primaria de la tabla que quieres actualizar, no la creas tú en tú formulario, sino que es una llave autonumérica o lleva un secuenciador con disparador. Al crear el registro, la llave primaria está en blanco, pero al insrtarlo, se crea automáticamente en la base de datos. El problema está en que dicho valor de llave primaria no se devuelve a tu DataSet, con los consiguientes problemas de consistencia entre los dos conjuntos de datos.

Para que todo funcione bien debes refrescar la información del registro y todo funcionará bien.

Saludos
  #10 (permalink)  
Antiguo 25/11/2009, 14:50
2mg
 
Fecha de Ingreso: junio-2009
Mensajes: 2
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Infraccion de concurrencia: Update command...

Precisamente el problema es con los autonuméricos...
Lo que no quiero es volver a cargar toda la tabla, pq tiene 15.000+ registros y tarda casi 3 o 4 segundos en cargarla...

El error viene cuando intento eliminar un registro recién agregado.. (opción deshacer para el usuario)

Y además tengo que actualizar la base de datos con cada registro agregado...
Una opción sería trabajar en batch, pero entonces no tengo la base de datos actualizada...
Y si tengo que hacer un fill para cada registro agregado, le van a crecer barbas al usuario!!

Alguien sabe si hay alguna manera de evitar este error?

Salu2
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 05:42.