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

Accès aux données Discussion :

[2.0, C#, SqlServer2005] Récupérer le @@Identity après un Insert Into ?


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut [2.0, C#, SqlServer2005] Récupérer le @@Identity après un Insert Into ?
    Bonjour,

    En C# j'utilise le SqlCommand.executeScalar pour éxécuter une requête d'insertion à partir d'une chaine strRequete

    mais juste après mon INSERT INTO je met un ;SELECT @@IDENTITY; pour pouvoir récupérer l'id qui vient d'être généré :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    string strRequete = "INSERT INTO [...]; SELECT @@IDENTITY;";

    Puis je être certain qu'aucune requête concurrente (par exemple d'un autre utilisateur connecté à la BDD) ne va s'interposer entre mes deux instructions (INSERT et SELECT) ??

    autrement dit, suis je certain que ce que je récupère avec mon select @@identity est bien l'id qui a été généré par mon insert ? et pas un id qui a été généré par un autre utilisateur juste entre mes deux requêtes ?

    D'avance merci,
    joyeuses fêtes, et bonnes vacances pour ceux qui en ont.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2002
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    Bonjour

    utilise SCOPE_IDENTITY() et une procédure stockée avec parametre de sortie comme ça tu recupere ta valeur directement de ta table au lieu de la récuperer de la table d'audit crée par les administrateurs de bases de données en utilisant des declencheurs par exemple.

    @@IDENTITY recupere les valeurs compteur générée par le déclencheur de la table d'audit

    Bonne chance

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    bonjour Midou,

    bonne année !

    merci pour ta réponse.. je n'avais pas internet pendant mes vacances, c'est pourquoi je réponds tardivement.

    je vais donc utiliser une procédure stockée comme tu me le conseille par contre je ne comprends pas bien ce qu'est une "table d'audit" et pourquoi tu dis qu'avec scope_identity je vais récupérer la valeur "directement dans la table" ?

  4. #4
    Nip
    Nip est déconnecté
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 963
    Points : 1 076
    Points
    1 076
    Par défaut
    Que tu utilises ou non une SP, @@IDENTITY retourne la derniere valeur IDENTITY generee pendant ta connection; SCOPE_IDENTITY() retourne la derniere valeur IDENTITY generee dans le scope (portee) de ta procedure.

    http://msdn2.microsoft.com/fr-fr/library/ms190315.aspx

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    Bonsoir Nip et merci..

    effectivement la semaine dernière, j'ai fini par utiliser SCOPE_IDENTITY() dans une procédure stockée.. ce n'était pas si difficile finalement.. et c'est bien pratique je reconnais.

    j'avais oublié de mettre résolu au sujet, mais j'attendais une réponse de Midou.

    Merci et bonne année!

    P.S. : et merci pour l'explication entre identity et scope_identity()

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 224
    Points : 99
    Points
    99
    Par défaut
    Bonjour Nip,

    Rectification :

    Je n'utilise plus les procédures stockées car je ne souhaite pas faire une procédure stockée pour chaque requête insert dont je souhaite récupérer le @@identity (cela revient pratiquement à une procédure stockée par table de la bdd)..

    Et du coup je me suis aperçu de 2 choses (j'ai 2 solutions à mon problème) :

    1ere solution :
    Le @@IDENTITY renvoie le dernier identité généré dans la session active : (doc msn)
    Or si j'ai bien compris la doc de msn sur les sessions actives, une session active est entre autre la connection à la bdd active..
    Donc dans le cas d'un utilisateur (un utilisateur = une session asp.net) qui a une seule connection à la BDD (c'est le cas du site web que je développe), on peut faire nos 2 requêtes en même temps dans un SqlCommand (ASP.NET C#) en étant certain de récupérer l'identité qui vient d'être généré (et pas celui d'un utilisateur concurrent)

    2eme solution :
    Toujours faire nos 2 requêtes dans la même SqlCommand (ASP.NET C#) tout en étant certain qu'aucune requête d'un utilisateur concurrent ne va s'intercaler entre, à condition d'utiliser un SCOPE_IDENTITY() à la place d'un @@IDENTITY car un scope_identity() renvoie le dernier id auto-généré dans une étendue...
    Et une étendue c'est aussi un lot !!

    voir citation ci dessous de la doc msn :

    Citation Envoyé par documentation officielle msn
    SCOPE_IDENTITY (Transact-SQL)

    Renvoie la dernière valeur d'identité insérée dans une colonne d'identité dans la même étendue. Une étendue est un module : procédure stockée, déclencheur, fonction ou lot. Par conséquent, deux instructions sont dans la même étendue si elles se trouvent dans la même procédure stockée ou fonction, ou dans le même lot.
    Or un lot c'est un ensemble d'instructions envoyés dans la même commande par une application, et la doc msn dit que les lots sont exécutées en une seule fois :
    http://msdn2.microsoft.com/fr-fr/library/ms175502.aspx

    Donc dites moi si je me fais des fausses idées et que je suis sur une mauvaise piste, ou si c'est bien ça ?


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

Discussions similaires

  1. @@IDENTITY apres un INSERT ne fonctionne pas
    Par gderenne dans le forum ASP
    Réponses: 12
    Dernier message: 25/01/2008, 09h49
  2. MySQL-ODBC - Récupérer l'id après un Insert()
    Par kurkaine dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/11/2007, 05h47
  3. [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
  4. Réponses: 8
    Dernier message: 25/01/2006, 12h06
  5. Réponses: 9
    Dernier message: 07/09/2004, 11h12

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