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

C# Discussion :

gestion d'une raise erreur dans une procédure stockée


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut gestion d'une raise erreur dans une procédure stockée
    bonjour,
    tout d'abord veuillez m'excusé si je ne suis pas sur le bon forum mais je ne savais pas trop ou le mettre ,
    je travaille sous visual studio community et sous sql server management et j'utilise une entitie framework pour gerer le tous
    j'ai donc un problème car je ne sais pas comment gérer un raise erreur contenue dans ma procédure stockée que voici :

    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
    CREATE PROCEDURE [dbo].[Usp_Tie_Tiers_Org_Update]
    	@TIE_ID int,
    	@ORG_REF dbo.D_REF_COURTE,
    	@ORG_NOM_COMMUN NOM_TIERS,
    	@ORG_NUM_INTRACOM varchar(32),
    	@TIE_COMPTA_CODE_INDIV varchar(16),
    	@TIE_COMPTA_CODE_CENTR varchar(16),
    	@TIE_COMPTA_CLEF varchar(16),
    	@TIE_COMPTA_SOCIETE varchar(96),
    	@TIE_ECH_NOMBRE smallint,
    	@TIE_ECH_JM smallint,
    	@TIE_ECH_TYPE smallint,
    	@TIE_REGL_TYPE smallint,
    	@TIE_IMPR_EXEMP smallint,
    	@TIE_ESC_TAUX numeric(15, 4),
    	@TIE_DOMB_ADR varchar(max),
    	@TIE_RIB_CODE_ETAB varchar(16),
    	@TIE_RIB_CODE_GUI varchar(16),
    	@TIE_RIB_NUM_COMPTE varchar(16),
    	@TIE_RIB_CLEF varchar(16),
    	@TIE_MEMO varchar(max)
    AS
    BEGIN
    	SET NOCOUNT ON;
     
    	DECLARE 
    		@NB INT,
    		@TRANCOUNT INT,
    		@ERROR INT,
    		@ROWCOUNT INT, 
    		@NB_AFF INT,
    		@NB_COMM INT,
    		@NB_DEVIS INT,
    		@NB_FACT INT,
    		@ORG_REF_OLD dbo.D_REF_COURTE,
    		@ORG_NOM_COMMUN_OLD NOM_TIERS,
    		@CURRENT_USER VARCHAR(128);
     
    	SELECT 
    		@ORG_REF_OLD = ORG_REF,
    		@ORG_NOM_COMMUN_OLD = ORG_NOM_COMMUN
    	FROM dbo.T_ORGANISATION_ORG
    	WHERE TIE_ID = @TIE_ID;
    	SET @CURRENT_USER = dbo.Ufn_Sys_User_name();
     
    	IF (@ORG_REF_OLD <> @ORG_REF OR @ORG_NOM_COMMUN_OLD <> @ORG_NOM_COMMUN) AND 
    	(@CURRENT_USER NOT IN ('BrunoPetit','Administrateur','JeanMichelImberti'))  
    	BEGIN
    		SELECT @NB_AFF = NBAFF FROM dbo.V_TIERS_COUNT_AFF WHERE TIE_ID = @TIE_ID;
    		SELECT @NB_COMM = NBCOMM FROM dbo.V_TIERS_COUNT_COMM WHERE TIE_ID = @TIE_ID;
    		SELECT @NB_DEVIS = NBDEVIS FROM dbo.V_TIERS_COUNT_DEVIS WHERE TIE_ID = @TIE_ID;
    		SELECT @NB_FACT = NBFACT FROM dbo.V_TIERS_COUNT_FACT WHERE TIE_ID = @TIE_ID;
    		IF ISNULL(@NB_AFF,0) > 0 OR
    		ISNULL(@NB_COMM,0) > 0 OR		
    		ISNULL(@NB_DEVIS,0) > 0 OR
    		ISNULL(@NB_FACT,0) > 0
    		BEGIN
    			RAISERROR( 'Modification impossible de [Ref] ou [Nom commun], le tiers a des documents enregistrés, faites une demande à l''administrateur GPG' , 16, 1);			
    			RETURN(-1);
    		END	
    	END
     
    	BEGIN TRANSACTION
    	SET @TRANCOUNT = 1;
     
    	UPDATE dbo.T_TIERS_TIE 
    	SET
           TIE_COMPTA_CODE_INDIV = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_COMPTA_CODE_INDIV),
           TIE_COMPTA_CODE_CENTR = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_COMPTA_CODE_CENTR),
           TIE_COMPTA_CLEF = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_COMPTA_CLEF),
           TIE_COMPTA_SOCIETE = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_COMPTA_SOCIETE),
           TIE_ECH_NOMBRE = @TIE_ECH_NOMBRE,
           TIE_ECH_JM = @TIE_ECH_JM,
           TIE_ECH_TYPE = @TIE_ECH_TYPE,
           TIE_REGL_TYPE = @TIE_REGL_TYPE,
           TIE_IMPR_EXEMP = @TIE_IMPR_EXEMP,
           TIE_ESC_TAUX = @TIE_ESC_TAUX,
           TIE_DOMB_ADR = @TIE_DOMB_ADR,
           TIE_RIB_CODE_ETAB = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_RIB_CODE_ETAB),
           TIE_RIB_CODE_GUI = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_RIB_CODE_GUI),
           TIE_RIB_NUM_COMPTE = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_RIB_NUM_COMPTE),
           TIE_RIB_CLEF = dbo.Ufn_Gen_StringFilterNullSpace(@TIE_RIB_CLEF),
    	   TIE_MEMO = @TIE_MEMO,	
    	   TIE_DAMAJ = Getdate(),
    	   TIE_USEMAJ = dbo.Ufn_Sys_User_name()
    	WHERE TIE_ID = @TIE_ID;
    	SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
    	IF @ERROR <> 0 OR @ROWCOUNT = 0 GOTO LBL_ERROR;
     
    	UPDATE dbo.T_ORGANISATION_ORG
    	SET
    		ORG_REF = dbo.Ufn_Gen_StringFilterNullSpace(@ORG_REF),
    		ORG_NOM_COMMUN = dbo.Ufn_Gen_StringFilterNullSpace(@ORG_NOM_COMMUN),
    	    ORG_NUM_INTRACOM = dbo.Ufn_Gen_StringFilterNullSpace(@ORG_NUM_INTRACOM)
    	WHERE TIE_ID = @TIE_ID;
    	SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
    	IF @ERROR <> 0 OR @ROWCOUNT = 0 GOTO LBL_ERROR;
     
     
    	COMMIT TRANSACTION;
    	RETURN (0); 
     
    	LBL_ERROR:
    	IF @@TRANCOUNT > 1
    		COMMIT TRANSACTION
    	IF @TRANCOUNT > 0
    		ROLLBACK TRANSACTION
    	IF @ROWCOUNT >= 1
    		ROLLBACK TRANSACTION
    	RETURN (-1)		
     
    END
    ceci est la procédure que mon tuteur de stage ma fournie , a savoir que mon problème n'est pas de la faire fonctionné mais plus tôt de gérer les erreur rtourne par la processedure par exemple j'aimerais affiché RAISERROR( 'Modification impossible de [Ref] ou [Nom commun], le tiers a des documents enregistrés, faites une demande à l''administrateur GPG' , 16, 1)dans une messagebox mais je ne sais pas comment récupéré cette erreur , comme l'indique cette erreur Ref ne doit pas être changer , or si je change la valeur de ref mon code me génère une erreur en c#
    Exception levée : 'System.Data.Entity.Core.EntityCommandExecutionException' dans EntityFramework.SqlServer.dll, je suppose que cela et du a ma raise error mais pas sur de plus je ne sais pas comment gérer cette erreur la.
    merci d'avance pour vos réponse

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut
    j'ai posée un colle la ou bien ?

  3. #3
    Membre actif
    Homme Profil pro
    Developpeur
    Inscrit en
    Février 2013
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Février 2013
    Messages : 180
    Points : 271
    Points
    271
    Par défaut
    Pour moi oui ^^
    ne faisant pas de procédure stocké, je ne pourrais pas du tout te donner la moindre piste.

    par contre tu es dans la mauvaise section du forum, tu as essayé dans la partie SQL ? tu devrai avoir plus de chance.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Non ce n'est pas une colle, c'est juste pas standard. Les erreurs SQL sont différentes des erreurs C#. Elles sont isolées.

    Si tu veux récupérer le message d'erreur tu dois rajouter un OUTPUT parameter, par exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    @ErrorMessage NVARCHAR(MAX) OUTPUT
    Ensuite lors d'une erreur tu fais un RAISE pour stopper l'exécution, et tu mets un message dans @ErrorMessage que tu récupères ensuite en C#.

    Mais c'est lourd et ce n'est pas fait pour ca... C'est de la bidouille.

    Le mieux, c'est d'utiliser le code d'erreur plus intelligemment : au lieu de retourner -1, tu retournes un code spécifique (au pif par exemple 2655). Ensuite en C# tu sauras que si tu le code retour est 2655, ca correspond à un message d'erreur en particulier. Cela a l'avantage de ne retourner qu'un int (beaucoup plus léger qu'un string) et d'être supporté nativement.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 63
    Points
    63
    Par défaut
    merci pour la réponse mais il y a un autre moyen en effet visualstudio récupéré tout seul la raise erreur j'ai réussit a l'affiche de la manière suivante ,
    d'abord on catch l'erreur ou l'on peux perso je l'ai fais dans le service coter serveur , j'ai aussi du désactiver l’arrêt du code lors du levage de l’exception(pas très recommander )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        catch (Exception e)
        {
            raiseerror = e;
            return false;
        }
    }
     
    public static Exception raiseerror;
     
    public string RaiseException()
    {
        return raiseerror.InnerException.Message;
    }
    puis coter client je traite l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     
     
    var a=client.AjoutFicheOrg(selectedTier, textBox_Ref_Donnee_Org, textBox_Nom_Commun_Donnee_Org, textBox_Num_Intra_Donnee_Org, textBox_Memo_Donnee_Org);
                                         string exception = client.RaiseException();
                                       ListeDeFichesOrg = new ObservableCollection<FicheTier>(client.GetTiersOrg(checkBox_Fournisseur_org, CheckBox_Client_org, checkBox_Ref_Org, checkBox_Nomcommun_org, checkBox_Adresse_org, checkBox_Codepostal_org, checkBox_Ville_org, texteBox_Ref_Org, texteBox_Nomcommun_Org, texteBox_Adresse_Org, texteBox_Codepostal_Org, texteBox_Ville_Org, comboBox_Ref_org, comboBox_Nomcommun_org, comboBox_Adresse_org, comboBox_Codepostal_org, comboBox_Ville_org));
                                       if (a == false)
                                       {
                                           MessageBox.Show(exception);
                                       }
                                       client.Close();
                                   }
    cette méthode marche mais c'est de la bonne grosse bidouille et j'aimerais bien une manière de faire plus orthodoxe , de plus pendant que je cherche la solution en modifiant mon code j'ai réussit a l'afficher uniquement en changeant quelque paramètre dans visual studio mais le problème c'est que sur le moment j'ai pas fais gaffe et j'ai réinitialiser les paramètres et bah ensuite impossible de retrouver et ça c'est très moche

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  3. Copier une feuille Excel dans une autre : Erreur 9
    Par Secco dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/06/2008, 11h24
  4. Réponses: 3
    Dernier message: 06/11/2007, 19h15
  5. Réponses: 12
    Dernier message: 12/05/2006, 09h21

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