Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1721 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] [SQL] récupérer une clef Auto-incémenté

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] [SQL] récupérer une clef Auto-incémenté

n°1657984
JulienOrio​n666
Posté le 13-12-2007 à 19:40:38  profilanswer
 

Bonjour,   :)  
 
J'ai une table dans Access avec une clef Auto-incémenté.  
 
je créé un enregistrement à vide par exemple :
 

Code :
  1. oCB.DataAdapter = oDaHF;
  2. oDaHF.InsertCommand = oConn.CreateCommand();
  3. oDaHF.InsertCommand.CommandText = "INSERT INTO Haut_Fonctionnaire (Nom) VALUES (?)";
  4. OleDbParameter para_Nom = oDaHF.InsertCommand.CreateParameter();
  5. para_Nom.SourceColumn = "Nom";
  6. oDaHF.InsertCommand.Parameters.Add(para_Nom);
  7. oDaHF.Update(oDtHF);


 
il me créer une clef dans ma base mais je sais pas comment la recupérer dans mon programme,
ce qui pose problème pour d'autre opérations alors je suis obligé de tout recharger.  :heink:  
 

Code :
  1. oDtHF.Clear();
  2. oDaHF.Fill(oDtHF);


 
plus il ya d'enregistrements et plus ca sera long et de plus ... c'est pas tres jolie comme code  :sweat:


Message édité par JulienOrion666 le 13-12-2007 à 19:41:24
mood
Publicité
Posté le 13-12-2007 à 19:40:38  profilanswer
 

n°1657991
flo850
moi je
Posté le 13-12-2007 à 20:04:06  profilanswer
 

regarde du cote de LAST_INSERT_ID()


---------------

n°1657994
JulienOrio​n666
Posté le 13-12-2007 à 20:21:56  profilanswer
 

c'est propre a mysql uniquement je suis sur Access
 
apparament c est : "Select @@identity From maTable" sur access


Message édité par JulienOrion666 le 13-12-2007 à 20:31:05
n°1658001
flo850
moi je
Posté le 13-12-2007 à 20:36:04  profilanswer
 

oups , j'avais lu en travers , desolé  
 
sur access, je sais pas


---------------

n°1658183
arnaudm57
Posté le 14-12-2007 à 11:21:35  profilanswer
 

Pour ma part j'utilisais cette forme sous SQL Server 2005 :
 

Code :
  1. string request = "INSERT INTO ... ; SELECT @@IDENTITY as LastId;";


 
puis je faisais un ExecuteScalar() afin de récupérer la valeur

n°1658278
JulienOrio​n666
Posté le 14-12-2007 à 13:30:58  profilanswer
 

j'ai recuperer ma clef avec "Select @@Identity" mais mettre une clef auto incrementé par code dans le datable n'es pas une bonne idee il considere la ligne a mette a jour et au prochaine update il va esseyer d'ecrire la clef dans la base alors que c'est la base qui s'occupe des clef auto incrementer....
 
j'ai trouve ca :
http://msdn2.microsoft.com/fr-fr/l [...] S.80).aspx
 


Message édité par JulienOrion666 le 14-12-2007 à 13:52:58
n°1658300
MagicBuzz
Posté le 14-12-2007 à 13:54:00  profilanswer
 

Il n'est pas question ici d'inserrer la valeur de la clé. De toute façon, Access comme SQL Server ne permet pas de forcer la valeur d'un champ autoincrément à moins de lancer des statements particuliers avant la requête.
 
Par contre, quand tu crées par exemple une commande, t'es bien content de savoir quel numéro a été généré afin ensuite d'insérrer les lignes de la commande dans la table liée...
 
D'où le besoin assez courant de connaître l'ID qui vient d'être créé.
 
 
A noter que @@Identity, ça pose des problèmes sous SQL Server, où on utilise SCOPTE_IDENTITY() plutôt, car plus fiable (y'a de très bons exemple qui exempliquent la différence entre les deux).
 
Ceci dit, Access ne devrait pas être impacté par le problème, puisque SCOPE_IDENTITY() résoud les problèmes inhérents aux accès concurrents et aux mise à jour en cascades via triggers, donc ça ne concerne pas ou peu Access qui tourne normalement en monoposte et qui ne supporte pas les triggers. Mais attention tout de même !

n°1658532
JulienOrio​n666
Posté le 14-12-2007 à 19:30:39  profilanswer
 

Si tu récupère ID apres avoir fait l'insert (avec une requete "SELECT @@IDENTITY" et ExecuteScalar par exemple)
et que tu met ca dans ton DataTable genre  

Code :
  1. dt.row[ilast]["ID"] = ID


 
il va considere la ligne comme a mettre à jour et au prochaine update il essayera en vain de la mettre ds la base, normale c'est à la base de s'occupé de la clef.
 
C'est pour ca qu'il faut faire comme dans l'exemple du msdn :http://msdn2.microsoft.com/fr-fr/l [...] S.80).aspx  
 

Code :
  1. protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
  2. {
  3.   int newID ;
  4.   OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", connection);
  5.   if (args.StatementType == StatementType.Insert)
  6.   {
  7.   newID = (int)idCMD.ExecuteScalar();
  8. args.Row["ID"] = newID;  // ICI IL ECRIT DES DONNE SANS LES MARQUER COMME A METTRE A JOUR DANS LE DATATABLE IMPEC
  9.   }
  10. }

 ;)

n°1664067
moi23372
Posté le 30-12-2007 à 11:32:51  profilanswer
 

ou de faire un AcceptChanges() sur la dataRow pour repasser le RowState en "Unchanged".  
 
En principe de mémoire,  
 
en insertion, les méthodes comme ExecuteScalar, ExecuteNonQuery, etc. renvoit l'id généré en DB.  
 
en modification, ces méthodes renvoit le nombre de lignes modifiée.  
 
Ou est le problème?
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] [SQL] récupérer une clef Auto-incémenté

 

Sujets relatifs
Comment récupérer les valeurs d'un CheckBox ? (Résolu)Visual Studio 2005, récupérer un projet .net 1.1 venant de 2003
Pb avec imbrications de requete select SQLLire a partir de l'ecran en PL/SQL
récupérer coefficient de détermination avec une macro[SQL] SQL_CALC_FOUND_ROWS + FOUND_ROWS() + LIMIT avec MSSQL?
[Résolu] Une boucle dans une requête SQL?[JS] Ajout auto d'un champ input-text selon valeur d'une listbox
[SQL] Afficher un certain nombre de donnée dans 1 ligne d'un tableauRécupérer l'heure de la dernière synchronisation NTP
Plus de sujets relatifs à : [C#] [SQL] récupérer une clef Auto-incémenté


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR