TransactionScope et Oracle [Résolu]

cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 15 déc. 2006 à 18:22 - Dernière réponse : cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention
- 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
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 24 janv. 2007 à 11:41
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de cs_keskispas
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 16 déc. 2006 à 00:23
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
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 18 déc. 2006 à 10:06
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 18 déc. 2006 à 18:34
Commenter la réponse de cs_coq
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 19 déc. 2006 à 14:25
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 19 déc. 2006 à 15:08
0
Merci
Ok, tiens nous au courant alors ^^

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 19 déc. 2006 à 18:08
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 19 déc. 2006 à 18:19
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
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 20 déc. 2006 à 09:24
0
Merci
L'ODPNet ? C'est ça ?

KesKisPas
Commenter la réponse de cs_keskispas
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 20 déc. 2006 à 10:32
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 20 déc. 2006 à 18:23
0
Merci
Ouep, l'ODP.NET :-)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
cs_keskispas 46 Messages postés vendredi 11 juillet 2003Date d'inscription 26 août 2008 Dernière intervention - 24 janv. 2007 à 11:43
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.