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

Développement SQL Server Discussion :

Comment bien utiliser les transactions


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut Comment bien utiliser les transactions
    Bonjour;
    Ma procédure permet de faire un enregistrement ou une modification ou une supression selon le choix de l'utilisateur.Lorsque j'exécuter ma procédure dans mon AGL ,ma procédure me renvoye un message vide qui ne contient aucune indication.
    Voici ma procédure
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
     
    CREATE PROCEDURE [dbo].[PrGarantieAutomobile]
          @CodeCaracteristic int,
          @Zonecode varchar(10)=null,
          @CarosserieCode varchar(10)=null,
          @EnergieCode varchar(10)=null,
          @StatutCode varchar(10)=null,
          @NumeroImmatriculation varchar(15)=null,
          @DatePremiereImmatriculation datetime=null,
          @DateImmatriculation datetime=null,
          @ChargeUtile int=null,
          @PoidsVide int=null,
          @NombrePlace int=null,
          @PuissanceAdministrative int=null,
          @PuissanceReelle int=null,
          @GenreCode varchar(10)=null,
          @MarqueCode varchar(10)=null,
          @Serie varchar(20)=null,
          @ValeurVenale money=null,
          @ValeurNeuf money=null,
          @Types varchar(20)=null,
          @Conducteur varchar(30)=null,
          @TransportCode varchar(10)=null,
          @AjustementCode varchar(10)=null,
          @DateNaissanceConducteur datetime=null,
          @Datepermis datetime=null,
          @Numeropermis varchar(10)=null,
          @Profession varchar(40)=null,
          @CouleurCode varchar(10)=null,
          @ProtectionCode varchar(10)=null,
          @Assure varchar(60)=null,
          @Adresse varchar(60)=null,
          @Gage char(2)=null,
          @NumeroMoteur varchar(20)=null,
          @NumeroImmatPrec varchar(15)=null,
          @DateImmatPrec datetime=null,
          @TypeCommercial char(20)=null,
          @NombrePlaceHC int=null,
          @DureeConduite int=null,
          @CategorieCode varchar(10)=null,
          @SousCategorieCode varchar(10)=null,
            @NatureCode varchar(10)=null,
            @DepartementCode varchar(10)=null,
            @ClasseProfessionnelCode varchar(10)=null,
          @Rep int,
          @sms varchar(100) output
    AS
     BEGIN
       begin transaction
        declare @erro int
        declare @er int
        declare @numCaract int
        begin
      set @er=(SELECT count(SaisieCode) FROM EnBufGarantieAuto where FlagGarantie=1)
        if @er = 0
          begin
           set @sms='Veuillez choisir des garanties'
           rollback
          end
        else
         begin /*Mise à jour de la table temporaire garantie auto*/
          update EnBufGarantieAuto
           set NumeroImmatriculation=@NumeroImmatriculation,
               CodeCategorie=@CategorieCode,
               CaracteristicAutoCode=@CodeCaracteristic
           if @@error=0
             begin
              set @sms='Maj EnBufGarantieAuto OK'
              commit
             end
           else
            begin
             set @sms='Maj echouée'
             rollback
            end
          /*enregistrement de la caracteristique auto dans la table temporaire*/
         if (@Rep=1)
            begin
              begin transaction
         set @erro=(SELECT CaracteristicAutoCode FROM EnCaracteristicAuto where    CaracteristicAutoCode=@CodeCaracteristic)
                if @erro!=0
                 begin
                   set @sms='Ce code existe déjà,entrez-en un autre'
                   return
                 end
                else
                 begin
        set @numCaract=(SELECT count(CaracteristicAutoCode) FROM EnBufCaracteristicAuto)
                    if @numCaract!=0
                       delete from EnBufCaracteristicAuto
                    begin
                       begin transaction
    INSERT INTO EnBufCaracteristicAuto ([CaracteristicAutoCode],[Zonecode],[CarosserieCode],[EnergieCode],[StatutCode],[NumeroImmatriculation],[DatePremiereImmatriculation],[DateImmatriculation],[ChargeUtile],[PoidsVide], [NombrePlace],[PuissanceAdministrative],[PuissanceReelle],[GenreCode],[MarqueCode],[Serie], [ValeurVenale],[ValeurNeuf],[Types],[Conducteur],[TransportCode],[AjustementCode],[DateNaissanceConducteur] ,[Datepermis],[Numeropermis],[Profession],[CouleurCode],[ProtectionCode], [Assure],[Adresse] ,[GageCode],[NumeroMoteur],[NumeroImmatPrec],[DateImmatPrec],[TypeCommercial], [NombrePlaceHC] ,[DureeConduite],[CategorieCode],[SousCategorieCode],[NatureCode], [DepartementCode],[ClasseProfessionnelCode])
       VALUES (@CodeCaracteristic,@Zonecode,@CarosserieCode,@EnergieCode,@StatutCode,@NumeroImmatriculation  ,@DatePremiereImmatriculation,@DateImmatriculation,@ChargeUtile,@PoidsVide, @NombrePlace                      ,@PuissanceAdministrative,@PuissanceReelle,@GenreCode,@MarqueCode,@Serie, @ValeurVenale  ,@ValeurNeuf,@Types,@Conducteur,@TransportCode,@AjustementCode, @DateNaissanceConducteur ,@Datepermis,@Numeropermis,@Profession,@CouleurCode,@ProtectionCode,@Assure, @Adresse,@Gage ,@NumeroMoteur,@NumeroImmatPrec,@DateImmatPrec,@TypeCommercial,@NombrePlaceHC,@CategorieCode,@SousCategorieCode,@NatureCode,@DepartementCode, @ClasseProfessionnelCode)
     if @@error=0
        begin
         set @sms=(select DescMessage From EnMessage Where CodeMessage=3)
         commit transaction
        end
     else
         begin
          set @sms='Enregistrement non effectué'
          return
         end
          end
         end
          commit tran
        end
     
    --------------------------------------------------------------------------
     if (@Rep=2)
      begin
       begin transaction
               UPDATE [EnBufCaracteristicAuto]
               SET [Zonecode] = @Zonecode
                  ,[CarosserieCode] = @CarosserieCode
                  ,[EnergieCode] = @EnergieCode
                  ,[StatutCode] = @StatutCode
                  ,[NumeroImmatriculation] = @NumeroImmatriculation
                  ,[DatePremiereImmatriculation] = @DatePremiereImmatriculation
                  ,[DateImmatriculation] = @DateImmatriculation
                  ,[ChargeUtile] = @ChargeUtile
                  ,[PoidsVide] = @PoidsVide
                  ,[NombrePlace] = @NombrePlace
                  ,[PuissanceAdministrative] = @PuissanceAdministrative
                  ,[PuissanceReelle] = @PuissanceReelle
                  ,[GenreCode] = @GenreCode
                  ,[MarqueCode] = @MarqueCode
                  ,[Serie] = @Serie
                  ,[ValeurVenale] = @ValeurVenale
                  ,[ValeurNeuf] = @ValeurNeuf
                  ,[Types] = @Types
                  ,[Conducteur] = @Conducteur
                  ,[TransportCode] = @TransportCode
                  ,[AjustementCode] = @AjustementCode
                  ,[DateNaissanceConducteur] = @DateNaissanceConducteur
                  ,[Datepermis] = @Datepermis
                  ,[Numeropermis] = @Numeropermis
                  ,[Profession] = @Profession
                  ,[CouleurCode] = @CouleurCode
                  ,[ProtectionCode] = @ProtectionCode
                  ,[Assure] = @Assure
                  ,[Adresse] = @Adresse
                  ,[GageCode] = @Gage
                  ,[NumeroMoteur] = @NumeroMoteur
                  ,[NumeroImmatPrec] = @NumeroImmatPrec
                  ,[DateImmatPrec] = @DateImmatPrec
                  ,[TypeCommercial] = @TypeCommercial
                  ,[NombrePlaceHC] = @NombrePlaceHC
                  ,[DureeConduite] = @DureeConduite
                      ,[CategorieCode] = @CategorieCode
                      ,[SousCategorieCode] = @SousCategorieCode
                      ,[NatureCode]=@NatureCode
                      ,[DepartementCode]=@DepartementCode
                      ,[ClasseProfessionnelCode]= @ClasseProfessionnelCode
     WHERE [CaracteristicAutoCode] = @CodeCaracteristic
    if @@error=0
      begin                          
        set @sms=(select DescMessage From EnMessage Where CodeMessage=4)
        commit transaction
        end
      else
        begin
          set @sms='Mise à jour non effectuée'
          rollback transaction
        end
           end
         if (@Rep=3)
           begin
            begin transaction
              DELETE FROM EnBufCaracteristicAuto
              WHERE CaracteristicAutoCode = @CodeCaracteristic
              begin
               if @@error = 0
                 begin
                   set @sms=(select DescMessage From EnMessage Where CodeMessage=5)
                   commit transaction
                 end
               else
                 begin
                   set @sms='Suppression non effectuée'
                   rollback transaction
                 end 
             end  
            end
         end
      end
     commit transaction
    end
    j'ai effectuer plusieurs test afin de savoir pourquoi il ne fonctionne pas comme prévu mais rien. Selon moi elle doit pouvoir bien fonctionner
    Est ce que quelqu'un peut m'aider afin qu'elle puisse marcher convenablement ?
    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Mauvais :
    SET @er=(SELECT count(SaisieCode) FROM EnBufGarantieAuto WHERE FlagGarantie=1)
    Bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      SELECT @er=count(SaisieCode) FROM EnBufGarantieAuto WHERE FlagGarantie=1
    D'autre part avec vos tests imbriqués vous ne pouvez pas retrouver le fil transactionnel.C'est pourquoi on utilise GOTO pour la gestion des exception conduisant à un ROLBALBACK ou bien encore un bloc TRY/CATCH.

    A lire :
    1) avec GOTO : http://sqlpro.developpez.com/cours/s...nsactsql/#L4.6
    2) avec TRY CATCH : http://sqlpro.developpez.com/sqlserv...ge=tsql#LIII-D

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    Bonjour,

    J'en profite pour rebondir sur ce que vous dites SQL Pro concernant la différence entre SET et SELECT :

    Dans la documentation SQL Server, on trouve :
    "Pour affecter les variables, il est recommandé d'utiliser SET @local_variable à la place de SELECT @local_variable".

    On trouve aussi des informations intéressantes dans cet article.
    Notamment :

    When using a query to populate a variable, SET will fail with an error, if the query returns more than one value. But SELECT will assign one of the returned rows and mask the fact that the query returned more than one row. As a result, bugs in your code could go unnoticed with SELECT, and this type of bugs are hard to track down too.
    Jusqu'à maintenant, j'utilise donc SET dans l'affectation de variables.
    J'aurais donc dit que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @er=(SELECT count(SaisieCode) FROM EnBufGarantieAuto WHERE FlagGarantie=1)
    n'est pas si mal que ça.

    Qu'en pensez-vous ?

    Zabriskir

  4. #4
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    When using a query to populate a variable, SET will fail with an error, if the query returns more than one value. But SELECT will assign one of the returned rows and mask the fact that the query returned more than one row. As a result, bugs in your code could go unnoticed with SELECT, and this type of bugs are hard to track down too.
    Le SET est injustifié ici car ca ne risque pas d'arriver avec COUNT()

    @+

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 90
    Points : 54
    Points
    54
    Par défaut
    bonjour,
    merci pour votre aide,étant donnée que le tous me fatigue j'ai essai de diviser mes tâches(traitements) et cela marche à merveille.
    mais je continue toujours de chercher car il me semble cela devrait être un problème de structure
    Merci

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

Discussions similaires

  1. [2.x] comment bien utiliser les bundles
    Par bedio dans le forum Symfony
    Réponses: 1
    Dernier message: 29/04/2015, 11h53
  2. Comment bien utiliser les préfixes
    Par snake264 dans le forum Web sémantique
    Réponses: 0
    Dernier message: 25/08/2011, 16h33
  3. Comment utiliser les transactions avec UIB
    Par zoheir13 dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 13/01/2011, 09h51
  4. [HTML 5] Comment bien utiliser les balise <section><article> et <aside>
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 31/08/2010, 17h17
  5. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 16h37

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