Infracción de simultaneidad en C# y bases de datos

Tamaño de letra:

Error al ejecutar DeleteCommand

Homer y CSharpProgramando en C# con bases de datos, al intentar eliminar registros del origen de datos, recibo el siguiente mensaje:

Infracción de simultaneidad: DeleteCommand afectó a 0 de los 1 registros esperados.

Un error muy curioso que me costó bastante tiempo entender y hoy quiero explicar cómo lo resolví y tal vez pueda ser también la solución a tu problema.

Mi origen de datos es una base de datos Access y trabajo con un DataSet como base de datos virtual. Lo más importante de todo y donde reside el problema es que tengo 2 tablas relacionadas. Ejemplo: primera tabla (Usuario) y segunda tabla (Libros). La tabla libros contiene todos los libros que un usuario ha leído y se relaciona con la primera por el DNI. Observa:

 

Nombre de la tabla: Usuario

DNI

Nombre y apellidos

Es feliz

123456 Javier Recíproco Despilfarro
654321 Pedro Recíproco Despilfarro TAMBIÉN

Segunda tabla:

Nombre de la tabla: Libros

DNI

Libros

¿Te gustó?

123456 La felicidad
654321 Cocina sencilla NO
654321 Cocina compleja

Como ves es un ejemplo muy sencillo. Ten presente que las dos tablas están relacionadas por el DNI.

Reproduciendo el error

De forma muy sencilla: Del origen de datos (tabla Access) genero un DataSet con 2 tablas:

  • TablaUsuario
  • TablaLibros

Ahora intento borrar el usuario Pedro Recíproco Despilfarro y, lógicamente, tengo que borrar también sus 2 libros leídos que están en la 2ª tabla. Así que hago lo siguiente:

  1. Borro el usuario del DataSet de la 1ª tabla: TablaUsuario
  2. Borro el usuario del origen de datos (DataAdapter.DeleteCommand y DataAdapter.Update)
  3. Ahora busco en la TablaLibros del DataSet todos los DNI: 654321 y borro todas las filas encontradas: correcto
  4. Finalmente y es donde se produce el error, borro esos 2 libros del origen de datos (DataAdapter.DeleteCommand y DataAdapter.Update) y, en este paso, aparece el siguiente error:

Infracción simultaneidad C#

Infracción de simultaneidad: DeleteCommand afectó a 0 de los 1 registros esperados.

Hipótesis

¿Por qué se produce? Según mi hipótesis, es porque en una tabla relacionada, al eliminar un registro en el origen de datos de la tabla principal, se borra automáticamente los registros relacionados en la 2ª tabla, también del origen de datos.

Importante: Sin embargo, aunque se hayan borrado los registros en la 2ª tabla del origen de datos, quedan todavía por borrar esos registros en la TablaLibros del DataSet (al menos, en mi caso).

Última actualización: Martes, 01 Octubre 2013
Comentarios  
+1 # Onair 16-03-2018 09:47
El secreto está en que hay datos que no han variado.
Esto se soluciona en el commandbuilder estableciendo su propiedad ConflictOption = ConflictOption. OverwriteChange s


Dim strsql1 As String = "Select * from Datos..."
da = New OleDb.OleDbData Adapter(strsql1 , con)
Dim cb = New OleDb.OleDbComm andBuilder(da)
cb.ConflictOpti on = ConflictOption. OverwriteChange s
...

Fuente de información en la que me inspiré:
https://social.msdn.microsoft.com/Forums/es-ES/6dff6f5d-bf7f-4f36-aacf-c58f2e6a50b0/infraccin-de-simultaneidad-updatecommand-afect-a-0-de-1-registros-esperados?forum=vcses
Responder | Responder con una citación | Citar
+1 # Eusebio 03-12-2013 22:03
Para evitar ese comportamiento, yo suelo realizar el proceso inverso, es decir, primero borro todos los datos de las tablas realzionadas y finalmente de la tabla principal. De este modo no hay error y uno se asegura de haber borrado correctamente todas las referencias del registro.
Buen apunte.
Responder | Responder con una citación | Citar
Escribir un comentario
Antes de publicar un comentario, usted debe aceptar nuestras condiciones de uso: Condiciones de uso. Debido al spam, todos los comentarios serán moderados. Normalmente se responde en unos minutos, refresca los comentarios para comprobarlo.



 
Visitas: 8467224