TransactionScope et Oracle [Résolu]

Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
- - Dernière réponse : cs_keskispas
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
- 24 janv. 2007 à 11:43
Bonjour tout le monde !
J'essaye de tester la prise en charge des transactions en C# sous Oracle.
Le problème c'est ma transaction, même volontairement interrompue, n'est pas annulée dans la base de données !
Peut être que je n'utilise pas ce qu'il faut pour l'annuler.

Par exemple :
...
TransactionScope ts = new TransactionScope();
using (ts)
{
 try
 {
   ... [Mise à jour de la base] ...
   throw new Exception("Mon exception");
 }
 catch(Exception ex)
 {
   ts.Dispose(); // Rollback !
  }
}    
...

En sortant de là, les données sont dans la base au lieu d'être "rollbackées" !
Il me semble que sous SQL Server 2005, ce code passe sans problème.
Quelqu'un peut m'aider ?

Merci !

KesKisPas
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
3
Merci
Finalement, l'ODP.Net marche sans problème à quelques exceptions près :

La DLL, oramts.dll, fournie avec Oracle est une DLL de debug qui fait 192 Ko. Il faut donc télécharger la DLL de release de 137 Ko qui fonctionne sans problème avec .Net ! C'est étonnant mais plusieurs site confirme cette erreur.
( ex : http://jelle.druyts.net/2006/06/25/UnableToLoadOramtsdllTryTheReleaseVersion.aspx )

Passé ce  premier écueil, il faut penser à utiliser le bon provider, avec dans les chaine de connexion ou dans les using :
Oracle.DataAccess.Client.

Et là, ça marche sans problème, sur un serveur IIS.
Sur le WebDev de VS2005, il arrive que ça plante.

Voilà !

KesKisPas

Merci cs_keskispas 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_keskispas
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Salut,

Et si tu spécifies explicitement la transaction à l'initilisation du TransactionScope ?
Il me semble qu'il y a des cas où on se trouve en "AutoCommit" au lieu d'un "AutoRollback" escompté.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
Ah...

Je t'avouerai que je n'ai pas compris ta réponse.

Tu peux m'éclairer davantage ?

Merci .

KesKisPas
Commenter la réponse de cs_keskispas
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
Commenter la réponse de cs_coq
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
D'accord !

En fait, j'étais partie dans ce sens mais je ne trouve pas encore de solution.

Je n'ai qu'une seule transaction dans mon programme, et c'est celle là.
A part ça, mes opérations sur les bases sont effectuées par des DataSets...

Pour tester, j'ai ajouté dans ces opérations un DataSet sur une base SQL Server, et en cas de RollBack, seule les modifs sur SQL Server sont annulées, les modifs sur Oracle, elles, sont validées malgré le RollBack...

Je cherche toujours...

KesKisPas
Commenter la réponse de cs_keskispas
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Ok, tiens nous au courant alors ^^

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
Je crois avoir trouvé la réponse, elle se situe dans la chaine de connexion !

Si la propriété Enlist est à 'true', les transactions sont prises en compte
Sinon, elles sont "ignorées".
Après quelques essais, on dirait que ça vient réellement de là.

A lire la définition, ça "paraît" logique, mais je n'avais pas cherché par là :
http://msdn2.microsoft.com/fr-fr/library/system.data.oracleclient.oracleconnectionstringbuilder.enlist(VS.80).aspx

Voilà !

Si quelqu'un a davantage de précision, je suis preneur, merci.

KesKisPas
Commenter la réponse de cs_keskispas
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Bon à savoir.
Si le provider Oracle intégré te pose problème (enfin là ça doit être global), tu as peut être intérêt à regarder du côté de celui fourni par Oracle.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
L'ODPNet ? C'est ça ?

KesKisPas
Commenter la réponse de cs_keskispas
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
Je regarderai du côté d'ODP.Net parceque je trouve un comportement bizarre avec le serveur Web de Dév de VS2005...

Si je ne détruis pas le serveur entre 2 tests, ma transaction reste bloquée indéfiniment. Donc, quand je testerais sur un vrai IIS, je confirmerai.

Merci en tout cas !

KesKisPas
Commenter la réponse de cs_keskispas
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Ouep, l'ODP.NET :-)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
46
Date d'inscription
vendredi 11 juillet 2003
Dernière intervention
26 août 2008
0
Merci
Pour info, ce problème de DLL est présent sur les Oracle 9.

Sur les versions ultérieures, je ne sais pas si le problème a été résolu.

KesKisPas
Commenter la réponse de cs_keskispas

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.