Récupérer la ligne qui vient d'être ajoutée dans une table (Access ou SQL Server

romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 - 10 mai 2007 à 14:41
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 13 mai 2007 à 18:12
Bonjour,

dans le cas d'une table disposant d'une clé primaire auto incrémentée

voila je voudrais savoir comment je peux faire pour ajouter une ligne à la table et récupérer / connaitre de manière certaine la clé primaire qui a été générée (parce que bien sur certains risuqnet de me dire en faisant select Max(colonnecleprimaire) from matable) ?

j'ai pensé aussi à mettre un verrou sur la ligne mais ce n'est pas réellement envisageable

merci
++
A voir également:

3 réponses

romagny13 Messages postés 687 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 27 août 2014 3
10 mai 2007 à 15:46
Ouai bon j'ai vu l'article de Sweety
en faisant  quelque chose du style
DECLARE

@liste
TABLE
([ContactTypeID]
int)INSERT

INTO [ContactType]
([ContactTypeLib]
)OUTPUT

inserted
.[ContactTypeID]
INTO @liste
values

('oui')SELECT

*
FROM @liste

ca marche
mais seulement pour SQL Server 2005 et pas Access donc ...

tout le problême vient du fait que dans une application .NET
il y a 2 cas :
- soit c'est "l'application" qui crée la clé (un unique identifiant par exemple)
- soit c'est la base qui crée la clé primaire dans le cas d'une clé auto incrémentée

et c'est la que se pose le problême car si l'application définit une clé en local (par exemple si on prend un fonctionnement Dataset typé + table Adapters)
si au cours de la saisie un autre utilisateur crée une ligne en base , alors lorsque le premier insérera sa ligne, la clé ne correspondra plus à celle qu'il a en local, et c'est trés visible si par la suite l'utilisateur essaie de modiifer cette même ligne car il aura une exception "accès concurrentiel" (avec requete optimiste)

donc quelle est la réponse concrète à apporter >>
éviter de définir  des clés auto incrémentées pour ses tables , préférer par exemple les uniques identifiants ?
ou alors masquer à l'utilisateur la clé auto incrémenté lors de la création d'une ligne puis seulement recharger les données dans application ? (humm pas trop tentant)
0
lafolle24320 Messages postés 406 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 29 juin 2009 7
10 mai 2007 à 17:05
bonjour,

sous sql server tu peux récupérer ta clé qui se trouve dans @@identity

tufais une procédure qui t'insère ta ligne exemple insert into truc (....)

et juste après tu fais @num = @@identity

par contre pour access je sais pas


bon courage


lafolle
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
13 mai 2007 à 18:12
Attention, avant de récuperer @@identity, il faut toujours vérifier que l'insert à bien été fait :

declare @lastid int

insert into ect...

if( @@rowcount <= 0 OR @@error <> 0 )
begin
      print 'insert a échoué'
      set @lastid = -1
end
else
begin
      set @lastid = @@identity
end
0
Rejoignez-nous