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 :

imbrication de procédures stockées


Sujet :

C#

  1. #1
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut imbrication de procédures stockées
    Bonjour,

    J'ai déjà créé ce sujet sur le forum sql server mais on m'a dit que les procédures étaient correctes donc je me permet de venir poster ici. http://www.developpez.net/forums/sho...d.php?t=592228

    J'ai cette procédure stocké :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE PROCEDURE [dbo].[proc1]
    As
    BEGIN
         insert into matable(champs1) values('pouet')
         select @@identity as resultat1
    END
    maintenant, j'ai une deuxieme procédure qui appelle la premier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE PROCEDURE [dbo].[proc2]
    As
    BEGIN
         exec proc1
         insert into matable2(champs1) values('pouet2')
         select @@identity as resultat2
    END
    Mon problème est que quand j'appelle proc2, je recois en retour le résultat de proc1 et je ne veux récupérer que le résultat de proc2.

    Voici la partie C#
    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
     
                    string connectString = ConfigurationManager.ConnectionStrings["test"].ToString();
                    SqlConnection conn = new SqlConnection(connectString);
                    conn.Open();
     
                    SqlCommand cmd = new SqlCommand("proc2", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlDataReader r = cmd.ExecuteReader();
     
                    if (r.Read())
                    {
                        int test = r.GetInt32(0);
                    }
                    r.Close();
                    conn.Close();
    Si quelqu'un pouvait m'expliquer ce qui ne va pas. Merci d'avance.

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Lorsque tu executes tes SP sur le Query Analyser ou SQL Server Management Studio l'identity retourné est-il le bon ?

    Sinon, au lieu de passer par un Reader, fait un ExecuteScalar.
    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
    string connectString = ConfigurationManager.ConnectionStrings["test"].ToString();
    SqlConnection conn = new SqlConnection(connectString);
    SqlCommand cmd = new SqlCommand("proc2", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    object resultat = null;
    try
    {
      cmd.Connection.Open();
      resultat = cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
      throw ex;
    }
    finally
    {
      cmd.Connection.Close();
    }
    return resultat;
    Cordialement

  3. #3
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    Bonjour,

    Je viens de tester avec la méthode executeScalar(). J'obtiens le résultat de proc1 au lieu d'obtenir le résultat de proc2...


    Si j'exécute dans management studio, voici le résultat en piece jointe
    Nom : sp_result.png
Affichages : 49
Taille : 26,2 Ko

  4. #4
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    OK !
    Voilà comment j'interprête le problème. La requête te retourne 2 résultats mais ton code ne prend que le premier.

    La solution que je te conseille est de ne pas imbriquer ces SP et de les appeler successivement dans ton code client.

    Cordialement

  5. #5
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    non elle ne me retourne pas les 2 résultats, elle ne m'en renvoit qu'un seul.
    J'ai testé avec un while(r.Read()) et je n'ai qu'une seule valeur.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    c'est normal, studio management affiche successivement les résultats des différentes requetes passée
    alors qu'un reader ne retourne que le dernier select

    c'est comme ca, tu ne peux rien y faire, à part modifier ce que tu fais

  7. #7
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    c'est normal, studio management affiche successivement les résultats des différentes requetes passée
    alors qu'un reader ne retourne que le dernier select

    c'est comme ca, tu ne peux rien y faire, à part modifier ce que tu fais
    justement ! j'aimerais qu'il me renvois le dernier select. La il me renvoit le select de la procédure appelé dans la procédure.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    oui enfin je voulais dire le premier je pense

  9. #9
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    y aurait il un moyen pour quel l'exec proc1 ne retourne pas de résultat ?

  10. #10
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Retirer le select @@identity qui s'y trouve OU ne pas imbriquer ces SP et de les appeler successivement dans ton code client.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    ou alors mettre un paramètre booléen en entrée qui permet de dire si tu veux ou non que proc1 retourne son résultat (via un if)

  12. #12
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Essaie avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (reader.NextResult())
    {
        while (reader.Read())
        {
            ...
        }
    }
    Tu verras déjà s'il te renvoie un ou deux resultsets.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Sinon, il suffit de passer au résultat suivants dans ton objet SqlDataReader après la première lecture :

    r.NextResult();

    Edit : Zut, SaumonAgile m'a grillé ...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    si ca fait ce qu'il veut, c'est bien pratique !
    meme pour les compute d'une requete

  15. #15
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Essaie avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (reader.NextResult())
    {
        while (reader.Read())
        {
            ...
        }
    }
    Tu verras déjà s'il te renvoie un ou deux resultsets.
    Effectivement, il me renvoit 2 resultsets... Mais si ma proc 2 appelle plusieurs fois proc1 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE [dbo].[proc2]
    As
    BEGIN
         exec proc1
         exec proc1
         exec proc1
         exec proc1
         insert into matable2(champs1) values('pouet2')
         select @@identity as resultat2
    END
    Comment puis-je savoir quel resultset utiliser ? Il n'y a pas de méthode LastResult()


    ou alors mettre un paramètre booléen en entrée qui permet de dire si tu veux ou non que proc1 retourne son résultat (via un if)
    Effectivement cette solution pourrait convenir, mais je la trouve bien bourrin ! Je pensais que ce genre de problématique se posait à pas mal de monde et qu'il y avait une méthode pour ce genre de chose. Mais j'en demande peut etre trop

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    je trouve pas ca bourrin


    et puis tu peux aussi demander ton identity autre part que dans ta procédure stockée, il n'y a pas que @@identity, y a des fonctions ou tu peux passer le nom de la table je crois ou scopeidentity est ptete bien aussi

  17. #17
    Membre averti Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Points : 392
    Points
    392
    Par défaut
    Ca y est ! J'ai trouvé ! Merci le DBA

    En fait, il suffit de définir un paramètre de type output dans proc1 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ALTER PROCEDURE [dbo].[proc1]
    @test  int output 
    AS
    BEGIN
         INSERT INTO matable(champs1) VALUES('pouet')
         SELECT @test = @@identity
    END
    puis dans proc2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ALTER PROCEDURE [dbo].[proc2]
    AS
    BEGIN
        declare @t int;
        exec proc1 @t output
        INSERT INTO matable2(champs2) VALUES('pouet2')
        SELECT @@identity AS resultat2
    END
    Merci beaucoup pour votre aide

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Imbrication de procédures stockées
    Par ed222 dans le forum Développement
    Réponses: 4
    Dernier message: 21/06/2010, 10h07
  3. imbrication de procédures stockées
    Par flogreg dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2008, 16h06
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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