Le dernier ID

Résolu
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014 - 2 janv. 2014 à 12:16
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014 - 15 janv. 2014 à 11:30
Bonjour a tous les pros du vb.net et du sql
J'ai réussi à récupérer le dernier ID mais pas le dernier après un INSERT, plusieurs tentatives sans succès ?on utilisant SCOPE_IDENTITY, IDENT_CURRENT et @@IDENTITY, Je suis à court d'idées.


Private Sub btn_ajouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ?btn_ajouter.Click
Dim cmd As OleDb.OleDbCommand
Dim sql_ajouter As String

sql_ajouter = "INSERT INTO Decision (Finnancements,Chapitres)"
sql_ajouter &= " VALUES(?, ?,)"

cmd = New OleDb.OleDbCommand(sql_ajouter, con)
cmd.Parameters.AddWithValue("?.Trim()", txt_Financement.Text.Trim())
cmd.Parameters.AddWithValue("?.Trim()", txt_Chapitre.Text.Trim())

'Ici je souhaite récupérer le dernier ID dans ID.Text de mon sql_ajouter?

cmd.Connection.Open()
cmd.ExecuteReader()
cmd.Connection.Close()

`l'insertion dans la deuxième table.
Dim cmd2 As OleDb.OleDbCommand
?Dim sql_ajouter2 As String

sql_ajouter2 = "INSERT INTO Engagement (NOperations,ID2)"
sql_ajouter2 &= " VALUES(?,?)"

cmd2 = New OleDb.OleDbCommand(sql_ajouter2, con)
cmd2.Parameters.AddWithValue("?", (txt_ NOperations.Text.ToUpper).Trim)

'Ici j'effectue l'insersion ID de la première table "Decision" dans ID2 de la deuxième table ??"Engagement" sachant que ID2 n'est pas en autoincrément
cmd2.Parameters.AddWithValue("?", ID.Text)

cmd.Connection.Open()
cmd.ExecuteReader()
cmd.Connection.Close()

End Sub

Merci.

6 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
5 janv. 2014 à 13:00
Bonjour

J'ai testé le code que je t'ai donné sur une base Access 2010 et il fonctionne.
 Dim con As IDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\Database1.accdb;")
 Try
     con.Open()
     Dim cmd As OleDbCommand
     Dim sql_ajouter As String

     sql_ajouter = "INSERT INTO Decision ([Finnancements],[Chapitres])"
     sql_ajouter &= " VALUES(@Finnancements, @Chapitres);"
     cmd = New OleDbCommand(sql_ajouter, con)
     cmd.Parameters.AddWithValue("@Finnancements", "text1")
     cmd.Parameters.AddWithValue("@Chapitres", "text2")

     cmd.ExecuteNonQuery()

     Dim GetLastcmd As OleDbCommand = New OleDbCommand("SELECT MAX(ID) AS DernierId FROM Decision", con)
     Dim DernierId = GetLastcmd.ExecuteScalar()
     con.Close()
 Catch ex As Exception
     MessageBox.Show(ex.Message)
 Finally
     con.Close()
 End Try

2
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
Modifié par autodidacte3 le 5/01/2014 à 13:22
Bonjour,
Le code me donne le dernier ID existant non le dernier inséré ?
Chez moi par exemple j'ai dix enregistrements Auto-numéroté de 1 à 10 et ben le code ci-dessus m'affiche 10 non 11 du nouveau inséré et ainsi de suite?
Je vais réessayer après quelques modifications.
Je te remercie Robert.
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
5 janv. 2014 à 15:50
Re..

Cela me donne bien le dernier inséré.
j'ai dix enregistrements Auto-numéroté de 1 à 10, le code ci-dessus insère un 11ieme et je récupère bien 11 comme dernier numéro
0
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
Modifié par autodidacte3 le 6/01/2014 à 09:24
Tu a raison Robert, j'ai aussitôt vérifié et c'est mon erreur d'avoir fait une mauvaise insertion de ligne, comme je suis toujours un bleu amateur dans la programmation il me reste à comprendre la différence entre ces deux lignes? pour l'intégrer à mon ptit programme.

Dim DernierId As Integer = Convert.ToInt32(GetLastcmd.ExecuteScalar())

ou

Dim DernierId = GetLastcmd.ExecuteScalar()

Merci et bonne continuation. :)
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
7 janv. 2014 à 11:36
Bonjour

Il n'y a pas de différence dans l'exécution, la différence est syntaxique
Dans les 2 cas c'est bien le dernier ID qui est retourné.
Dans le premier cas on force la réception d'un Int32, ce qui est obligatoire si tu as ajouté "option explicit on et option strict on" car toutes les variables doivent être typées.
Dans le deuxième cas le type de la variable est inconnue, ce qui n'est pas préconisé.
Donc la première syntaxe donne une meilleur lisibilité.
---
bob
0
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
Modifié par autodidacte3 le 7/01/2014 à 16:10
Bonsoir
C'est exactement ce que j'ai retenu
Une dernière question si vous me le permettez ?
J'ai un petit doute et par manque d'expérience, le SELECT MAX(ID) affiche le plus grand nombre de la colonne ID auto-incrémenté, si j'effectue des suppressions d'anciennes lignes de ma table par la requête SELECT DELET... es-ce que ses anciennes lignes qui portent évidement des petits nombres ne seront jamais remplacer par les nouvelles insertions? si c'est le cas mon programme ne m'affichera pas le dernier insérer? dans ce cas je serais en très mauvaise posture?

Exemple : ma table .mdb contient 1000... enregistrements numérotés de 1 à 1000..., si je supprime les dix premiers de 1 à 10, et j'enregistre par la suite plusieurs autres, es que ces dernier ne prendront pas les valeurs de l'ID déjà supprimés?

je tourne autour d'une idée de plus c'est d'ajouté une date :
select date from table where id in (select max(id) from table); ou date = la dernière date d'insertion :)
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
5 janv. 2014 à 14:37
Bonjour
essaie
 Dim DernierId as integer =Convert.ToInt32(GetLastcmd.ExecuteScalar())
1
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
5 janv. 2014 à 16:10
Une angoisse cet ID.
Après des jours et moult recherche sur le Net, c'est grâce à cs_ShayW l'As des As :) que mon problème est résolu et que je tiens à remercier tout particulièrement sans oublier bien sûr le studieux cs_Robert33 et à tout les autres pour le temps qu'il nous consacrer.

Avec mes sincères respect. Merci pour le temps que vous nous avez consacré.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
5 janv. 2014 à 17:01
n'oublie pas de mettre ton projet option explicit on et option strict on
bonne continuation
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
2 janv. 2014 à 12:50
Bonjour,

Si tu arrives à récupérer le dernier ID.. c'est bien celui de la dernière insertion en BDD...
Quel est le souci ?
Normalement, sans difficulté, vous pouvez utiliser la fonction @@IDENTITY qui retournera le dernière valeur d'identité correspondant au dernier insert dans votre table pour la session en cours

Si ça ne fonctionne pas, merci de nous montrer le code utilisé (avec cette fonction).
0
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
3 janv. 2014 à 21:57
Bonsoir et merci Jordane45 :)
je m'excuse de mon absence, c'est a cause de ma connexion.

Je récupère le dernier ID de ma base Access dans la procédure d'affichage à l'ouverture du Form avec cette ligne

sql_afficheIDdecision = "SELECT TOP 1 ID as dernierID FROM Decision ORDER BY ID DESC;" 
Me.DernierID.Text = sql_afficheIDAmis

Après "INSERT..." je n'arrive pas à bien utilisé ou comment utilisé SCOPE_IDENTITY ou @@IDENTITY pour pouvoir récupérer ce fameux dernier ID

Je me demande pourquoi il est si difficile d'obtenir la valeur d'identité disponible dans une déclaration insert "courant"?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
4 janv. 2014 à 10:31
Bonjour

Je ne connais pas Access, mais avec SQL server je procederais comme ça:

Dim cmd As SqlCommand
Dim sql_ajouter As String

sql_ajouter = "INSERT INTO Decision (Finnancements,Chapitres)"
sql_ajouter &= " VALUES(@Finnancements, @Chapitres)"
sql_ajouter &= "SELECT IDENT_CURRENT('Decision')"

cmd = New SqlCommand(sql_ajouter, con)
cmd.Parameters.AddWithValue("@Finnancements", "text1")
cmd.Parameters.AddWithValue("@Chapitres", "text2")

con.Open()
Dim DernierId = cmd.ExecuteScalar()
con.Close()


0
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
4 janv. 2014 à 15:09
Merci Robert
une errure affiche à la ligne :
Dim DernierId = cmd.ExecuteScalar()
Erreur de syntaxe dans l'instruction INSERT INTO.

'Jai changé cette ligne : Dim cmd As SqlCommand à
Dim sql_ajouter As String

sql_ajouter = "INSERT INTO Decision (Finnancements,Chapitres)"
sql_ajouter &= " VALUES(@Finnancements, @Chapitres)"
sql_ajouter &= "SELECT IDENT_CURRENT('Decision')"

'J'ai changé cette ligne : cmd = New SqlCommand(sql_ajouter, con) à
cmd = New OleDb.OleDbCommand(sql_ajouter, con)

cmd.Parameters.AddWithValue("@Finnancements", "text1")
cmd.Parameters.AddWithValue("@Chapitres", "text2")

con.Open()
Dim DernierId = cmd.ExecuteScalar() '''''''''''''Ici l'erreur fatale
con.Close()

vraiment chui coincé depuis plusieurs jours :(
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
4 janv. 2014 à 15:28
Re

L'erreur de syntaxe vient sans doute du fait que j'ai utilisé une syntaxe SQL dans la requête et qui n'est peut-être pas supportée par ACCESS

Essaye d'exécuter seulement "SELECT IDENT_CURRENT('Decision')"
avec un ExecuteScalar()

0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
4 janv. 2014 à 16:04
J'ai fouillé un peu et en effet 'IDENT_CURRENT' n'est pas reconnu par ACCESS.

Reprends ton code d'insertion que tu avais (remplace tout de même le cmd.ExecuteReader() par cmd.ExecuteNonQuery() puisque ta commande ne retourne rien)
puis, avant la fermeture de la connexion ajoute:
'récuperation du dernier ID
Dim GetLastcmd As OleDb.OleDbCommand= New OleDb.OleDbCommand("SELECT MAX(ID) AS DernierId FROM Decision", con)
Dim DernierId = GetLastcmd.ExecuteScalar()
'
0
autodidacte3 Messages postés 58 Date d'inscription mardi 21 juillet 2009 Statut Membre Dernière intervention 25 décembre 2014
Modifié par autodidacte3 le 5/01/2014 à 11:07
Après plusieurs heurs de recherche j'ai enfin et je pense trouvé le début de la solution à mon problème du "dernier ID inséré", voilà un premier aperçu avec le lien traduit de l'anglais que je vais désossé et décortiqué pour trouvé une solution a ce Big problème...

*Cet article étape par étape explique comment récupérer la valeur de colonne d'identité à partir d'une base de données Access.
Récupération de la valeur d'identité à partir d'une base de données Jet est différente de celle de SQL Server, car une base de données Jet ne prend pas en charge les commandes de traitement multi-états. Le Jet OLE DB version 4.0 fournisseur prend en charge la requête SELECT @@Identity qui vous permet de récupérer la valeur du champ à incrémentation automatique qui est généré sur votre connexion. Pour exécuter la requête SELECT @@Identity, il est recommandé que vous utilisez un autre objet OleDbCommand. Cet article explique comment utiliser un deuxième OleDbCommand pour récupérer la valeur de la colonne d'identité.

Remarque: Cette fonction fonctionne uniquement avec Microsoft Jet OLEDB 4.0 bases de données. Les versions antérieures de Microsoft Jet OLEDB ne prennent pas en charge cette fonctionnalité.

Le lien en Anglais : http://support.microsoft.com/default.aspx?scid=kb;en-us;815629

Le lien en Français : http://translate.googleusercontent.com/...

Merci à tous.
0
Rejoignez-nous