Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Oracle et transaction distribuée : Internal data error -3000

Je travaille actuellement sur un projet utilisant 2 instance de bases de données Oracle. J’avais besoin d’avoir une transaction globale, qui s’effectue sur l’ensemble de mes bases de données : une transaction distribuée.

J’ai pour cela utilisé l’objet TransactionScope de .net qui permet d’avoir des transactions distribuées en utilisant Ms DTC (Microsoft Distributed Transaction Coordinator). L’avantage de l’objet TransactionScope et qu’il n’y a rien à configurer, à partir du moment où MsDTC est configuré, il gère automatiquement les transactions.

Ce billet ne traite pas de la classe TransactionScope et de MsDTC, pour en savoir plus, je vous invite à lire l’article suivant : Implementing an Implicit Transaction using Transaction Scope

Afin d’accéder à mes bases de données Oracle, j’utilise le provider fourni par Oracle : ODP.net (Oracle Data Provider for .net).

Le code que j’utilise est le suivant :

static void Main(string[] args)
{
 
    String connectionString = @"DATA SOURCE=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.XXX.XXX)(PORT=1521)))(CONNECT_DATA=(SID=xxx1)(SERVER=DEDICATED)));
                                Password=xxxa;USER ID=xxxa;";
    String connectionString2 = @"DATA SOURCE=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.XXX.XXX)(PORT=1521)))(CONNECT_DATA=(SID=xxx2)(SERVER=DEDICATED)));
                                Password=xxxb;USER ID=xxxb;";
 
    Stopwatch watcher = Stopwatch.StartNew();
 
    Console.WriteLine(String.Format("0. {0:N0}", watcher.ElapsedMilliseconds));
 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    {
        using (OracleConnection conn = new OracleConnection(connectionString))
        {
            conn.Open();
            Console.WriteLine(String.Format("1. {0:N0}", watcher.ElapsedMilliseconds));
        }
 
        using (OracleConnection conn2 = new OracleConnection(connectionString2))
        {
            conn2.Open();
            Console.WriteLine(String.Format("2. {0:N0}", watcher.ElapsedMilliseconds));
        }
 
        scope.Complete();
    }
}

Pour que cela fonctionne, il est nécessaire d’installer le service “Oracle Services for Microsoft Transaction Server”. Ce composant est installable depuis l’installateur du client Oracle, il permet de faire l’interface entre MsDTC et Oracle.

Malheureusement, après l’installation de ces composants, j’obtenais l’erreur “Internal data error : – 3000” lorsque j’exécutais le code.

Après plusieurs recherches, l’erreur se situe au niveau de la chaine de connexion. Le code ci-dessus utilise le format de chaine de connexion complet, c’est à dire que l’on n’utilise pas le fichier tnsname.ora pour spécifier l’instance Oracle.

Afin de résoudre le problème, il est nécessaire d’utiliser le format de chaine de connection court : utiliser le fichier tnsname.ora.

Le fichier tnsname.ora se trouve dans le dossier $ORACLE_HOME$\product\11.2.0\client_1\NETWORK\ADMIN. Si vous n’avez pas ce dossier, il faut installer le composant “Oracle Connection Manager”.

Vous pouvez avoir plus d’informations sur les fichiers tnsname.ora ici : http://www.orafaq.com/wiki/Tnsnames.ora.

Au final, voici les composants du client Oracle que j’ai installés :

image

Il s’agit d’ailleurs d’un bug connu de Oracle référencé sous le numéro Bug 9788105 - ODP.NET WITH SYSTEM.TRANSACTIONS FAILS WHEN USING FULLY QUALIFIED TNS CON STRING.

Et vous ? Avez vous déjà travaillé avec des transactions distribuées et Oracle ?

Posted: mardi 3 mai 2011 23:36 par cyril
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Nettoyage des versions de List Item avant migration depuis SharePoint On Premise vers SharePoint Online par Blog Technique de Romelard Fabrice le 08-08-2017, 15:36

- Office 365: Comment supprimer des éléments de liste SharePoint Online via PowerShell par Blog Technique de Romelard Fabrice le 07-26-2017, 17:09

- Nouveau blog http://bugshunter.net par Blog de Jérémy Jeanson le 07-01-2017, 16:56

- Office 365: Script PowerShell pour assigner des droits Full Control à un groupe défini par Blog Technique de Romelard Fabrice le 04-30-2017, 09:22

- SharePoint 20XX: Script PowerShell pour exporter en CSV toutes les listes d’une ferme pour auditer le contenu avant migration par Blog Technique de Romelard Fabrice le 03-28-2017, 17:53

- Les pièges de l’installation de Visual Studio 2017 par Blog de Jérémy Jeanson le 03-24-2017, 13:05

- UWP or not UWP sur Visual Studio 2015 ? par Blog de Jérémy Jeanson le 03-08-2017, 19:12

- Désinstallation de .net Core RC1 Update 1 ou SDK de Core 1 Preview 2 par Blog de Jérémy Jeanson le 03-07-2017, 19:29

- Office 365: Ajouter un utilisateur ou groupe dans la liste des Site collection Administrator d’un site SharePoint Online via PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-24-2017, 18:52

- Office 365: Comment créer une document library qui utilise les ContentTypeHub avec PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-22-2017, 17:06