Access : insertion dans 2 tables avec un numéro auto [Résolu]

Gaxx 28 Messages postés lundi 20 décembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 21 mars 2005 à 18:06 - Dernière réponse : Allen912 6 Messages postés dimanche 8 janvier 2006Date d'inscription 26 mars 2006 Dernière intervention
- 6 mars 2006 à 11:05
Bonjour,
Dèrrière ce titre se cache un problème fréquent apparemment non résolu dans le forum :
Récupérer la valeur d'un champ en Numéro auto après une insertion dans une table (T_Contacts) pour aller lui associer des droits dans une table (T_Autorisations).

A une époque j'avais fait ça sous Oracle 9i via une procédure stockée mais là j'utilise Access 2003 ... Qui n'a pas l'air de gérer les procédures stockées, qui est cachotier quand aux noms de ses séquences, et dont l'aide ne m'aide pas vraiment pour ce problème ...

Donc voici la méthode choisie dans mon programme en C# :
Insertion dans T_Contacts
Récupération de la valeur maximale de T_Contacts.Id
Insertion dans T_Autorisations avec la valeur récupérée ci-dessus

Tel quel la valeur récupérée n'est pas forcément celle que je veut en cas d'insertions venant de plusieurs utilisateurs dans T_Contacts.
Pour sécuriser cette démarche j'utilise un System.Data.OleDb.OleDbTransaction. Il existe une énumération (IsolationLevel) à passer en paramètre de la méthode "BeginTransaction" mais j'ai pô tout compris et en essayant avec la valeur "ReadCommitted " je me suis fait jeter ...

Voici mon code actuel :

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(fAuth.getConnectionString());


System.Data.OleDb.OleDbCommand comm =
new System.Data.OleDb.OleDbCommand() ;


comm.Connection = conn;


conn.Open();


System.Data.OleDb.OleDbTransaction transaction;


transaction = conn.BeginTransaction();


comm.Transaction = transaction;

[Je construit mes requêtes et les exécute ...]



try


{


transaction.Commit();


}



catch(Exception ex)


{



try


{


transaction.Rollback();


}



catch (System.Data.OleDb.OleDbException exe)


{



if (transaction.Connection !=
null)


{


Console.WriteLine("An exception of type " + exe.GetType() +


" was encountered while attempting to roll back the transaction.");


}


}


Console.WriteLine("An exception of type " + ex.GetType() +


" was encountered while inserting the data.");


Console.WriteLine("Neither record was written to database.");


}


conn.Close();

Est-ce suffisant pour garantir que le T_Contacts.Id récupéré est bien celui que je veut ?

Merci d'avance,
Gaxx
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Gaxx 28 Messages postés lundi 20 décembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 22 mars 2005 à 12:13
3
Merci
Ok, j'ai fait le test et la requête "SELECT @@IDENTITY;" retourne la clef générée du dernier ajout dans une connexion donnée.

Donc le problème est résolu !

Il faut faire une requête d'insertion puis dans la même ouverture de connexion utiliser le "SELECT @@IDENTITY" pour récupérer la bonne valeur.

NB : L'utilisation de System.Data.OleDb.OleDbTransaction vérouille bien la table mais le fait un peu trop bien : aucune insertion parallèle n'est tolérée.
Le problème peut néanmoins être pallié via un try/catch avec un temps d'attente pour réessayer un peu plus tard lors de la libération de la ressource.

Merci Gaxx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de Gaxx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2005 à 20:47
0
Merci
Pas résolu dans le forum ? Mais si ! ^^

http://www.csharpfr.com/forum.v2.aspx?ID=402845&nb=7

Mx
Commenter la réponse de MorpionMx
Gaxx 28 Messages postés lundi 20 décembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 22 mars 2005 à 11:03
0
Merci
Merci pour ta réponse mais j'avais déjà essayé ça sans succès : Access 2003 me jette en me disant "Caractères trouvés après la fin de l'instruction SQL" ...
Commenter la réponse de Gaxx
Gaxx 28 Messages postés lundi 20 décembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 22 mars 2005 à 11:59
0
Merci
Est ce que la requête "SELECT @@IDENTITY;" retourne la clef générée du dernier ajout dans une connexion donnée, ou retourne-t-elle simplement la clef du dernier ajout toutes connexions confondues ?

Je m'explique :
- dans le premier cas je peut faire une nouvelle commande en étant sûr de récupérer la bonne valeur
- dans le second cas le problème reste entier
Commenter la réponse de Gaxx
Gaxx 28 Messages postés lundi 20 décembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 22 mars 2005 à 12:14
0
Merci
PS pour Mx : je n'avais pas cherché avec les bons mots clefs dans le forum ...
Commenter la réponse de Gaxx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 22 mars 2005 à 15:14
0
Merci
Pas de souci, c'était pas un reproche

Content que tu aies pu t'en sortir

Mx
Commenter la réponse de MorpionMx
Allen912 6 Messages postés dimanche 8 janvier 2006Date d'inscription 26 mars 2006 Dernière intervention - 6 mars 2006 à 11:05
0
Merci
Bonjour,
Vous serait t'il possible de poster le code de construction et d'execution de votre requête. Je débute dans le system oledb et les transactions sont pour moi un mystère...

Votre exemple me permettrait de l'adapter à mon code...

Merci d'avance.
Commenter la réponse de Allen912

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.