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")
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
Vous devez vous connecter pour publier un commentaire.
Autant que je suis conscient
@@IDENTITY
ne fonctionne pas pour base de curseur insère. DAO et ADO à la fois utiliser les curseurs de derrière les coulisses.Après vous
.Update
l'enregistrement que vous devriez être en mesure d'obtenir l'identité de la valeur de retour tout simplement par la lecture de la valeur.Le suivant fonctionne très bien pour moi par le biais d'un jeu d'enregistrements ADO ouvert avec le jeu de clés de la sémantique:
Le suivant fonctionne très bien pour moi par l'intermédiaire d'un jeu d'enregistrements DAO ouvert avec feuille de réponse dynamique de la sémantique:
Vous devriez éviter de
.Requery
et.MoveFirst
, vous êtes l'introduction de problèmes de concurrence d'accès. Considérer:N'est-il pas le travail de DAO?
J'ai mis à jour ma réponse pour signaler un problème avec votre application actuelle.
Non, votre solution ne fonctionne pas dans DAO. Et oui, vous avez raison que, théoriquement, un autre utilisateur peut ajouter un nouvel enregistrement dans entre la mise à jour et actualisation. C'est le problème avec l'aide de DMax.
J'ai mis à jour pour inclure un exemple de DAO.
OriginalL'auteur ta.speot.is
Suivantes fonctionne comme prévu (à l'aide d'Office 2013 et SQL Server 2014)
Point clé: au lieu d'utiliser "SELECT TOP 2" ou "SELECT TOP 1', etc. J'ai utilisé " dbSeeChanges Ou dbAppendOnly'. J'ai vérifié dans le générateur de profils sql que l'ouverture du jeu d'enregistrements ne génère pas de requêtes de SQL Server.
Lorsque vous lancez la mise à jour, l'accès génère une instruction insert, suivi immédiatement par un SELECT @@IDENTITY pour obtenir l'id de l'enregistrement.
OriginalL'auteur mendel
il travail dosnt avec sql serveur backend(multi utilisateur de l'app
). pour accéder à la table de travail
pour l'utilisation de sql procédure stockée.l'utilisation de cette façon
ensuite utiliser cette sp dans l'extrémité avant
OriginalL'auteur behrooz
Simplement obtenir la valeur du champ clé avant d'exécuter le
Update
déclaration. Comme souligné dans le commentaire ci-dessous, ce processus ne fonctionnera pas si vous utilisez un autre backend que Microsoft Access. Mais je laisse cette réponse ici dans le cas où c'est votre cas et que vous êtes juste à la recherche d'une réponse à la question générale de savoir comment vous obtenez l'ID du dernier enregistrement inséré.Pour votre exemple, vous pouvez le faire avec Microsoft Access:
OriginalL'auteur Bobort