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

VB.NET Discussion :

SqlTransaction, Procédure, et Exception


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut SqlTransaction, Procédure, et Exception
    Bonjour tout le monde,

    Je suis en train de développer un programme (étonnant non ? ) et j'ai fait une procédure qui fait elle même appel à d'autres procédures pour faire des insert en "rafale" surr plusieurs tables.

    Extrait :

    Code : 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
    Dim myTransac As SqlTransaction
            myTransac = cnx.BeginTransaction
            cmd.Transaction = myTransac
     
            Try
                cmd.ExecuteNonQuery()
     
                'Si l'insertion du nouveau rapport est effectuée avec succès, on insère tout les lots
                LigneLot.insert(insertReussi, newRapport.ListeLot, newRapport.Id, cnx, myTransac)
     
                'Si les lots sont insérés avec succès, on insère les pertes
                EntetePerte.insert(insertReussi, newRapport.ListePerte, newRapport.Id, cnx, myTransac)
     
                'Si les pertes sont insérées avec succès, on commit la transaction, sinon on rollback
                myTransac.Commit()
            Catch
                insertReussi = False
                myTransac.Rollback()
            End Try
            cnx.Close()
    Donc j'envoie aux procédures "filles" les paramètres dont elles ont besoins (connexion et transaction comprises) avec des try sur toutes les procédures impliquées.
    Donc ma question est : Si une des ces procédures lève une exception, est ce que je vais bien revenir dans le try/catch d'origine ? Et donc est ce que le commit/rollback est utilisé à bon escient ici ?

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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Ca me semble correcte, on peut faire un poil plus propre:

    - Utilisation d'un Using pour encapsuler la connexion (on est sur que la connexion est close à la sortie de l'using)

    - Test de la transaction is not nothing avant le rollback pour éviter une erreur dans la gestion d'erreur

    Après je reste dubitatif sur le insertReussi = False. Il me semble plus logique de continuer la propagation de l'Exception plus loin pour indiquer qu'il y a eu un problème en mettant un simple Throw à la fin du catch.

  3. #3
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Pour répondre à ta question, oui ton excpetion remontera normalement jusqu'au premier bloc try/catch qu'elle trouvera.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Citation Envoyé par sinople Voir le message
    Après je reste dubitatif sur le insertReussi = False. Il me semble plus logique de continuer la propagation de l'Exception plus loin pour indiquer qu'il y a eu un problème en mettant un simple Throw à la fin du catch.
    Oui c'est vrai, mais insertReussi est une sale habitude que j'ai prise pour faire des tests sur l'échec ou le succès de mes requêtes:
    - True --> requête réussie
    - False --> requête foirée

    après je mets des msgBox en fonction...

    Sinon on est donc bien d'accord que mon rollback se propagera bien sur toutes les tables impactées par la transaction ?
    J'insiste parce que c'est la première fois que j'utilise une transaction comme cela, d'habitude je m'en sers plutôt qu'en j'ai une requête à l'intérieur d'un For Each ou quelque chose comme ça.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par Shadam Voir le message
    Oui c'est vrai, mais insertReussi est une sale habitude que j'ai prise pour faire des tests sur l'échec ou le succès de mes requêtes:
    - True --> requête réussie
    - False --> requête foirée

    après je mets des msgBox en fonction...
    personnellement je suis pas contre, la couche d'ui n'as pas besoin de détail de l'erreur, elle a juste besoin de savoir si c'est ok et éventuellement un message d'erreur à afficher
    donc faire une fonction booléen n'est pas si affreux (nous on fait fct(byref msg as string) as boolean
    ce qui est plus important qu'un throw dans un catch par contre c'est un log de l'erreur (ex.gettype.fullname, ex.message, ex.stacktrace), ca te permet de débugger ton programme rapidement après

    Citation Envoyé par Shadam Voir le message
    Sinon on est donc bien d'accord que mon rollback se propagera bien sur toutes les tables impactées par la transaction ?
    J'insiste parce que c'est la première fois que j'utilise une transaction comme cela, d'habitude je m'en sers plutôt qu'en j'ai une requête à l'intérieur d'un For Each ou quelque chose comme ça.
    oui mais tu peux aussi faire des tests quand tu n'es pas sur de quelque chose
    dans un projet de test avec à la même architecture d'appels de méthode tu peux faire une requete qui create table, puis une requete qui raiseerror 'msg',16,1 et voir si la table existe après l'exécution des 2
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2011
    Messages
    453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 453
    Par défaut
    Ok merci à tous pour votre aide

    J'essaierai ton truc lundi Pol, pour l'insatnt c'est le week end

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

Discussions similaires

  1. [10g] Procédure et exception
    Par Aymenkn dans le forum PL/SQL
    Réponses: 8
    Dernier message: 15/01/2015, 14h27
  2. pl/sql procédure avec exception
    Par ines_eleuch dans le forum Débuter
    Réponses: 0
    Dernier message: 24/12/2013, 09h40
  3. Procédure stockée Exception ORA-01858
    Par haskouse dans le forum SQL
    Réponses: 3
    Dernier message: 21/02/2011, 12h32
  4. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  5. Réponses: 3
    Dernier message: 09/11/2004, 14h43

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