public void Guardar(DataTable Empleados) { // creamos un adapter para realizar la actualización SqlDataAdapter Adapter = new SqlDataAdapter("SELECT * FROM Empleados", this.cn); // usamos un command builder para configurar los comandos de actualización SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter); Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand(); Adapter.InsertCommand = CommandBuilder.GetInsertCommand(); Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand(); // este comando nos sirve para refrescar un registro SqlCommand Resync = new SqlCommand("SELECT * From Empleados WHERE IdEmpleado=@IdEmpleado", this.cn); Resync.Parameters.Add("@IdEmpleado", SqlDbType.Int); try { Adapter.Update(Empleados); } catch ( DBConcurrencyException ex ) { // Nuestra respuesta a un conflicto va a ser refrescar el registro Adapter.SelectCommand = Resync; Resync.Parameters["@IdEmpleado"].Value=ex.Row["IdEmpleado", DataRowVersion.Original]; // el método Fill buscará el registro en el DataTable // por clave primaria (IdEmpleado) y lo "refrescará" if ( Adapter.Fill(Empleados) == 0 ) // la causa del conflicto es que ha sido eliminado // (Fill devuelve cero registros) { if ( ex.Row.RowState == DataRowState.Deleted ) { // en este punto tenemos un conflicto de concurrencia // al eliminar un registro porque ha sido eliminado. // Eliminamos definitivamente el registro ex.Row.AcceptChanges(); // ignoramos el conflicto y seguimos con la actualización Guardar(Empleados); } else {p; { // en este punto tenemos un conflicto de concurrencia // al modificar un registro porque ha sido eliminado // Eliminamos el registro // y volvemos a lanzar la excepción ex.Row.Delete(); ex.Row.AcceptChanges(); throw ex; } } else { // la causa del conflicto es que ha sido modificado // Si el conflicto ha sido al eliminar el registro // Fill ya lo habrá "recuperado" y refrescado. // Aparecerá el registro con el error // Si el conflicto ha sido al modificar el registro // Fill lo habrá "refrescado". Y aparecerá el registro // con el error // sólo hay que volver a lanzar la excepción throw ex; } } } Fuente 1. Ejemplo de gestión de conflictos de concurrencia |