Bonjour,
voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
merci d'avance ?
Bonjour,
voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
merci d'avance ?
Je crois que c'est plus facile de faire un INSERT et de récupérer l'ID après, que de faire un SELECT du dernier enregistrement et ensuite un INSERT.
Comme cela est dit, il est plus logique de faire l'INSERT et de récupérer l'ID créé avec "SELECT @@identity" par exemple (je ne sais plus s'il faut un @ ou 2, à vérifier).Envoyé par loric92
Sinon, si tu n'as pas le choix, il ne reste qu'à faire un "SELECT max(champID)+1" pour l'obtenir. Attention, ceci est valable pour une utilisation solo de la BDD, si plusieurs personnes travaillent dessus en même temps, il y a un léger risque pour que l'ID retourné ne soit pas correct.
Bonjour, je veux faire pareil... Connaitre l'id du tuple que je viens de créer.
Le problème c'est que je n'utilise pas une base de données solo... Donc si je fais un MAX et qu'entre temps qqn crée en meme temps un autre tuple , tout va etre décalé...
C'est une affaire de micro secondes (je suppose) , donc je sais pas si il y a un réel risque ou non ?
Ou est-ce qu'il existe un moyen de trouver l'id de l'insert qu'on vient de créer ?
Merci.
SCOPE_IDENTITY est votre ami messieurs... à utiliser juste après l'INSERT...
C'est une affaire de micro secondes (je suppose) , donc je sais pas si il y a un réel risque ou non ?
C'est plus que certains
Le MAX+1 est une aberration malheureusement plus répandu qu'on ne le crois...
Qui vous dis que votre auto-incrément (IDENTITY() sur la colonne...) est de 1??? (si IDENTITY il y à...)
Pourquoi?voila je fais un insert mais je dois connaitre mon ID avant, une idee ?
Pour compléter :
Il faut bien faire la distinction entre le dernier ID inséré dans la session active et le dernier ID inséré dans la table toutes étendues comprises.
Selon ce que vous cherchez il faudra soit utiliser SCOPE_IDENTITY soit IDENT_CURRENT.
++
j'arrive pas trop à l'utiliser
Après j'ajoute mes parametres et je fais un cmd.ExecuteNonQuery();
Code : Sélectionner tout - Visualiser dans une fenêtre à part SqlCommand cmd = new SqlCommand("INSERT INTO table_name (job,progress,Edit) VALUES (@job,@progress,@Edit) ", conn);
Le SELECT SCOPE_IDENTITY , je le place où et je le récupère comment ?
Merci
Vous n'êtes pas loin...
Vous pourriez également placer votre requête dans une procedure stockée en retournant le SCOPE_IDENTITY dans un paramètre OUTPUT par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SqlCommand cmd = new SqlCommand("INSERT INTO table_name (job,progress,Edit) VALUES (@job,@progress,@Edit);SELECT SCOPE_IDENTITY() ", conn);
Vous n'abusez pas (enfin...) mais disons que vous pourriez tester!
executescalar() execute la requete dans le SqlCommand et vous retourne le premier résultat de la requete (souvent utilisé avec des requetes COUNT(*) par exemple...
Inutile donc d'executer executenonquery() d'abord sous peine de l'ajouter deux fois...
ExecuteNonQuery() vous retourne le nombre de ligne affectées (premier lien lors d'une recherche GOOGLE en tapant executeNonQuery...)
Utilisez execute scalar() seul.
Citation de MSQN:
Exécute la requête et retourne la première colonne de la première ligne du jeu de résultats retourné par la requête. Les colonnes ou lignes supplémentaires sont ignorées.
Msdn va devenir votre meilleur ami:
static public int AddProductCategory(string newName, string connString)
{
Int32 newProdID = 0;
string sql =
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
+ "SELECT CAST(scope_identity() AS int)";
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = newName;
try
{
conn.Open();
newProdID = (Int32)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return (int)newProdID;
}
Attention Ibersek, ce n'est ps forcément toujours un INT32, cela peut être un DECIMAL, smallint, tynint, BIGINT !
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Bonjour
Vous pourriez aussi utiliser directement la clause OUTPUT (à partir de SQL Server 2005):
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT INTO Production.ProductCategory (Name) OUTPUT INSERTED.LaColonnePK VALUES (@Name);
C'est l'exemple du site Msdn... copié collé tel quel pour sensibiliser notre jeune ami à utiliser ce site incontournable pour tout développeur .net...Attention Ibersek, ce n'est ps forcément toujours un INT32, cela peut être un DECIMAL, smallint, tynint, BIGINT !
A +
Pensez au tag [resolu]
Partager