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 :
- Usted llena la
DataTable
que se utilizará para la actualización. - Elimina la fila con
Code = 1101
(por ejemplo) directamente desde la base de datos, es decir, no utiliza elDataTable
aquí. Esto está emulando a otro usuario que elimina la fila conCode = 1101
de otra aplicación. O alguna otra parte en su código eliminando la fila conCode = 1101
. - Selecciona la fila con
Code = 1101
de laDataTable
, esto es solo para mostrar que todavía está allí aunque lo haya eliminado de la base de datos. - Edita la
Quantity
columna en la fila conCode = 1101
en laDataTable
. Esto debe hacerse, de lo contrario, la llamada a Actualizar ignorará esta fila al actualizar. - 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
.