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 :

Récupérer l'id après une requête INSERT


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Par défaut Récupérer l'id après une requête INSERT
    Bonjour,
    Je cherche à récupérer l'ID donné à une ligne dans ma table après une requête INSERT.

    j'ai cherché sur le web, j'ai vu que ça parlait pas mal de scope_identity et de @@Identity mais je ne comprend pas trop le fonctionnement

    Quelqu'un aurait un exemple ... grossièrement voici ce que je pensais faire mais forcément je ne comprends pas comment on récupère le Id ( ou ? dans quelle variable ) dans cette ligne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string req = "INSERT INTO rendezvous (objet,debut,fin) VALUES ('" + rdv.objet + "', + '" + rdv.debut + "','" + rdv.fin + "') ; SELECT @@Identity as Id";

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Il faut que tu décomposes en deux requêtes distinctes.

    D'abord le select que tu exécutes, ensuite tu récupères le @@Identity.

    Tu peux jeter un oeil ici

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    ta requête est bonne
    il suffit de faire ExecuteReader ou encore plus simplement ExecuteScalar pour avoir l'id (à la place de ExecuteNonquery qui ne permet pas de récupérer les valeurs issues d'un select)


    Citation Envoyé par Er3van Voir le message
    Il faut que tu décomposes en deux requêtes distinctes.
    aucune raison de décomposer, il est même recommandable de faire tout en une seule fois
    le commandtext peut contenir x requêtes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Par défaut
    En fait j'ai fait une procédure stockée entre temps

    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
     
    USE [Intranet]
    GO
    /****** Object:  StoredProcedure [dbo].[SP_get_latest_id]    Script Date: 09/26/2011 17:57:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SP_get_latest_id] 
           @objet Varchar(50),      
           @debut Varchar(50),      
           @fin  Varchar(50),
           @idRDV INT OUTPUT   
     
    AS  
        INSERT INTO rendezvous ( objet,debut,fin) VALUES
        (@objet,@debut,@fin) 
     
     
     
          SELECT @idRDV = @@IDENTITY
    et dans la méthode d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                SqlParameter id = myCommand.Parameters.Add(new SqlParameter("@idRDV", SqlDbType.Int, 4));
                id.Direction = ParameterDirection.Output;
                myCommand.ExecuteNonQuery();
                int ReturnMessage = int.Parse(myCommand.Parameters["@idRDV"].Value.ToString());
    Pour ceux qui chercheraient plus tard...
    Merci pour votre aide en tout cas

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par arngrimur Voir le message
    En fait j'ai fait une procédure stockée entre temps
    C'est en effet la meilleure solution.

    Néanmoins, attention avec cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       SELECT @idRDV = @@IDENTITY
    En choisissant @@IDENTITY tu crée une cause potentiellle de bug si la table en question reçoit par exemple un trigger par la suite, qui insérerait lui même une ligne dans une table avec un champs IDENTITY.

    Pour éviter ce problème utilise plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @idRDV = SCOPE_IDENTITY()

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Par défaut
    Je note ça , merci!

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    aucune raison de décomposer, il est même recommandable de faire tout en une seule fois
    le commandtext peut contenir x requêtes
    A une petite nuance près : pas avec SSCE. (mais c'est pour être exhaustif )

    Sinon, pour ce genre de problèmatique, je trouve néanmoins préférable d'encapsuler le tout dans une PS d'insertion dont le retour sera l'ID.

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

Discussions similaires

  1. [AJAX] Récupérer les clés d'un json après une requête ajax
    Par Nico_SAS dans le forum jQuery
    Réponses: 4
    Dernier message: 25/06/2014, 14h18
  2. Réponses: 12
    Dernier message: 29/11/2011, 16h06
  3. Réponses: 2
    Dernier message: 11/05/2011, 15h05
  4. TRIGGER d'insertion après une requête INSERT
    Par nasimpat7 dans le forum Développement
    Réponses: 11
    Dernier message: 06/04/2009, 15h45
  5. [VB NET]: Récupérer l'ID après une insertion
    Par ADONET dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/04/2006, 10h26

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