begin process at 2010 02 10 12:58:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C#

 > 

Archives

 > 

Base de données

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 21 mars 2005 à 18:06:41 | Access : insertion dans 2 tables avec un numéro auto

Gaxx

Membre Club
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

lundi 21 mars 2005 à 20:47:52 | Re : Access : insertion dans 2 tables avec un numéro auto

MorpionMx

Membre Club Administrateur CodeS-SourceS
Pas résolu dans le forum ? Mais si ! ^^
http://www.csharpfr.com/forum.v2.aspx?ID=402845&nb=7

Mx
mardi 22 mars 2005 à 11:03:52 | Re : Access : insertion dans 2 tables avec un numéro auto

Gaxx

Membre Club
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" ...
mardi 22 mars 2005 à 11:59:19 | Re : Access : insertion dans 2 tables avec un numéro auto

Gaxx

Membre Club
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
mardi 22 mars 2005 à 12:13:36 | Re : Access : insertion dans 2 tables avec un numéro auto

Gaxx

Membre Club
Réponse acceptée !
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.
mardi 22 mars 2005 à 12:14:56 | Re : Access : insertion dans 2 tables avec un numéro auto

Gaxx

Membre Club
PS pour Mx : je n'avais pas cherché avec les bons mots clefs dans le forum ...
mardi 22 mars 2005 à 15:14:20 | Re : Access : insertion dans 2 tables avec un numéro auto

MorpionMx

Membre Club Administrateur CodeS-SourceS
Pas de souci, c'était pas un reproche
Content que tu aies pu t'en sortir

Mx
lundi 6 mars 2006 à 11:05:43 | Re : Access : insertion dans 2 tables avec un numéro auto

Allen912

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.


Cette discussion est classée dans : system, valeur, data, oledb, transaction


Répondre à ce message

Sujets en rapport avec ce message

System.Data.OleDb.OleDbException: Erreur non spécifiée [ par ccda ] Bonjour,Je rencontre un problème de connexion à ma base de données Access lors de certaines requêtes. La programmation est en C#.L'erreur signalée est Connection à access en C# [ par dimcel ] Bonjour, j'essye de me connecter en c# à ma base de données access mais j'ai une erreur avec la ligneOleDbDataReader myReader = myCommand.ExecuteReade Problème connexion base de données ACCESS [ par adomarle ] Bonjour,Je cherche à me connecter à ma base de données ACCESS, de cette manière : protected void Ses connection OleDb et Oracle [ par atmeitsatme ] Bonjour,J'utilise dans un web service un acces à ma base de données Oracle via les objets OleDB.Mon code :     [WebMethod]    public int test()    {   Pb requete SQL sur une base Oracle [ par atmeitsatme ] Bonjour,J'ais un web servcice, qui se connecte à une base données Oracle via OleDb.Voici une de mes web methodes : OleDbDataAdapter monAdapter = new O [C#] erreur dans un programme permettant d'inserer des données dans une base de donnée (Une exception non gérée du type 'System.Data.OleDb.OleDbException' s'est produite dans system.data.dll) [ par Julien_Gates ] Bonsoir je ne comprend pas mon erreur venant d'une requete d'insertion dans une base de donnée en C# : voici mon code : System.Data.OleDb.OleDbConn Gestion d'exception [ par erosplus ] Bonjour,lorsque je lance mon apllication crée avec Visual Studio C#.Net il y'a un avertissement qui dit:une exception non géré du type'System.Data.Ole base donnée acess [ par fayrous ] Salut; dans la requete update il y a une erreur de syntax. pouvez vous m'aider. System.Data.OleDb.OleDbConnection c = new System.Data.OleDb.OleDbConn System.DATA.dataRowView [ par hicham_899 ] bonjoursj'ai remplis une combobox avec une champs de base de donnée  par le code suivant :  private void AjouterSousFamille_Load(object sender, EventA modifier une table [ par fayrous ] Salut; voici le code private void button6_Click(object sender, EventArgs e) { if (richTextBox_exercice_m.Text != "" && richT


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales