Obtenir l'ID du Dernier Enregistrement Inséré Accès DAO, ODBC, SQL Server 2008 Champ d'Identité

C'est une question très fréquente, mais je vais avoir du mal à obtenir l'ID du dernier enregistrement inséré. Je suis à l'aide de DAO avec des tables ODBC liée à dupliquer un enregistrement et les enregistrements enfants. Mes tableaux sont dans SQL Server 2008 et ont des champs Identité pour les champs ID.

Voici ce que j'ai essayé jusqu'à présent. Mon premier bout de code ici les résultats dans l'erreur 3167, l'Enregistrement est Supprimé. Si je fais un debug.Imprimer le jeu d'enregistrements contient 3 dossiers.

Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 2 * FROM item ORDER BY DateTimeModified DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update 'Completes without error
r.Bookmark = r.LastModified
Debug.Print r("ItemID") 'Error 3167, Record is deleted

Ici est la prochaine chose que j'ai essayé:

Debug.Print db.OpenRecordset("SELECT @@identity FROM item")(0)

Ce dernier se termine sans aucun problème, mais la valeur retournée est incorrecte. D'où la nouvelle ItemID est de 321 renvoie la valeur 614. La valeur, il est de retour semble être progressif (ça change que je continue de tester cela), mais il ne semble pas liée à ma table. Il n'y a pas de champ avec la valeur 614. J'ai une double vérification pour s'assurer que je suis à la recherche de la bonne table.

Je sais que je pourrais utiliser quelque chose comme DLookup ou DMax mais je ne pense pas que ce serait considéré comme de preuve de balle dans un environnement multi-utilisateur.

Je suppose que je pourrais utiliser une Procédure Stockée avec ADO pour contourner ce problème. Je me demande si c'est ma seule option?

Edit1:
Je suis maintenant en utilisant le code suivant et il est en train de faire ce dont j'ai besoin/envie. Je suppose que c'est fondamentalement la même que l'utilisation de DMax.

Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 1 * FROM item ORDER BY ItemID DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update
r.Requery
r.MoveFirst
Debug.Print r("ItemID")
Pouvez-vous utiliser une requête de relais ou d'une procédure stockée? Je suis sûr que vous ne devriez pas utiliser @@identity avec SQL Server (wiki.lessthandot.com/index.php/...).
Je pense que sa SELECT TOP 2 ... Order by DateTimeModified qui joue de vous. Aussi Select @@Identity n'est pas destiné à bue utilisé avec une clause from et n'est pas susceptible de faire ce que vous pensez qu'elle est. Aussi, si vous ne voulez pas utiliser un SP vous pouvez essayer de l'exécution d'une instruction Insert et sélectionnez en un seul lot. par exemple, INSERT INTO ... VALUES ... ; SELECT * FROM items where ItemID = Scope_Identity()
J'ai essayé différentes instructions SELECT dans le jeu d'enregistrements " r " et il ne semble pas faire de différence.
J'ai été en utilisant cette information pour me guider, mais je suppose que c'est peut-être pas exacte: social.msdn.microsoft.com/Forums/en-US/accessdev/thread/...

OriginalL'auteur HK1 | 2012-06-05