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 :

Update + Delete dans la même transaction


Sujet :

ADO.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Update + Delete dans la même transaction
    Bonjour,

    J'ai un petit souci dans mon application.

    En effet lors de la modification d'un utilisateur je mets à jour sa liste de droits.

    Ainsi, pour chaque droit modifié je lance un update sur la table droit et pour chaque droit supprimé je lance une requête delete sur la table.

    Lorsque je suis dans la même transaction, la suppression plante car il y a un verrou sur la table.

    Merci par avance de votre aide.

    Mécanique de modif/suppr
    Code vb : 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
    25
    26
    27
    28
    29
    30
    31
    32
     
     Dim maConnection As Connection
            maConnection = ApplicationContext.GetInstance.CurrentConnection
            maConnection.BeginTrans()
     
            Try
                FactoryUtilisateur.UpdateUtilisateur(maConnection, monUtilisateur)
                If Not monUtilisateur.Droits Is Nothing Then
                    Dim mesDroitsEnBase As Droits
                    mesDroitsEnBase = GetDroitsForUtilisateur(monUtilisateur)
     
                    For Each monDroit As Droit In monUtilisateur.Droits
                        If mesDroitsEnBase Is Nothing OrElse Not mesDroitsEnBase.Exist(monDroit) Then
                        Else
                            UpdateDroit(maConnection, monDroit, monUtilisateur)
                        End If
                    Next
     
                    For Each monDroit As Droit In mesDroitsEnBase
                        If monUtilisateur.Droits Is Nothing OrElse Not monUtilisateur.Droits.Exist(monDroit) Then
                            SupprimeDroit(maConnection, monDroit, monUtilisateur)
                        End If
                    Next
     
                    maConnection.CommitTrans()
                End If
                monUtilisateur.MajInfoFromUtilisateur(GetUtilisateur(monUtilisateur.ID), True)
     
            Catch ex As Exception
                maConnection.RollbackTrans()
                Throw ex
            End Try

    Ensuite chaque requete est géré par un abstractDAO dont voici les lignes.

    Update
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     maReq = "SELECT * FROM " & maTable & " WHERE " & préfixeChamp & "_ID = " & monId
                    monRecordSet.Open(maReq, maConnection, CursorTypeEnum.adOpenDynamic, LockTypeEnum.adLockOptimistic)
                    For Each champ As Champ In mesChamps
                        monRecordSet.Fields(préfixeChamp & "_" & champ.Nom).Value = champ.Valeur
                    Next
                    monRecordSet.Fields(préfixeChamp & "_Version").Value = CType(monRecordSet.Fields(préfixeChamp & "_Version").Value, Long) + 1
                    monRecordSet.Fields(préfixeChamp & "_DateModification").Value = Now
     
                    monRecordSet.Update()
                    monRecordSet.Close()
                    monRecordSet = Nothing

    Delete
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            Dim maReq As String = "Delete FROM " & maTable & " WHERE " & préfixeChamp & "_ID = " & monId
     
                    monRecordSet.Open(maReq, maConnection, CursorTypeEnum.adOpenKeyset, LockTypeEnum.adLockPessimistic)

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Je n'ai pas regardé en détail si ton code est du VB6 ou du .Net mais sache que s'il s'agit de .Net il faudrait penser à court terme à laisser tomber ADO et les recordset pour passer à ADO.NET (Dataset, Entity Framework, DAL home made, etc.)

    Pour en revenir à ta problématique, selon mes souvenirs. Soit tu utilises ton recordset (SELECT) pour faire tes updates + delete (je suis pas sur que ça soit faisable en transaction par contre). Soit tu fais une séquence de requêtes de type Update et Delete dans une transaction.

    Mélanger les deux concepts n'est pas une bonne idée

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Je suis passé sur ADO.NET et en effet c'est un peu moins galère... pas de problème de lock foireux... Par contre pour récupérer un NumAuto lors d'une insertion j'ai rien compris... mais bon c'est pas le sujet.

    Sinon dans mon cas, je faisais bien une suite de Updates et de Deletes mais a priori le Update collait un lock sur la table tant que la transaction n'était pas commit...

    Merci anyway.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Si vous essayez de faire votre update à l'aide d'une requête SQL update (et non pas un SELECT puis modification du recordset), je suis persuadé que cela fonctionne.

    Concernant la récupération d'un ID autoincrémenté, je peux peut être vous aider. Il faudrait juste préciser la base de donnée utilisée (je suppose que vous travaillez avec des datasets!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    La base est en Access dans ce projet.

    j'utilise surtout des objets métiers, les dataset je les utilise surtout en temporaire pour récupérer le résultat d'une requête pour le transformer en objet métier.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    En access je dois avoir une solution pour récupérer la valeur de l'auto incrément après la sauvegarde d'un nouveau datarow dans la base de donnée.

    Mais le code est au boulot donc faudra patienter :-)

    Il faut se méfier du mélange .Net, Ado.Net et Access.

    Je suis déjà tomber sur certaines spécialités pas triste. Si vous avez la possibilité de migrer vers SQL Server Express je vous conseille de ne pas hésiter!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Dans un monde idéal il est sur qu'access n'est pas le SGBD le plus sécurisé

    Mais bon la pour le coup il s'agit plus ou moins d'un prérequis.

    Pour le moment j'ai contourné le problème en recherchant dans la même transaction le dernier id en fonction de la date de création.

    Ce n'est absolument pas une solution, mais dans le contexte de mon application où il y a très peu d'utilisateurs créateurs et très peu de volume les risques sont minimes.

    Merci de vos réponses en tout cas.

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Mes excuses, l'implémentation de cette solution concernait SQL Server et non pas Access.

    Pour Access j'utilise une colonne d'identifiant en manuel et je récupère l'identifiant le plus grand avant l'insert dans une transaction pour générer le nouvel identifiant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Update + Delete dans la même transaction
    Par kornetmuse dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/02/2013, 11h13
  2. Réponses: 4
    Dernier message: 28/05/2012, 22h22
  3. Réponses: 4
    Dernier message: 21/01/2011, 14h53
  4. Réponses: 2
    Dernier message: 05/08/2008, 16h27
  5. Réponses: 3
    Dernier message: 16/01/2007, 11h13

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