none
Récupérer valeur champ auto incrémenté après un INSERT RRS feed

  • Question

  • Bonjour,

    J'ai une table avec un champ auto-incrémenté, je fais un insert dans cette table.

    Je voudrai, juste après l'insert, récupérer la veleur du champ auto-incrémenté.

    Comment faire?

    Merci

    samedi 21 janvier 2012 10:24

Réponses

Toutes les réponses

  • Bonjour,

    Il faut exécuter la commande suivante au moment du INSERT :

    INSERT INTO Table (...) VALUES (....) SELECT SCOPE_IDENTITY()
    

    Si vous exécutez cette commande avec SqlCommand.ExecuteScalar(), la ligne est insérée et la valeur retournée est la dernière valeur auto-incrémentée.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    samedi 21 janvier 2012 21:09
    Modérateur
  • Voici mon code, à l'éxécution de la commande, j'ai une exception:

    Une erreur s'est produite lors de l'analyse de la requete [.. Token in error= SELECT]

    Pouvez-vous m'aider?

    Mon code:

         SqlCeCommand cmdInsertPortee = new SqlCeCommand();
         cmdInsertPortee.Connection = porteesAdapt.Connection;


         cmdInsertPortee.CommandText = "INSERT INTO [portees] VALUES   (mere,pere,parsedDate,raceChiot,race_mere,race_pere,nbChiots) SELECT SCOPE_IDENTITY()";


         cmdInsertPortee.CommandType = CommandType.Text;
                    
         SqlCeDataAdapter monAdapt = new SqlCeDataAdapter(cmdInsertPortee);
         monAdapt.Fill(ds_portees.portees);

         int idP = (int)cmdInsertPortee.ExecuteScalar();
         MessageBox.Show("idP=" + idP);

    dimanche 22 janvier 2012 08:34
  • Bonjour

    Si [PORTEES] est le nom de votre table alors la requète devrait plutôt ressembler à cela :

    INSERT INTO PORTEES

    (NomDeColonne_1, ..., NomDeColonne_N) VALUES (Valeur_1, ..., Valeur_N)

    SELECT SCOPE_IDENTITY();

    REMARQUE :

    SELECT CAST(SCOPE_IDENTITY() AS INT); renvoie directement un int. 


    Jean PERIGNY, Développeur jperigny@hotmail.fr
    dimanche 22 janvier 2012 10:09
  • Bonjour,

     

    Personnellement, j'aurais aussi mis un point-virgule entre l'INSERT et le SELECT afin d'éviter le message d'erreur "Une erreur s'est produite lors de l'analyse de la requete [.. Token in error= SELECT]"


    Cordialement,

    Sébastien


    Sébastien Putier
    Consultant - Formateur technologies Microsoft
    Blog : http://sputier.wordpress.com
    MCTS Développement d'application Windows 4.0
    Si un post vous parait utile, n'oubliez pas de le marquer comme utile. S'il répond à votre question, n'oubliez pas de le marquer comme réponse.
    dimanche 22 janvier 2012 10:31
  • Merci pour vos réponses, mais j'ai lu que SQL Server Compact n'avait pas la fonction "SCOPE_IDENTITY"

    J'ai donc détourné le pb en faisant un autre SELECT pour récupérer la valeur MAX de l'id. Ca marche bien.

    dimanche 22 janvier 2012 10:37
  • Bonjour,

    L'utilisation du MAX est fortement déconseillé dans les bases de données multi-utilisateurs. Dans votre cas, vu que vous utilisez le Sql Server Compact vous vous trouvez sur une base de données mono utilisateur.

    SQL Server Compact ne supporte SCOPE_IDENTITY(), vous pouvez utiliser l'instruction SELECT @@IDENTITY à la place.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 22 janvier 2012 18:46
    Modérateur
  • Oui, base mono-utilisateur, donc je garde mon "select max".

    Je vous remercie pour vos réponses.

    • Marqué comme réponse bobinou65 lundi 23 janvier 2012 15:59
    lundi 23 janvier 2012 15:59
  • Bonsoir Gilles

    j'aimerai savoir pourquoi le MAX est déconseillé dans les bases multi utilisateurs.

    remerciements,


    Jean PERIGNY, Développeur jperigny@hotmail.fr
    lundi 23 janvier 2012 18:42
  • Bonjour,

    Tout simplement parceque cela pose le problème suivant :

    Soit deux utilisateurs sur deux postes différents qui ajoutent 2 lignes dans une table et qui souhaitent récupérer l'ID auto-incrémenter, imaginons la séquence de requête SQL suivantes que le SGBD traite.

    Utilisateur1 => INSERT .....   (En base l'Id de la ligne = 1)
    Utilisateur2 => INSERT .....   (En base l'Id de la ligne = 2)
    Utilisateur1 => SELECT MAX()..... => récupére 2 !
    Utilisateur2 => SELECT MAX()..... => récupére 2

    L'utilisateur1 a récupéré ici une mauvaise valeur...

    Il faut donc toujours utiliser SCOPE_IDENTITY() ou @@IDENTITY pour récupérer le dernier Id Auto-Incrémenter.

    De plus, l'exécution d'une requête SELECT engendre une surcharge supplémentaire (requête supplémentaire) sur le SGBD... Cela devient très vite non négligeable en cas d'utilisation importante du SGBD !

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Proposé comme réponse jperigny mercredi 25 janvier 2012 17:18
    mardi 24 janvier 2012 22:49
    Modérateur