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

récupérer une clef Auto-incémenté [C#] [SQL] - C#/.NET managed - Programmation

Marsh Posté le 13-12-2007 à 19:40:38    

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
Reply

Marsh Posté le 13-12-2007 à 19:40:38   

Reply

Marsh Posté le 13-12-2007 à 20:04:06    

regarde du cote de LAST_INSERT_ID()


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

Reply

Marsh Posté le 13-12-2007 à 20:21:56    

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
Reply

Marsh Posté le 13-12-2007 à 20:36:04    

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


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

Reply

Marsh Posté le 14-12-2007 à 11:21:35    

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

Reply

Marsh Posté le 14-12-2007 à 13:30:58    

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
Reply

Marsh Posté le 14-12-2007 à 13:54:00    

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 !

Reply

Marsh Posté le 14-12-2007 à 19:30:39    

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. }

 ;)

Reply

Marsh Posté le 30-12-2007 à 11:32:51    

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?
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed