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 éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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 chevronné 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 : 51
    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
    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 éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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 : 54
Taille : 26,2 Ko

  4. #4
    Membre chevronné 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 : 51
    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
    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 éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    oui enfin je voulais dire le premier je pense
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

    Informations professionnelles :
    Activité : Développeur informatique

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

  10. #10
    Membre chevronné 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 : 51
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    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)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  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
    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.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  13. #13
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    si ca fait ce qu'il veut, c'est bien pratique !
    meme pour les compute d'une requete
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    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
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    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