1

Cela fait longtemps que je n'ai pas utilisé Access en dernier recours, mais je suis obligé de le faire. J'utilise Enterprise Library 4.1, le Data Access Application Block .. avec .NET 3.5 et je voulais connaître le meilleur moyen (exemple de code si possible) d'écrire une requête d'insertion qui me donnera automatiquement le numéro automatique nouvellement inséré ..ou s'il n'est pas possible de le faire en une seule étape, comment recommandez-vous de le faire?Obtenir Autonumber à partir de l'enregistrement nouvellement inséré dans Access 2007 à l'aide de la bibliothèque d'entreprise 4.1

merci pour votre aide.

Répondre

0

Après d'autres recherches, cela ne peut tout simplement pas être fait dans Access en une seule étape, ce que je cherchais. Je vais fournir des liens vers les pages où j'ai trouvé la confirmation de la limitation quand je viens.

+0

Mais avec un magasin de données Jet/ACE, tant que vous exécutez SELECT @@ IDENTITY avec la même connexion immédiatement après votre insertion, vous obtiendrez la valeur Autonumber correcte. Oui, il s'agit de deux étapes, mais cela ne pose pas de problème - vous obtiendrez une réponse fiable Pourquoi pensez-vous qu'il ne s'agit pas d'une seule étape est un problème? –

+0

En fait, il existe une autre façon de le faire, en utilisant un jeu d'enregistrements c'est-à-dire, ouvrir un jeu d'enregistrements de type ajouter, ajouter un nouvel enregistrement, remplir les données, ramasser la valeur Autonumber, enregistrer l'enregistrement, et vous avez terminé.Mais c'est beaucoup plus que les deux étapes en utilisant un SQL INSERT et SELECT @@ IDENTITY –

+0

Salut David, merci pour le commentaire Eh bien, la raison pour laquelle je le voulais en une seule étape est parce que j'utilise une application .NET avec Enterprise Library, et nous avons des sprints CRUD. l'application .NET, je ne veux pas avoir à appeler deux sprocs différents dans le même appel de méthode C# C'est pourquoi je me suis senti important de noter que cela ne peut pas être fait dans un seul sproc dans Access. Pour savoir que la limitation est là est important – GR7

3

Avec une seule connexion:

  1. exécuter l'instruction INSERT.

  2. puis obtenir le résultat de SELECT @@ IDENTITY, qui renvoie la valeur Autonumber insérée à l'étape 1.

En d'autres termes, il est comme SQL Server (et a été depuis 1999, Jet 4 a été introduit, y compris le support de SELECT @@ IDENTITY).

+0

merci David..mais d'abord, vous devriez utiliser SCOPE_IDENTITY() au lieu de @@ IDENTITY ... et d'autre part, le faire comme il peut être fait dans le serveur SQL est ce que je cherche. Avec SQL Server, vous pouvez simplement ajouter un SELECT SCOPE_IDENTITY() à la fin du sproc, et vous obtenez la nouvelle identité dans la même exécution de ExecuteScalar(). Cependant, je n'ai pas trouvé un moyen de le faire avec Access en une seule étape, c'est pourquoi je voulais savoir comment les autres géraient cela. – GR7

+0

Honnêtement, je ne connaissais pas SCOPE_IDENTITY(), probablement parce que toutes mes applications Access avec back-end SQL Server ont été migrées à partir d'Access et n'ont pas de déclencheurs (ce qui, selon moi, est la seule raison de l'utiliser préférence à @@ IDENTITY). Dans Jet/ACE, il n'y a pas de déclencheurs (bien, il y en aura dans Access 2010, alors peut-être qu'ils ont ajouté SCOPE_IDENTITY() à la nouvelle version de Jet), donc il n'y a pas de danger ici - la portée est limitée à connexion actuelle, donc pas de problème du tout tant que vous réutilisez la même connexion - deux étapes fonctionneront très bien. –

+1

+1 David a raison. Scope_Identity ne s'applique pas ici car il n'est valide que dans un sproc. En SQL, il vous empêche d'obtenir un ID invalide, par exemple. dans le cas où un déclencheur est en cours d'exécution sur la table cible qui insère une autre valeur avant que vous puissiez obtenir la nouvelle identité. Dans jet vous spécifiez la table SELECT @@ Identity FROM sTableName qui limite votre portée de toute façon. – Praesagus

-3

Ce que fait iam dans SQL Server. Ceci renvoie la autonumber clé primaire de la production vaiable

CREATE PROCEDURE [dbo]. [TEST] (

@p_ID NUMERIC (9,0) OUT,

@p_NAME NVARCHAR (150)

AS BEGIN

INSERT INTO EMR_INV_MAST_ORDERSET(NAME) 
    VALUES (@p_NAME) 
    SELECT @p_ID= SCOPE_IDENTITY() 

FIN

+2

Rien de tout cela fonctionnera avec Access/Jet/ACE. Tout d'abord, vous ne pouvez pas exécuter deux instructions SQL dans un QueryDef, deuxièmement, SCOP_IDENDITY() est spécifique à SQL Server. –