Bonjour à toutes et à tous,
Je me posais une question sur le fonctionnement du Delete Cascade dans un DataSet, car mon code ne réagit pas comme je le souhaiterais.
Je précise que je ne suis pas un spécialiste en DataSet, BindingSource et autre DataGridView. Il se peut que le problème soit très simple à résoudre uniquement à cause de mon manque de connaissance dans l'utilisation des DataSet.
J'ai le modèle de données suivant :
Les relations entre chaque table sont de type "Relation et contrainte de clé étrangère", règles de mise à jour et de suppression "Cascade".
Dans mon code, j'ai un DataGridView mappé sur la table TABLE_A. J'ai un bouton de suppression dont le code est simplement :
MaDataGridView.Rows.Remove(MaDataGridView.CurrentRow)
J'ai un autre bouton de sauvegarde des modifications, et c'est là que ça coince.
J'y ai plusieurs appels de fonctions, car je développe une classe la plus générique possible pour gérer des DataSets, et le principe est le suivant :
1 2 3
| MyBindingSource.EndEdit()
modif = Table.GetChanges(DataRowState.Added | DataRowState.Modified | DataRowState.Deleted)
Table.TableAdapter.Update(modif) |
Lors de l'update, je reçois un message d'erreur de mon SGBD (Oracle) disant qu'un enregistrement fils existe et que la supression ne peut pas se faire.
C'est justement pour ça que j'ai défini les Delete Cascade dans mon DataSet, afin que celui-ci supprime automatiquement les enregistrements enfants sans que j'ai à le gérer moi-même manuellement dans le code.
Je voudrais donc savoir ce que j'oublierais de faire dans mon code pour que la suppression se déroule comme je l'ai définie dans le DataSet.
Je pensais que cela venait du fait qu'il fallait d'abord que je fasse, dans l'ordre, un update sur TABLE_C, TABLE_B puis TABLE_A mais cela ne change rien et de plus, la fonction GetChanges() m'indique qu'il n'y a aucun changement sur les table TABLE_B et TABLE_C après la suppression d'une ligne de la table TABLE_A.
Merci d'avance pour toute aide apportée :-)
Partager