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 Discussion :

@@IDENTITY apres un INSERT ne fonctionne pas


Sujet :

ASP

  1. #1
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut @@IDENTITY apres un INSERT ne fonctionne pas
    Salut,

    Ma base de données est SQL Server 2005 Express.

    Lorsque je suis dans Management Studio Express et que je fais cette requete :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO test (nom) VALUES ('test') ;
    SELECT @@IDENTITY AS LastId ;
    Ca fonctionne impécable.

    Donc, le problème ne vient pas de SQL Server (c'est pour ca que je n'ai pas posté mon message dans le forum SQL Server).

    Par contre, quand je lance ces requetes depuis le serveur IIS ainsi :
    Code VBScript : 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
    <%
    Dim Conn
    Dim RS
    Dim intLastid
     
    Set Conn = Server.CreateObject("ADODB.Connection")
    Set RS = Server.CreateObject("ADODB.Recordset")
    Conn.Open = "Driver={SQL Native Client};" & _
    	"UID=user;" & _
    	"PWD=pass;" & _
    	"DATABASE=base;" & _
    	"SERVER=FILESERVER\SQLEXPRESS"
     
    RS.Open "INSERT INTO test (texte) VALUES ('test')", Conn
    RS.Open "SELECT @@IDENTITY AS lastid", Conn
    intLastid = RS("lastid")
    RS.Close
     
    Response.Write "Le dernier id est : " & intLastid
    Conn.Close
    Set RS = Nothing
    Set Conn = Nothing
    %>
    @@IDENTITY ne renvoi rien. Un peu comme si chaque requete (pourtant dans la meme connexion) n'était pas dans la meme connexion.

    Est-ce ma methode ou bien l'ADODB qui fait ca ?

    A NOTER :
    Exactement le meme code fonctionne parfaitement sur un serveur MySQL.
    @@IDENTITY renvoi bien le dernier id inséré par la connexion en cours.

  2. #2
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    Pour l'instant, j'ai appliqué une solution alternative batarde (mais sommes toutes ficalbe).

    C'est :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO test (nom, user) VALUES ('test', 1) ;
    SELECT MAX(id) AS LastId FROM test WHERE user = 1 ;

    Mais bon... Pourquoi faire simple quand on peut faire compliqué...

  3. #3
    Membre expérimenté
    Avatar de kaiser59
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 264
    Points : 1 350
    Points
    1 350
    Par défaut
    Salut,

    Tu as ceci :
    Citation Envoyé par gderenne
    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RS.Open "INSERT INTO test (texte) VALUES ('test')", Conn
    RS.Open "SELECT @@IDENTITY AS lastid", Conn
    J'utilise pas SQL SERVER mais comme c'est utilisé via ASP je pense que c'est le même principe. Peux-tu m'expliquer pourquoi tu ouvre deux fois la requête si tu fais un Insert depuis les valeurs existantes d'un select ? C'est plutôt comme ça, je pense :

    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <%
    Sql="INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid"
    Rs.open Sql, Conn
    %>

    Par ailleurs, si le @@ ne fonctionne pas c'est peut-être parce qu'il faut trouver l'équivalent en asp à titre d'exemple, l' (*) d'Access en ASP devient (%) si je me souviens bien.

  4. #4
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    Merci pour la solution...

    En fait, je n'étais pas si loin car entre temps, je m'étais posé exactement la meme question :
    "Pourquoi 2 RecordSet pour un INSERT et un SELECT puisque entre temps on n'est pas forcé de le cloturer (RS.Close) ?"

    J'avais tenté :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO test (texte) VALUES ('test') ; SELECT @@IDENTITY AS lastid ;

    Le problème est que lorsque j'execute le code, le serveur répond :
    Citation Envoyé par Serveur
    Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé.
    Cela fait pareil avec ta solution (sans les ";").

    Pourtant, @@IDENTITY est bien renommé "lastid" via la requete. Et meme en récuperant directement @@IDENTITY, c'est le meme message d'erreur.

    Par contre, pour ta dernière remarque, je ne vois pas trop . Je me rappelle en effet qu'il fallait modifier sa facon de travailler lors de l'exploitation d'une base Access, mais là, j'ai pas d'infos concernant les modifications à apporter sur le code T-SQL en provenance d'un ASP...

  5. #5
    Membre expérimenté
    Avatar de kaiser59
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 264
    Points : 1 350
    Points
    1 350
    Par défaut
    Je viens de voir je sais pas si c'est normal mais pourquoi on ne dit pas sur quelle table on travaille dans la requête ?

    Tu as :
    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%
    Sql="INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid"
    %>

    Ceci fonctionne ou pas ?
    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <%
    Sql="INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid FROM MATABLE "
    %>

  6. #6
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    En fait, ceci fonctionne bien dans Management Studio Express :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid
    Le résultat est :
    (1 ligne(s) affectée(s))
    lastid
    ---------------------------------------
    136

    (1 ligne(s) affectée(s))
    En fait, le problème n'est pas tant la facon d'ecrire la requete (avec ou sans FROM test), c'est que ASP semble ne pas prendre en compte la seconde partie se la requete :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @@IDENTITY AS lastid

    Avec "FROM test", c'est idem (normal, on ne fait que réduire son champs d'action).

    J'ai fais un autre test :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO test (texte) VALUES ('test') SELECT texte FROM test

    Le serveur me répond la meme erreur.

  7. #7
    Membre expérimenté
    Avatar de kaiser59
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 264
    Points : 1 350
    Points
    1 350
    Par défaut
    Ou alors comme je disais quelque message un peu avant c'est le @@ qui poserait problème ??
    Est il possible d'afficher le résultat avec seulement le
    Code asp : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @@IDENTITY AS lastid
    ?

    et tester la même chose ou une requête similaire mais sans le @@ ceci permettrais de savoir si c'est bien le @ qui pose problème

  8. #8
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    J'ai essayé avec "&", "#", "%" et "$".

    Le serveur me retourne une erreur pour chaque. Exactement les memes erreurs que quand je fais la meme manipulation dans Management Studio.

    On peut conclue que la syntaxe semble identique depuis ADODB/ASP et Management Studio.

    Pour la requete seule, "lastid" renvoi "Null" sans provoquer d'erreur. C'est d'ailleur le problème d'origine du topic.

  9. #9
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    Bon ben finalement, on peut conclure qu'il s'agit d'un Bug de ODBC car pour la meme requete SQL sur un serveur MySQL, la réponse est bonne.

    Donc, je vais utiliser le principe de précaution en faisant ainsi :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO test (nom, user) VALUES ('test', 1) ;
    SELECT MAX(id) AS LastId FROM test WHERE user = 1 ;

  10. #10
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!

    Mouais, mais cette technique ne fonctionne à coup sur qui si tu n'as qu'un utilisateur connecté (et quand on utilise SQLServer, on suppose un trafic important).
    Même si la probabilité est faible qu'un autre enregistrement soit ajouté dans la base entre l'INSERT et le SELECT, cette probabilité n'est pas nulle, et si on tient compte de la loi de Murphy....

  11. #11
    Membre actif Avatar de gderenne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2007
    Messages : 250
    Points : 281
    Points
    281
    Par défaut
    En fait, c'est la clause WHERE qui fait que seul l'utilisateur concerné a pu executer un INSERT en dernier le concernant.

    Donc, meme si l'utilisateur 2 et l'utilisateur 3 ont pu executer un INSERT, entre les deux requetes INSERT et SELECT de l'utilisateur 1, la réponse sera fiable.

  12. #12
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Houlà, mais c'est vrai ça....Heu, 'scuze moi, il était tard, les sangliers n'étaient pas frais...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 49
    Points : 60
    Points
    60
    Par défaut Une autre solution
    Bonjour

    Je me permet d'ajouter une réponse car j'ai trouvé une solution qui permet de s'affranchir de l'utilisation du "MAX(id)" dans une autre discussion de ce forum. Voici le lien :

    http://www.developpez.net/forums/sho...%40%40identity

    et voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL = "INSERT INTO ...;SELECT @@IDENTITY AS ID;"
    Set rs = ObjConn.Execute(SQL,,1)
    Set rs= rs.NextRecordset
    	New_ID = rs("ID")
    rs.close
    J'avais le même problème et cette solution fonctionne parfaitement dans mon cas.

    à Immobilis pour cette solution.

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

Discussions similaires

  1. [MySQL] mot passe apres insert ne fonctionne pas
    Par kogoi dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/01/2010, 18h09
  2. Réponses: 5
    Dernier message: 11/01/2007, 15h10
  3. Réponses: 2
    Dernier message: 12/05/2006, 23h01
  4. [VBA-E] Undo après action bouton ne fonctionne pas
    Par TicTacToe dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2006, 12h53
  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