none
Récupérer l' ID d'une table SQL server lors d'une INSERT RRS feed

  • Question

  • Bonjour à tous,

    j'ai un petit problème lors d'une INSERT je veux récupérer l'ID dans mon programme parce que dans la base c'est bien ajouté.
    j'ai plus de problème dans la connexion et dans le cas ou l'utilisateur fait son inscription avec une invitation et son ID j'ai bien récupérer l'ID dans la chaine string par contre si je fais une inscription pour la première fois je recupére pas l'ID par contre il est inséré dans la base de donnée:

    Code C#:

     

    recup.Parameters.Add("@id_inscrit", SqlDbType.VarChar).Value = string.IsNullOrEmpty(idInscrit) ? string.Empty : idInscrit;
    
    recup.Parameters["@id_inscrit"].Direction=ParameterDirection.Output; 

    Code Procédure stocké

     

    @id_inscrit varchar(50) output ,
    ...
    insert into Client(id_inscrit,Civ_new ,Nom_new )
    values(newid(),@Civ_new ,@Nom_new )
    
    SELECT @id_inscrit = @@IDENTITY
    

     

    Cordialement DRIDI

     

    mercredi 26 mai 2010 15:55

Réponses

  • Bonsoir,

    Je pense que vous confondez les données de type uniqueidentifier et les colonnes d'identité.

    NEW_ID() vous permet de générer un uniqueidentifier alors que la fonction système @@IDENTITY vous permet de récupérer la dernière valeur inserée dans une colonne de type IDENTITY (en auto incrément).

    Si vous utilisez NEW_ID() je vous conseille d'abord de récupérer sa valeur dans une variable

    DECLARE @GUID uniqueidentifier
    SET @GUID = NEWID()
    ...
    INSERT INTO Client(id_inscrit, Civ_new, Nom_new) VALUES (@GUID, @Civ_new, @Nom_new)
    SELECT @GUID
    ++

    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mercredi 26 mai 2010 16:25
    Modérateur
  • Bonjour,

    Comme déjà indiqué précédemment par mikedavem, @@IDENTITY retourne la valeur de la colonne de table marquée "identity" (généralement un compteur entier auto-incrémenté). C'est un concept totalement différent du "uniqueidentifier". Je proposerais :

    SET @id_inscrit=NEWID()

    INSERT INTO Client(id_inscrit,civ_new,nom_new) VALUES (@id_inscrit,@civ_new,@nom_new)

    Même si ce n'est probablement pas nécessaire à un bon fonctionnement, j'utiliserais également le type uniqueidentifier plutôt que varchar(50) si c'est possible (autant utiliser le bon type plutôt que de le convertir ?).

    "Hope it helps"

     

    samedi 29 mai 2010 19:19

Toutes les réponses

  • Bonsoir,

    Je pense que vous confondez les données de type uniqueidentifier et les colonnes d'identité.

    NEW_ID() vous permet de générer un uniqueidentifier alors que la fonction système @@IDENTITY vous permet de récupérer la dernière valeur inserée dans une colonne de type IDENTITY (en auto incrément).

    Si vous utilisez NEW_ID() je vous conseille d'abord de récupérer sa valeur dans une variable

    DECLARE @GUID uniqueidentifier
    SET @GUID = NEWID()
    ...
    INSERT INTO Client(id_inscrit, Civ_new, Nom_new) VALUES (@GUID, @Civ_new, @Nom_new)
    SELECT @GUID
    ++

    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mercredi 26 mai 2010 16:25
    Modérateur
  • ReBonsoir

     

    merci pour votre réponse mais 1. @GUID varchar comme la valeur dans la base

    et 2. je veux passer par le code c# pour voir le moment d'inscription la valeur récupérée donc si possible pouvez me dire il manque quoi dans ce code C#

    recup.Parameters.Add("@id_inscrit", SqlDbType.VarChar).Value = string.IsNullOrEmpty(idInscrit) ? string.Empty : idInscrit;
    
    recup.Parameters["@id_inscrit"].Direction=ParameterDirection.Output; 
    
    mercredi 26 mai 2010 17:20
  • Pour vous aider au mieux postez le code complet de votre procédure stockée. Si @guid est de type varchar, jamais vous ne récupérez une valeur avec @@identity ... mais on pourra plus vous en dire avec la DDL complète de la procédure.

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mercredi 26 mai 2010 19:43
    Modérateur
  • @id_inscrit varchar(50) output ,
    @Nom_new varchar(50),
    @Civ_new varchar(50)
    ...
    
    insert into Client(id_inscrit,Civ_new ,Nom_new )
    values(newid(),@Civ_new ,@Nom_new )
    
    SELECT @id_inscrit = @@IDENTITY
    
    

    donc j'ai ça avec un update qui marche bien , je crois que @@IDENTITY ça marche plus avec varchar donc il faut chercher une autre solution et aussi il faut pas que j'oublie la partie code C# avec la récupération des paramètres.

    Cordialement

     

    mercredi 26 mai 2010 20:41
  • Bonjour,

    Comme déjà indiqué précédemment par mikedavem, @@IDENTITY retourne la valeur de la colonne de table marquée "identity" (généralement un compteur entier auto-incrémenté). C'est un concept totalement différent du "uniqueidentifier". Je proposerais :

    SET @id_inscrit=NEWID()

    INSERT INTO Client(id_inscrit,civ_new,nom_new) VALUES (@id_inscrit,@civ_new,@nom_new)

    Même si ce n'est probablement pas nécessaire à un bon fonctionnement, j'utiliserais également le type uniqueidentifier plutôt que varchar(50) si c'est possible (autant utiliser le bon type plutôt que de le convertir ?).

    "Hope it helps"

     

    samedi 29 mai 2010 19:19
  • Bonjour

     

    je suis désolé pour le retard , mais votre solution marche très bien, il manque juste @id qu'on déclare dans les paramètres comme output et après on appelle ce variable avec ces 3 lignes :

     

     

     recup.Parameters.Add("@myid", SqlDbType.VarChar,50).Value = "";
     recup.Parameters["@myid"].Direction = ParameterDirection.Output;
    
     string id_ins = recup.Parameters["@myid"].Value.ToString();

    Merci Bien pour votre aide Patrice et mikedaven

     

    Cordialement

    lundi 31 mai 2010 12:44