sql >> Base de Datos >  >> RDS >> PostgreSQL

Se produjo una excepción DBConcurrency durante la actualización mediante el adaptador de datos

Esto se debe a que DataAdapter usa Optimistic Concurrency por defecto. Esto significa que si está intentando actualizar una fila que ya no existe en la base de datos o ha cambiado, la actualización desde el DataAdapter fallará con la excepción anterior.

Escenarios posibles :

  • Entre la selección de los datos en el cliente y el envío de la actualización, otro usuario está eliminando o actualizando esta fila desde su aplicación.
  • Puede ser que esté eliminando los datos de algún otro lugar de su aplicación.

Por ejemplo :

  1. Usted llena la DataTable que se utilizará para la actualización.
  2. Elimina la fila con Code = 1101 (por ejemplo) directamente desde la base de datos, es decir, no utiliza el DataTable aquí. Esto está emulando a otro usuario que elimina la fila con Code = 1101 de otra aplicación. O alguna otra parte en su código eliminando la fila con Code = 1101 .
  3. Selecciona la fila con Code = 1101 de la DataTable , esto es solo para mostrar que todavía está allí aunque lo haya eliminado de la base de datos.
  4. Edita la Quantity columna en la fila con Code = 1101 en la DataTable . Esto debe hacerse, de lo contrario, la llamada a Actualizar ignorará esta fila al actualizar.
  5. Ejecuta la actualización, esto arrojará la excepción ya que está intentando actualizar una fila que (ya no existe) en la base de datos.

Si desea implementar Last Writer Wins , Agregue el siguiente código:

cb.ConflictOption = ConflictOption.OverwriteChanges;

También hay una cosa más posible:si tiene Decimal /numeric como columnas en la base de datos, pueden causar este error aunque los datos tengan el mismo aspecto. Esto se debe a un error de redondeo decimal.

Una nota importante :Siempre debe usar parameterized queries de paso. Este tipo de concatenaciones de cadenas están abiertas para SQL Injection .