Vous souhaitez récupérer l’Identifiant (Clé Primaire) d’un enregistrement que vous venez d’effectuer.
En PHP, on utilise souvent la fonction mysql_insert_id(). Aujourd’hui j’ai été confronté à ce problème en ASP.NET / SQL Server.
Une des solution est, si l’on utilise une procédure stockée, de définir des paramètre de sortie (Output).
Exemple ici avec une procédure stockée :
CREATE PROCEDURE sp_insertArticle
@Title nvarchar(30),
@Author nvarchar(200),
@Content nvarchar(20),
@ID_CREATED int OUTPUT
AS
INSERT INTO Actualite(title,author,Content)VALUES (@Title,@Author,@Content)
SELECT @ID_CREATED = @@IDENTITY
RETURN (1)
END
@Title nvarchar(30),
@Author nvarchar(200),
@Content nvarchar(20),
@ID_CREATED int OUTPUT
AS
INSERT INTO Actualite(title,author,Content)VALUES (@Title,@Author,@Content)
SELECT @ID_CREATED = @@IDENTITY
RETURN (1)
END
Seul problème, je souhaitais effectuer cette tache sur une requête simple (Text).
La solution est d’ajouter dans la requête SQL la ligne :
La solution est d’ajouter dans la requête SQL la ligne :
SELECT @ID_CREATED = SCOPE_IDENTITY()
La récupération de ce paramètre de sortie fonctionne par contre de la même manière pour une procédure stocké ou une commande texte.
Sur l’événement “INSERTING” de la source, on ajoute le paramètre de sortie.
SqlParameter insertedKey = new SqlParameter("@ID_CREATED", SqlDbType.Int);
insertedKey.Direction = ParameterDirection.Output;
e.Command.Parameters.Add(insertedKey);
insertedKey.Direction = ParameterDirection.Output;
e.Command.Parameters.Add(insertedKey);
Et enfin sur l’évènement “INSERTED” on peut récupérer la valeur du paramètre.
DbCommand command = e.Command;
Label.Text = command.Parameters["@ID_CREATED"].Value.ToString();
Label.Text = command.Parameters["@ID_CREATED"].Value.ToString();


