Infracción de simultaneidad en C# y bases de datos
Error al ejecutar DeleteCommand
Programando 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:
DNI |
Nombre y apellidos |
Es feliz |
---|---|---|
123456 | Javier Recíproco Despilfarro | SÍ |
654321 | Pedro Recíproco Despilfarro | TAMBIÉN |
Segunda tabla:
DNI |
Libros |
¿Te gustó? |
---|---|---|
123456 | La felicidad | SÍ |
654321 | Cocina sencilla | NO |
654321 | Cocina compleja | SÍ |
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:
- Borro el usuario del DataSet de la 1ª tabla: TablaUsuario
- Borro el usuario del origen de datos (DataAdapter.DeleteCommand y DataAdapter.Update)
- Ahora busco en la TablaLibros del DataSet todos los DNI: 654321 y borro todas las filas encontradas: correcto
- 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 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).
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
Buen apunte.