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

ASP.NET Discussion :

Ajout de données dans 2 tables simultanément [Débutant]


Sujet :

ASP.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Ajout de données dans 2 tables simultanément
    Bonjour tout le monde.
    Je suis étudiant en informatique et actuellement en stage.
    Je dois faire une application permettant le suivie du cycle de vie de produits situé dans une infrastructure.
    Ces produits sont amenés à être réparer suite à des pannes. Ces pannes sont détecter et ou réparer par des personnes internes à l'établissement (UTILISATEUR) ou par des personnes externes (INTERVENANT), les deux figurants dans une table PERSONNE.

    En ce moment, je bute sur un problème qui est d'ajouter simultanément des données dans 2 tables.

    J'ai ma table :
    PERSONNE (id_pers, nom, prenom).
    SOCIETE (id_soci, nom, adresse, telephone).
    INTERVENANT, qui hérite de personne et qui appartient à une société (#id_pers, #id_soci, nom, prenom).

    Sur ma page de gestion (là où j'ajoute des personnes), j'ai une dropdownlist qui me permets de choisir si cette personne est interne ou externe.
    Comme la table INTERVENANT a besoin de l'id_pers et l'id_soci, j'ai deux requêtes SQL qui vont récuperer l'id et l'inserer dans la table INTERVENANT, cependant j'ai une erreur et je bloque dessus depuis pas mal d'heure.

    Voici mes requêtes:

    Ici l'ajout de personne dans PERSONNE (aucun soucie).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Requête pour ajouter dans la table PERSONNE une personne
                SqlCommand cmdAddPersonne = new SqlCommand();
                cmdAddPersonne.Connection = ConnectionToSql.c;
                cmdAddPersonne.CommandText = "INSERT into PERSONNE(NOM, PRENOM) VALUES('" + txtBoxNom.Text + "', '" + txtBoxPrenom.Text + "')";
    Là la récupération de l'id_soci en fonction du nom de société à laquelle appartient là personne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdAddSocieteToIntervenant.CommandText = "INSERT into INTERVENANT(ID_SOCIETE) VALUES(' ') SELECT ID_SOCIETE FROM SOCIETE WHERE NOM_SO='" + DropDownListSociete.Text + "'";
    C'est là que j'ai mon erreur.

    Informations supplémentaires : L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "FK_INTERVENANT_SOCIETE". Le conflit s'est produit dans la base de données "bd_parc_info", table "dbo.SOCIETE", column 'ID_SOCIETE'.


    Et la deuxième qui va récupérer l'id_pers dans PERSONNE et l'ajouter dans INTERVENANT avec nom et prénom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdAddPersonneToIntervenant.CommandText = "INSERT into INTERVENANT(ID_PERSONNE, NOM, PRENOM) VALUES(' ', '" + txtBoxNom.Text + "', '" + txtBoxPrenom.Text + "') SELECT ID_PERSONNE FROM PERSONNE WHERE NOM='" + txtBoxNom.Text + "' AND PRENOM='" + txtBoxPrenom.Text + "'";
    Je travail sur VisualStudio 2014 avec SQL Server 2012.
    J’espère avoir été clair et je vous remercie.

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    les deux dernières requêtes tu nous parles de "récupération" alors que tu fais des INSERT, je suis pas sûr de bien comprendre.
    Pourrais-tu nous mettre les CREATE TABLE avec les différentes CONSTRAINT pour qu'on comprenne un peu mieux ?
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Merci pour la réponse.

    Eh bien en fait dans ma première requête, je select l'id en fonction de ce que j'ai choisi dans la ddl pour ensuite l’insérer dans la table INTERVENANT, d'où mon utilisation du mot "récupération".

    Je ne sais pas si c'est ce que tu me demandes, mais voilà:

    PERSONNE

    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
    USE [bd_parc_info]
    GO
     
    /****** Object:  Table [dbo].[PERSONNE]    Script Date: 05/05/2017 11:35:36 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[PERSONNE](
    	[ID_PERSONNE] [int] IDENTITY(1,1) NOT NULL,
    	[NOM] [char](32) NULL,
    	[PRENOM] [char](32) NULL,
     CONSTRAINT [PK_PERSONNE] PRIMARY KEY CLUSTERED 
    (
    	[ID_PERSONNE] 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
     
    SET ANSI_PADDING OFF
    GO
    SOCIETE

    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
    USE [bd_parc_info]
    GO
     
    /****** Object:  Table [dbo].[SOCIETE]    Script Date: 05/05/2017 11:35:26 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[SOCIETE](
    	[ID_SOCIETE] [int] IDENTITY(1,1) NOT NULL,
    	[NOM_SO] [varchar](50) NULL,
    	[ADRESSE] [varchar](50) NULL,
    	[TELEPHONE] [varchar](50) NULL,
     CONSTRAINT [PK_SOCIETE] PRIMARY KEY CLUSTERED 
    (
    	[ID_SOCIETE] 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
     
    SET ANSI_PADDING OFF
    GO
    INTERVENANT

    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
    USE [bd_parc_info]
    GO
     
    /****** Object:  Table [dbo].[INTERVENANT]    Script Date: 05/05/2017 11:34:39 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[INTERVENANT](
    	[ID_PERSONNE] [int] NULL,
    	[ID_SOCIETE] [int] NULL,
    	[NOM] [char](32) NULL,
    	[PRENOM] [char](32) NULL
    ) ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [dbo].[INTERVENANT]  WITH CHECK ADD  CONSTRAINT [FK_INTERVENANT_PERSONNE] FOREIGN KEY([ID_PERSONNE])
    REFERENCES [dbo].[PERSONNE] ([ID_PERSONNE])
    GO
     
    ALTER TABLE [dbo].[INTERVENANT] CHECK CONSTRAINT [FK_INTERVENANT_PERSONNE]
    GO
     
    ALTER TABLE [dbo].[INTERVENANT]  WITH CHECK ADD  CONSTRAINT [FK_INTERVENANT_SOCIETE] FOREIGN KEY([ID_SOCIETE])
    REFERENCES [dbo].[SOCIETE] ([ID_SOCIETE])
    ON UPDATE SET DEFAULT
    GO
     
    ALTER TABLE [dbo].[INTERVENANT] CHECK CONSTRAINT [FK_INTERVENANT_SOCIETE]
    GO

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Alors je dirais que le souci vient simplement de la syntaxe de ta deuxième requête.
    Tu as deux possibilités pour faire un insert : le INSERT VALUES et le INSERT SELECT.
    Dans ton cas il faut faire sauter le VALUES(' ').
    Maintenant je comprends pas bien ton cheminement pour cette insertion.
    Tu ferais mieux de récupérer l'ID du gars que tu viens de créer pour faire directement l'INSERT avec les 2 ID, enfin c'est mon avis.

    edit : et je te conseille d'utiliser les requêtes paramétrées, c'est tout bénef'.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Très bien merci, je vais alors essayé d'utiliser les requêtes paramétrées.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Plusieurs remarques :
    - Comme dit précédemment, utilisez des requêtes paramétrées : vous éviterez de planter, voir vous faire pirater, le tout en améliorant drastiquement vos performances
    - Vu qu'il peut y avoir potentiellement des homonymes chez les personnes et des synonymes dans les sociétés, rechercher une personne par ses noms et prénom, ainsi qu'une société par son nom risque un jour de vous ramener plus d'une ligne, et provoquer un plantage
    - De la même manière, si d'aventure un trigger vient modifier le nom/prenom ou nom de la société entre le moment où vous l'insérez et le moment où vous le relisez, vous risquez de ne plus retrouver la ligne et planter
    - Il faut que tout ce petit monde soit dans une transaction : ça é"vitera d'avoir des personnes orphelines et des sociétés fantôme en cas d'erreur.
    - Afin de réduire le nombre d'échanges avec la base, rendre votre code plus pérenne et plus performant, vous avez tout intérêt à passer par une procédure stockée.

    Pour récupérer la liste des ID créés par une instruction "INSERT", il faut utiliser la clause "OUTPUT".
    => Ceci permet de récupérer la liste des ID créées plutôt que de faire une recherche : plus performant et plus fiable.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT into PERSONNE (NOM, PRENOM) VALUES(@nom, @prenom) OUTPUT INSERTED.ID

    => Lancer cette requête avec un ExecuteScalar pour récupérer l'ID créé.

    Ensuite, pour faire la procédure stockée, vous pouvez faire comme suit :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    create procedure add_intervenement(@nom varchar(32), @prenom varchar(32), @societe varchar(32))
    as
    begin
        DECLARE @MyPerson table(ID int NOT NULL);
        DECLARE @MyCompany table(ID int NOT NULL);
     
        INSERT into PERSONNE (NOM, PRENOM) VALUES(@nom, @prenom) OUTPUT INSERTED.ID INTO @MyPerson;
        INSERT into SOCIETE (NOM) VALUES(@societe) OUTPUT INSERTED.ID INTO @MyCompany;
     
        INSERT INTO INTERVENANT (id_personne, id_societe)
        select p.id, c.id
        from @MyPerson p
        cross join @MyCompany c
    end
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour, merci StringBuilder pour cette réponse.
    Alors, concernant la procédure stockée, je l'ai un peu modifié, vu qu'en effet, en fonction du nom et prénom on insert 2 id.
    La 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
    CREATE PROCEDURE add_intervenant(@nom varchar(32), @prenom varchar(32))
    AS
    BEGIN
    	DECLARE @MyPerson table(ID int NOT NULL);
            DECLARE @MyCompany table(ID int NOT NULL);
     
    	INSERT INTO PERSONNE (NOM, PRENOM) OUTPUT INSERTED.ID_PERSONNE INTO @MyPerson VALUES(@nom, @prenom);
    	INSERT INTO INTERVENANT (id_personne, id_societe)
     
        select p.id, c.id
        from @MyPerson p
        cross join @MyCompany c
    END
    GO
    J'ai 2 questions, pourquoi avoir la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO PERSONNE (NOM, PRENOM) OUTPUT INSERTED.ID_PERSONNE INTO @MyPerson VALUES(@nom, @prenom);
    si j'ai déjà une requête paramétrées qui s'en charge ?

    Et pourrai-tu m'expliquer les 3 dernières lignes de la procédure, à savoir le select, from et cross merci.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    La procédure stockée annule et remplace la requête paramétrée.

    Quant à la dernière requête (qui fait 4 lignes), elle permet d'insérer dans la table "INTERVENANT" une ligne correspondant à l'ID de la personne créée ainsi que l'ID de la société créée.

    L'avantage de passer par cette procédure stockée, c'est que si demain l'algo évolue pour insérer ou remplacer les lignes de personne/societe en fonction de la présence ou non d'homonyne, tu as juste la procédure à modifier, sans devoir toucher au code des applications qui l'utilisent.
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Je te remercie.

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

Discussions similaires

  1. [AC-2007] Ajouter des données dans une table vide
    Par othke dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/04/2010, 19h16
  2. Access/VBA Ajouter des données dans une table !
    Par vto59 dans le forum VBA Access
    Réponses: 10
    Dernier message: 04/06/2009, 15h18
  3. requêtes ajout plusieurs données dans une table
    Par COLOMBAT dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/04/2008, 17h27
  4. [MySQL] Ajouter des données dans une table avec la cmd update
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/09/2007, 19h54
  5. Réponses: 6
    Dernier message: 15/04/2004, 11h04

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