La procédure stockée est t’elle toujours justifiée lorsque nous voulons effectuer des sélections, insertions, .. (CRUD) ?
@Samuel Martin
Non non mais la procédure stockée permet surtout de gérer en une seule fois de nombreuses modifications dans la BDD. Elle permet également de faire des travaux plus poussés au niveau des requêtes, du renvoi des résultats, de gestion des erreurs, des transformations, …
Autre atout, la procédure stockée fait partie de la BDD (C’est un objet de la base en SQL Server) et la mise à jour / modification de la procédure est donc aisée et totalement séparée du code source du site. C’est ainsi l’administrateur BDD qui peut travaille sur sa procédure sans altérer le fonctionnement de l’application.
Bonjour,
Je bricole et j’essaie de comprendre.
je dois enregistrer des dates d’entretien pour chaque personnes j’ai crée une table Entretien (IDEntretien, IDPersonne, date) quand je dois insérer une nouvelle personne je devrais me retrouver avec la fiche d’entretien et l’ID nouvellement crée IDPersonne… ça doit être simple mais je m’arrache les cheveux et je n’en ai plus beaucoup.
Je suis tombé par hasard sur votre code et je ne suis pas progammeur
J’utilise visual web developer 2008 pour manipuler ma BDD pour ensuite la mettre en page.
Pour faciliter les choses: 1 table Personne (avec clé primaire IDPersonne, NOM, date naissance,…, IDGenre, IDEtude…) et des dropdawnlists qui récupèrent sur tables Genre et Etude. L’insert se passe mais comment afficher dans un formview la valeur de l’IDPersonne crée avant de passer à la personne suivante. Si je comprend bien on récupère l’ID avant de le créer ?
Si je peux abuser aussi
Merci de m’avoir lu jusque là
Hello !
Si je comprend bien, tu souhaite récupérer, après avoir enregistré une Personne, son identifiant (IDpersonne) ? Si oui alors tu est sur le bon post ! L’exemple que je donne permet de faire cela est de récupérer l’identifiant créer par la requête d’insertion.
Concernant ta deuxiéme question, si j’ai bien compris :
- Tu crée ta Personne qui va alors obtenir un identifiant (Exemple 345).
- Tu va ensuite crée un Entretien pour cette Personne. L’enregistrement sera donc : IDEntretien généré par la requête, IDPersonne vaudra 345 ce qui te permettra de sélectionner les entretien de cette personne et date correspondant à la date choisie.
Cela répond t’il à ta question ?
A bientot !
Hey salut,
D’abord merci pour ton suivi.
Ensuite tu as bien compris ce que j’essaie (maladroitement) de mettre en place.
Tu vois j’aimerais (si c’est possible) lorsque j’introduis dans mon formulaire une nouvelle personne soit qu’il me donne déjà son identifiant (y a t il moyen que dès que tu passes au champ suivant il le génère) soit qu’il me le donne dès que je clique sur un bouton pour passer dans la fiche entretien de la personne ainsi créée.
De toute manière je tatonne encore, j’essaie de mettre en place cette fameuse procédure stockée et trouver les deux événement ISERTING & INSERTED que tu décris. Ensuite je dois trouver la solution qui me permette de me retrouver sur une autre page qui décrit la fiche Entretien de la personne ainsi créée… j’ai encore du boulot
Encore un tout grand merci.
Et un coup de main ne me sera pas inutile… j’en ai déjà un peu ras la casquette…
@+
@Ricardo
Hello Ricardo !
Voici le principe pour ce que tu souhaite faire :
- Page de création d’une Personne.
- Validation de cette page avec par exemple une procédure stockée qui va te retourner l’ID de la personne crée. Concernant les procédures stockées, si tu n’en as jamais utilisé, je te conseil quelques lectures (par exemple http://rudi.developpez.com/sqlserver/tutoriel/sprocsdotnet/).
- Aprés avoir récupéré l’identifiant créé, rédirection vers la page d’entretien ou la tu aura conservé l’identifiant crée (Via Session, Cookie, …). Donc tu pourra créer un Entretien avec l’ID de la Personne.
- Ainsi de suite !
Concernant les redirection, tu peux utiliser l’objet Response. Et faire un Response.Redirect(« MaPageEntretien.aspx »);
A bientôt et bon courage !
Hey
Merci de m’avoir guidé jusque là.
Je vais étudier tout ça attentivement et te dirais si je suis arrivé à un résultat…
En tous les cas c’est vraiment sympa.
A bientôt.
@Ricardo
Bon allez j’avance…
J’ai reussi la premiere partie mais j’ai qd meme envie de te poser encore qq questions à ce sujet.
Maintenant je cherche où placer le response.redirect et que cette nouvelle page affiche l’ID nouvellement créé avec le formview entretien
@+
Ce que je voulais dire c est que j ai reussi avec le code suivant
Protected Sub FormView1_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewInsertedEventArgs) Handles FormView1.ItemInserted
Response.Redirect(« Redirection.aspx »)
End Sub
mais je veux recuperer le nouvel ID pour completer la fiche entretien dans la nouvelle page
@+
@Ricardo
Hello Ricardo,
Est ce que, dans ta page de création de la personne, tu arrives à récupérer l’IDentifiant crée (Avec le code que je donne dans le post ?).
Si oui, avant de faire le Response.Redirect, tu peux sauvegarder l’identifiant dans une variable de session par exemple :
Session.add(« IDPersonne », variableID);
Et récupérer dans la page entretien l’ID sauvegardé
Session["IDPersonne"].
Bon courage !
Hello, tout va bien ?
Tout d abord voici ma procedure stockee :
ALTER PROCEDURE dbo.NewInsertCommand
(
@strNom nvarchar(100),
@PK_New int OUTPUT
)
AS
SET NOCOUNT OFF;
INSERT INTO [Personnes] ([strNom]) VALUES (@strNom)
SELECT @PK_New = @@IDENTITY
RETURN (1)
avec END il me fait erreur de syntaxe ????
ensuite sur ma page personnes:
Sub On_Inserting(ByVal sender As Object, ByVal e As SqlDataSourceCommandEventArgs)
Dim insertedKey As SqlParameter
insertedKey = New SqlParameter(« @PK_New », SqlDbType.Int)
insertedKey.Direction = ParameterDirection.Output
e.Command.Parameters.Add(insertedKey)
End Sub ‘On_Inserting
Sub On_Inserted(ByVal sender As Object, ByVal e As SqlDataSourceStatusEventArgs)
Dim command As DbCommand
command = e.Command
Label1.Text = command.Parameters(« @PK_New »).Value.ToString()
FormView1.DataBind()
End Sub ‘On_Inserted
sans oublier :
<asp:SqlDataSource
ID= »SqlDataSource1″
runat= »server »
ConnectionString= »"
SelectCommand= »SELECT * FROM Personnes »
InsertCommandType = « StoredProcedure »
InsertCommand= »NewInsertCommand »
OnInserting= »On_Inserting »
OnInserted = »On_Inserted »
FilterExpression= »IDPersonne={0} »>
mais j ai des questions :
le numero apparait apres insert (tant mieux :0 ) si je ne fais pas un Response.Redirect.
Mais en fin de compte faut il passer obligatoirement par un output ? Si apres insertion d’une nouvelle personne (l’ID est donc crée non?) tu rediriges vers la page d’entretien, là est ce qu’on peut pas récupérer ou lier cette nouvelle personne avec sa fiche d’entretien ? On pourrait voir dès lors son ID non ?
Bon je te tiens au courant et merci pour tes encouragements…
@Ricardo
Hello Ricardo !
Oui, aprés sur la fiche Entretien tu peux récupérer la personne de différentes maniére :
- Récupérer la derniére personne crée (ID le plus grand)
- Récupérer la personne en faisant un tri sur le nom, le prenom …
Sauf que ces techniques ne sont pas fiable à 100%. Comment en effet être sur que la derniére personne qui a enregistré sa fiche et bien celle la ? Deux personnes ont pu s’enregistrer en même temps …Pareil pour la requête sur le nom / Prenom, deux personnes peuvent avoir les mêmes infos !
Le mieux est donc de récupérer l’ID de la personne avant de passer à la page d’entretien. De plus, cela supprimer une requête à effectuer sur la page d’entretien.
Bon courage !
Salut Morgan.
Ok j’ai compris.
Je m’attaque cette semaine à la suite, récupérer l’IDPersonne dans la page Entretien…
Félicitation pour ton site, sobre, élégant, clair… et ton suivi.
Je te tiens au courant.
@+
Hello,
Bon je calle un peu.
Je ne vois pas comment relier l’ID récupéré dans la page suivante avec un formview entretien ???? Je cherche encore….
@+
Hello,
Si je fais déjà ça dans ma page Personne est-ce que je suis dans le bon ?
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Session.Add(« IDPersonne », 1)
End Sub
dans ma page entretien….
@+
@Ricardo
Hello !
Dans ta page Personne, tu récupére l’identifiant de la Personne crée. Tu la sauvegarde en session. Ensuite tu passe sur la page Entretien et la tu va pouvoir récupérer ce que tu as sauver en session.
Imaginons que tu as dans ta page un
Dans ton Page_OnLoad tu va pas exemple pouvoir faire :
IDPersonne.Text = Session["IDPersonne"];
Ca c’est pour insérer dans le formulaire l’ID de ta Personne.
Mais le plus simple c’est encore d’enregistrer comme tu le fait, l’ID dans la session, de passer à la page Entretien et lors de l’enregistrement de l’entretien, la tu récupérer seulement à ce moment l’ID contenu en session (Directement en paramètre dans ta requête SQL).
Bon courage !
et ça c’est pas correct avec un viewstate ?
Protected Sub FormView1_Inserted(ByVal sender As Object, ByVal e As SqlDataSourceStatusEventArgs)
ViewState(« IDPersonne ») = e.Command.Parameters(« @IDPersonne »).Value.ToString()
End Sub
Session, Cookie, ViewState … Le but c’est de conserver les infos
Donc oui pourquoi pas utiliser le ViewState !
Hello j’ai qd même du mal… bon faut dire que c’est pas ma formation
J’arrive à faire ça
Protected Sub FormView1_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewInsertedEventArgs) Handles FormView1.ItemInserted
Session(« Essai ») = Label1.Text
Response.Redirect(« Redirection.aspx?IDPersonne= » & Session(« Essai »))
End Sub
et sur Redirection
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Session(« Essai ») IsNot Nothing Then
Label1.Text = CType(Session(« Essai »), String)
Else
Response.Write(« Aucun numéro récupéré »)
End If
End Sub
bon maintenant je veux mettre un formulaire entretien où ce Label1.text soit lié à l’ID personne de la fiche entretien….
Est-ce que c’est possible de lier directement la valeur de la Session(« Essai ») dans un formview ?
Je dois donc insérer une date d’entretien (avec la possibilité d’en rajouter d’autre pour le même ID) qui correspond avec l’ID stocké dans la session…..
Tu crois que je vais y arriver
?
@Ricardo
Ricardo,
Le mieux, je penses, c’est de revoir les bases du developpement .NET si ce n’est pas ta formation. J’ai appris en quelques mois les bases du C# et du framework ASP.NET de façon autonome. Sur internet il y a énormément de ressources et il y a de nombreux livres pour cela.
Dans tous les cas, si tu as toujours des petits soucis techniques, n’hésite pas !
Morgan,
Je vais y passer à voir ces bases mais je suis à temps plein sur d’autres projets. Alors, je tatonne dès que j’en ai l’occasion. Au départ j’ai crée un BD Access pour mes collègues au travail. J’essaie de leur fournir un outil plus agréable et dont je peux manipuler à ma guise tant la forme que le fond.
Il ne me reste plus qu’à comprendre comment appeler la fiche d’entretien avec l’IDPersonne dans un formview. Je suis arrvivé à reprendre via Session l’ID puis faire un detailview lié à querystring et eureka j’ai le nom et l’ID associé….
Mais je calle à nouveau… je sens que j’y suis presque avec le peu de notion que je possède.
@+ et Merci
un datalist je voulais écrire pas un detailview mais bon….
pas grave hein
ok c’est bon je l’ai… ouf
ce post est vieux mais il est en partie erroné et je me sens obligé de le corriger.
@@IDENTITY et SCOPE_IDENTITY() ne font PAS la même chose et rien à voir avec le fait de l’utiliser dans une requête simple ou une SP. c’est simplement une question de contexte. En cas de requête parallèle, @@IDENTITY ressort le dernier ID créé tandis que scope_identity s’interesse au scope de la procédure (ou requête) en cours.
Avec l’un, rien n’assure qu’entre l’insert et la lecture de l’ID, une autre insertion ne s’est pas faite, ce qui nous retournerait un mauvais ID. On ne peut donc PAS utiliser l’un ou l’autre simplement par soucis d’esthétisme. Il y a des contraintes techniques derrière le choix que l’on fait sur ce point bien précis