Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/07/2007, 15h20   #1
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
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 :
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 :
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.
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 00h06   #2
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
Pour l'instant, j'ai appliqué une solution alternative batarde (mais sommes toutes ficalbe).

C'est :
Code SQL :
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é...
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 12h37   #3
Modérateur
 
Avatar de kaiser59
 
Inscription : novembre 2005
Messages : 1 246
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : novembre 2005
Messages : 1 246
Points : 1 203
Points : 1 203
Envoyer un message via MSN à kaiser59
Salut,

Tu as ceci :
Citation:
Envoyé par gderenne
Code asp :
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 :
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.
__________________
Ne dites pas Java pour dire Javascript ! Ces deux codes n'ont rien à voir ! // Essayez d'expliquer, de la façon la plus claire possible votre problème. // Parfois une image vaut mieux qu'un long discours

FAQ ASP
kaiser59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 20h01   #4
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
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 :
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...
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 20h24   #5
Modérateur
 
Avatar de kaiser59
 
Inscription : novembre 2005
Messages : 1 246
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : novembre 2005
Messages : 1 246
Points : 1 203
Points : 1 203
Envoyer un message via MSN à kaiser59
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 :
1
2
3
<%
Sql="INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid"
%>

Ceci fonctionne ou pas ?
Code asp :
1
2
3
<%
Sql="INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid FROM MATABLE "
%>
__________________
Ne dites pas Java pour dire Javascript ! Ces deux codes n'ont rien à voir ! // Essayez d'expliquer, de la façon la plus claire possible votre problème. // Parfois une image vaut mieux qu'un long discours

FAQ ASP
kaiser59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 20h54   #6
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
En fait, ceci fonctionne bien dans Management Studio Express :
Code SQL :
INSERT INTO test (texte) VALUES ('test') SELECT @@IDENTITY AS lastid
Le résultat est :
Citation:
(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 :
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 :
INSERT INTO test (texte) VALUES ('test') SELECT texte FROM test

Le serveur me répond la meme erreur.
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 23h43   #7
Modérateur
 
Avatar de kaiser59
 
Inscription : novembre 2005
Messages : 1 246
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : novembre 2005
Messages : 1 246
Points : 1 203
Points : 1 203
Envoyer un message via MSN à kaiser59
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 :
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
__________________
Ne dites pas Java pour dire Javascript ! Ces deux codes n'ont rien à voir ! // Essayez d'expliquer, de la façon la plus claire possible votre problème. // Parfois une image vaut mieux qu'un long discours

FAQ ASP
kaiser59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 00h35   #8
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
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.
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2007, 02h43   #9
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
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 :
1
2
INSERT INTO test (nom, user) VALUES ('test', 1) ;
SELECT MAX(id) AS LastId FROM test WHERE user = 1 ;
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2007, 00h27   #10
Membre chevronné
 
Avatar de ryan
 
Inscription : juin 2003
Messages : 766
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 766
Points : 760
Points : 760
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....
ryan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2007, 01h27   #11
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
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.
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2007, 11h06   #12
Membre chevronné
 
Avatar de ryan
 
Inscription : juin 2003
Messages : 766
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 766
Points : 760
Points : 760
Houlà, mais c'est vrai ça....Heu, 'scuze moi, il était tard, les sangliers n'étaient pas frais...
ryan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2008, 09h49   #13
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : décembre 2004
Messages : 41
Points : 28
Points : 28
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 :
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.
yuan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h13.


 
 
 
 
Partenaires

Hébergement Web