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 :

Procédure stockée avec boucle


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut Procédure stockée avec boucle
    Bonjour,

    je développe une petite application dans laquelle j'inscris dans ma BD un nouveau membre. Pour chacun des membres j'ai la possibilité de sélectionner un certain nombre d'options dont le nombre peut varier.

    J'utilise une procédure stocké qui inscrit le nouveau membre dans ma table "membres" et j'ai une autre table "options" qui reprend la liste des options choisies par chacun des membres.

    Mon problème est que je ne vois pas trop comment dans ma procédure stocké 1° récupérer la liste d'option en paramètres et 2° comment boucler pour enregistrer les options pour un membre dans la table "options".

    L'inscription du membre en elle même se fait correctement.

    Auriez-vous une idée?

    Merci

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Postez la DLL de votre table options.
    Quel est la version de SQL SERVER?
    Si 2008 ou plus utilisez les TVP.
    http://blog.sqlauthority.com/2008/08...l-server-2008/

  3. #3
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut
    Bonjour et merci pour votre aide,

    en fait ma table 'Option' s'appelle cours (qui reprend tous les cours donnés) et voici sa structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE [dbo].[Cours](
    	[IDCours] [int] IDENTITY(1,1) NOT NULL,
    	[LibelleCours] [varchar](50) NOT NULL,
     CONSTRAINT [PK_Cours] PRIMARY KEY CLUSTERED 
    (
    	[IDCours] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
    j'ai également une table EleveCours qui permet de stocker la liste des cours suivis pour chacun des eleves. La structure est la suivante:

    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
     
    CREATE TABLE [dbo].[EleveCours](
    	[IDCours] [int] NOT NULL,
    	[IDEleve] [int] NOT NULL
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[EleveCours]  WITH CHECK ADD  CONSTRAINT [FK_EleveCours_Cours] FOREIGN KEY([IDCours])
    REFERENCES [dbo].[Cours] ([IDCours])
    GO
     
    ALTER TABLE [dbo].[EleveCours] CHECK CONSTRAINT [FK_EleveCours_Cours]
    GO
     
    ALTER TABLE [dbo].[EleveCours]  WITH CHECK ADD  CONSTRAINT [FK_EleveCours_Eleve] FOREIGN KEY([IDEleve])
    REFERENCES [dbo].[Eleve] ([IDEleve])
    GO
     
    ALTER TABLE [dbo].[EleveCours] CHECK CONSTRAINT [FK_EleveCours_Eleve]
    Lors de l'inscription d'un élève, on peut sélectionner les cours qu'il va suivre et c'est cette "liste" que j'ai du mal à passer à ma procédure stockée. De plus, comment la traiter dans le procédure?

    Merci

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Pourquoi ne pas utiliser un paramètre de type table dans votre procédure pour envoyé la liste des cours ?

    En gros, ça donnerait quelque chose dans le genre :
    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
     
    CREATE TYPE [dbo].
    [LISTE_COURS] AS TABLE(
        [ID_COURS] [INT] NOT NULL
        PRIMARY KEY CLUSTERED 
    (
        [ID_COURS] ASC
    )WITH (IGNORE_DUP_KEY = OFF)
    )
    GO
     
    CREATE PROCEDURE UP_ELEVE_INSCRIPTION
        @NOM_ELEVE VARCHAR(30),
        @PRENOM_ELEVE VARCHAR(30),
        --AUTRE INFOS CONCERNANT L'ELEVE
        @COURS LISTE_COURS READONLY
    AS
    BEGIN
        SET NOCOUNT ON;
     
        INSERT INTO T_ELEVE(NOM,PRENOM/*AUTRE INFOS*/)
        VALUES(@NOM_ELEVE, @PRENOM_ELEVE);
     
        DECLARE @ID_ELEVE INT;
        SET @ID_ELEVE = SCOPE_IDENTITY();
     
        INSERT INTO ELEVECOURS(IDCOURS, IDELEVE)
        SELECT
                ID_COURS,
                @ID_ELEVE
        FROM
                COURS;
    END
    De cette manière, aucune vilaine boucle itérative dans ce beau langage ensembliste.

    Enfin c'est ce que moi je ferais. Etant encore loin d'être expert en la matière, je suggère tout de même d'attendre un autre avis pour confirmer ou infirmer ma méthode.

    ++

  5. #5
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut
    Bonjour Kropernic

    je suis en train de regarder le lien donné par iberserk. Et j'ai effectivement créé une table type comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TYPE CoursType AS TABLE
    (
    CoursId INT, CoursNom VARCHAR(50)
    );
    GO
    mais j'ai encore du mal à voir comment passer ma liste.

    Merci

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Au moment de l'appel à votre procédure stockée dans votre code applicatif, c'est là que vous devez passer un paramètre de type table.

    Voici un article détaillé avec un exemple en VB.NET.

    Vous pouvez trouvé de nombre exemple de ce type à l'aide google

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Vous pouvez trouvé de nombre exemple de ce type à l'aide google
    Comme le lien que j'avais passé par exemple?

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Comme le lien que j'avais passé par exemple?
    Le pire c'est que j'ai ouvert votre lien ! Puis j'ai fait autre chose et je suis revenu sur la question quelques minutes plus tard en ayant oublié que vous aviez déjà donné la solution...

    [hors sujet]
    D'ailleurs, votre message m'a donné des sueurs froides car je développe avec sql server 2008 express (car j'ai un processeur 64 bit sur mon portable et que la version 2005 ne marche pas avec ça^^) alors que le serveur de prod lui est encore avec la version 2005.
    Et justement, pas plus tard que hier, j'ai écrit une procédure avec un table-valued parameter... Et là, je vois que c'est à partir de 2008... GLUPS !
    Heureusement, l'application en cours de developpement n'entre en prod qu'en mars et on aura migrer vers 2008 d'ici la fin de l'année.

    OUF !
    [/hors sujet]

  9. #9
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut
    Bonjour,

    j'ai consulté vos 2 liens et également d'autres trouvés sur le net, mais j'ai encore des doutes.

    Si j'ai une même procédure stockée qui fait :
    1° enregistrement de l'élève
    2° enregistrement des cours suivis par cet élève -> utilisation de Table Value Parameters

    Dans mon code C#, pour passer les différents cours par paramètres à ma procédure, je dois spécifier le type de SqlParameter en DbType.Structured hors les autres paramètres(nom, prénom, age...) sont "normaux".

    Est-ce possible ou bien je dois créer 2 procédures?
    Par exemple :
    la 1° qui enregistrement de l'élève
    la 2° qui enregistrement des cours suivis par cet élève
    et donc créer 2 objets Paramètres différents?

    J'avoue que je coince à ce niveau là.

    Merci

  10. #10
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Votre procédure stockée doit tout simplement comporter par exemple 3 paramètres:
    Un string (au sens Code client) NOM
    Un string (au sens Code client) PRENOM
    Une liste d'entiers correspondant aux cours suivis par votre élève de type Structured...

    Vous n'avez plus quà faire deux requètes dans votre procédure stockée:
    Une insérant l'élève (nom, prenom)

    Une insérant d'un coup la liste des cours suivis par cet élève

Discussions similaires

  1. [2008R2] Procédure stockée avec une boucle sur les resultat
    Par sak_ura dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/02/2013, 09h23
  2. Procédure stockée avec SELECT UNION
    Par maredami dans le forum Oracle
    Réponses: 4
    Dernier message: 07/11/2005, 11h05
  3. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51
  4. Procédure stockée avec param de sortie:marchepas av ADO
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/10/2004, 12h04

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