Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   .NET (http://www.forosdelweb.com/f29/)
-   -   Infraccion de concurrencia: Update command... (http://www.forosdelweb.com/f29/infraccion-concurrencia-update-command-352318/)

moNTeZIon 23/11/2005 11:24

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.

xknown 23/11/2005 13:52

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

moNTeZIon 24/11/2005 03:10

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í?

xknown 24/11/2005 12:39

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

moNTeZIon 25/11/2005 03:54

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.

Jose_minglein2 25/11/2005 04:30

Si haces un AccepChanges en el datatable tras el update no solventas este problema???

moNTeZIon 25/11/2005 04:47

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 25/11/2005 04:50

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.

decroman 19/03/2009 02:23

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

2mg 25/11/2009 14:50

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


La zona horaria es GMT -6. Ahora son las 02:52.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.