Access : insertion dans 2 tables avec un numéro auto

Résolu
Gaxx Messages postés 28 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 19 mars 2008 - 21 mars 2005 à 18:06
Allen912 Messages postés 6 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 26 mars 2006 - 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

7 réponses

Gaxx Messages postés 28 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 19 mars 2008
22 mars 2005 à 12:13
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.
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2005 à 20:47
Pas résolu dans le forum ? Mais si ! ^^

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

Mx
0
Gaxx Messages postés 28 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 19 mars 2008
22 mars 2005 à 11:03
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" ...
0
Gaxx Messages postés 28 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 19 mars 2008
22 mars 2005 à 11:59
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gaxx Messages postés 28 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 19 mars 2008
22 mars 2005 à 12:14
PS pour Mx : je n'avais pas cherché avec les bons mots clefs dans le forum ...
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 mars 2005 à 15:14
Pas de souci, c'était pas un reproche

Content que tu aies pu t'en sortir

Mx
0
Allen912 Messages postés 6 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 26 mars 2006
6 mars 2006 à 11:05
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.
0
Rejoignez-nous