IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ADO.NET Discussion :

Fonctionnement du Delete Cascade d'un DataSet


Sujet :

ADO.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 46
    Points
    46
    Par défaut Fonctionnement du Delete Cascade d'un DataSet
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :-)

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Je ne pourrai pas t'aider sur le souci de dataset, mais ne peux-tu pas créer la suppression en cascade directement dans la base de données? A la source c'est mieux...
    Laumon.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 46
    Points
    46
    Par défaut
    J'aimerais bien, mais malheureusement je ne peux pas (politique DBA interne).
    C'est pour cela que j'aimerais définir ces règles au niveau de mon DataSet.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 46
    Points
    46
    Par défaut
    Pas d'autres propositions ? :-s

    Sinon tant pis je me débrouillerai en réalisant les delete manuellement dans mes tables et dans le bon ordre...

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    quand vous dites que vous avez réglé le DataSet en mode "Cascade", l'avez-vous fait sur les lignes de clé étrangère?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    custOrderFK.DeleteRule = Rule.Cascade
    Voir sur MSDN

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 46
    Points
    46
    Par défaut
    Oui j'ai bien défini dans mon DataSet les relations de mes tables de manière à ce que la supression se fasse en cascade. Mais lorsque je debug le code, je vois que cela n'est pas pris en compte lors de la supression d'un enregistrement parent.

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Je n'ai jamais essayé d'aller aussi loin en mode déconnecté.
    La seule chose que je pouvais vous demander pour essayer de vous aider était de vérifier que vous aviez bien toutes les étapes décrite dans l'aide MSDN :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub CreateConstraint(dataSet As DataSet, _
       table1 As String, table2 As String, _
       column1 As String, column2 As String)
     
       ' Declare parent column and child column variables.
       Dim parentColumn As DataColumn
       Dim childColumn As DataColumn
       Dim foreignKeyConstraint As ForeignKeyConstraint
     
       ' Set parent and child column variables.
       parentColumn = dataSet.Tables(table1).Columns(column1)
       childColumn = dataSet.Tables(table2).Columns(column2)
       foreignKeyConstraint = New ForeignKeyConstraint _
          ("SupplierForeignKeyConstraint", parentColumn, childColumn)
     
       ' Set null values when a value is deleted.
       foreignKeyConstraint.DeleteRule = Rule.SetNull
       foreignKeyConstraint.UpdateRule = Rule.Cascade
       foreignKeyConstraint.AcceptRejectRule = AcceptRejectRule.None
     
       ' Add the constraint, and set EnforceConstraints to true.
       dataSet.Tables(table1).Constraints.Add(foreignKeyConstraint)
       dataSet.EnforceConstraints = True
    End Sub

    Désolé

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par loki9481 Voir le message
    Oui j'ai bien défini dans mon DataSet les relations de mes tables de manière à ce que la supression se fasse en cascade. Mais lorsque je debug le code, je vois que cela n'est pas pris en compte lors de la supression d'un enregistrement parent.
    Pour que la suppression en cascade marche il va falloir que toutes les lignes qui sont en rapport avec cette règle soient chargées en mémoire. Est-ce que c'est fait ?

Discussions similaires

  1. ON DELETE CASCADE ne fonctionne pas
    Par Torgar dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/02/2010, 17h14
  2. SQL Delete Cascade
    Par mschoum dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/06/2006, 14h18
  3. [SQL 2K5] Pb : ON DELETE CASCADE : référence circulaire
    Par n00bi dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/05/2006, 08h48
  4. [SQL2K] delete cascade d'une table sur elle même
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2006, 16h28
  5. Delete cascade --> problème de temps de traitement
    Par celine31 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/01/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo