Le dernier ID [Résolu]

autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 2 janv. 2014 à 12:16 - Dernière réponse : autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention
- 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.
Afficher la suite 

22 réponses

Répondre au sujet
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 5 janv. 2014 à 13:00
+2
Utile
11
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

Cette réponse vous a-t-elle aidé ?  
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 8 janv. 2014 à 00:49
Bonsoir

Je confirme, les ID (type entité) vont toujours en incrément, jusqu'à 2 puissance 32, ensuite je ne sais pas ...
L'ajout d'une date permet de savoir quand à eu lieu l'insertion, c'est plus fonctionnel que structurel, la requête que tu proposes retournera en effet la date d'insertion , mais cela ne change rien à l'utilisation de l'ID puisque tu utilises toujours le MAX(ID) comme filtre.
---
Bonne soirée
Bob
autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 12 janv. 2014 à 10:57
Bonjour, j'ai lu quelque part aussi qu'il n'y a pas de limites en terme de nombre d'enregistrements. Nous sommes dans une base de données, non dans un tableur :) .

La limite théorique est liée à la taille du fichier mdb qui ne peut pas dépasser 2 Go... "La seule limite est de 2 giga (2000 méga) et non une valeur en nombre de ligne "

merci à tous et bonne programmation.
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 12 janv. 2014 à 17:00
Bonjour

Je suis d'accord avec la limite de 2Go pour une table, mais après vérification dans ACCESS les colonnes de type Entier, donc les ID également, sont limitées à 2 puissance 31 (2147483647)

pour les autres limites, voir là:http://office.microsoft.com/fr-fr/access-help/caracteristiques-daccess-2010-HA010341462.aspx#BMaccessdb
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 12 janv. 2014 à 17:08
Re..
Le nombre total d'enregistrement d'un table semble limité à 4 milliards (http://support.microsoft.com/kb/97520/fr), je n'ai pas trouvé de mise à jour pour les versions plus récentes.
autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 15 janv. 2014 à 11:30
Bonjour, c'est exactement ce que je cherchais
Merci pour le tuyau :) actuellement, mon ptit programme marche, je devrais voir d'autre SGBD dans l'avenir c'est encore "mieux"...

ça fait un bout de temps que j'ai tous laissé de côté par manque de temps, je suis de retour dans les dédale de la programmation et je vais pas lâcher prise :)

Merci encore cs_Robert33.
Commenter la réponse de cs_Robert33
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 5 janv. 2014 à 14:37
+1
Utile
2
Bonjour
essaie
 Dim DernierId as integer =Convert.ToInt32(GetLastcmd.ExecuteScalar())
autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 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é.
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 5 janv. 2014 à 17:01
n'oublie pas de mettre ton projet option explicit on et option strict on
bonne continuation
Commenter la réponse de cs_ShayW
jordane45 20602 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 2 janv. 2014 à 12:50
0
Utile
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).
Commenter la réponse de jordane45
autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 3 janv. 2014 à 21:57
0
Utile
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"?
Commenter la réponse de autodidacte3
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 4 janv. 2014 à 10:31
0
Utile
1
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()


autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 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 :(
Commenter la réponse de cs_Robert33
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 4 janv. 2014 à 15:28
0
Utile
2
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()

cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 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()
'
autodidacte3 59 Messages postés mardi 21 juillet 2009Date d'inscription 25 décembre 2014 Dernière intervention - 5 janv. 2014 à 10:59
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.
Commenter la réponse de cs_Robert33

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.