2010-01-15 8 views
7

Je rencontre des problèmes pour faire fonctionner la bibliothèque ODP.NEt avec .NET DBProviderFactories. Je reçois l'erreur suivante avec ce code:DbProviderFactories pour .NET Erreur

_DBFactory = DbProviderFactories.GetFactory(providerName); 

Une erreur est survenue la création du gestionnaire de section de configuration pour system.data: La colonne « invariantname » est limitée à être unique. La valeur 'Oracle.DataAccess.Client' est déjà présente.

avec ce providerName: Oracle.DataAccess.Client

Et l'entrée suivante dans le web.config:

<system.data> 
    <DbProviderFactories> 
     <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 

Est-ce que quelqu'un sait ce qui ne va pas? Je ne pense pas l'avoir installé deux fois n'importe où.

+0

le même problème et résoudre http://stackoverflow.com/questions/4225908/error-when-adding-a-configuration-to-app-config-file –

Répondre

6

Si vous avez installé ODP.net (par exemple en utilisant le programme d'installation universel d'Oracle, par opposition à xcopy), vous trouverez le même fichier DbProviderFactories/add in machine.config.

Donc, l'ajouter dans votre web.config est l'ajouter une seconde fois - donc, dupliquer Oracle.DataAccess.Client!

+0

Alors, quel est le "bon" endroit? – ThatAintWorking

+1

Ce problème peut également se produire si vous avez installé ODP.net avant d'installer la version de .NET que vous utilisez, dans mon cas .NET4. –

+0

@FredrikC: Merci pour votre commentaire y at-il une commande pour l'enregistrer à nouveau –

5

Pouvez-vous faire ce qui suit? (Notez le « clair »)

<system.data> 
    <DbProviderFactories> 

     <clear /> 

     <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 

    </DbProviderFactories> 
    </system.data> 
1

Il convient de noter que <clear /> effacera toutes les DbProviderFactories que vous ne voulez pas faire, en fonction de votre situation.

Vous pouvez aussi simplement supprimer ce droit de classe avant de l'ajouter à nouveau en ajoutant cette ligne:

<remove invariant="Oracle.ManagedDataAccess.Client" />

Voilà comment l'ensemble <system.data> regarderait:

<system.data> 
    <DbProviderFactories> 
     <remove invariant="Oracle.ManagedDataAccess.Client" /> 
     <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" 
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 

Cela peut être utile si les environnements de votre machine et serveur local n'ont pas de fichiers de configuration correspondants tels que machine.config.

L'autre chose que vous pourriez faire est juste de le retirer de votre web.config tous ensemble en supposant que le paramètre dans votre machine.config fonctionnera. Cependant, je voudrais tester cela à la fois sur votre machine de développement et sur vos serveurs. Dans mon cas, cela a fonctionné sur un mais pas sur l'autre car les fichiers machine.config ne correspondaient pas. Pour résoudre, j'ai ajouté ce même paramètre pour le machine.config sur le serveur sans <remove invariant="Oracle.ManagedDataAccess.Client" /> comme ceci:

<system.data> 
    <DbProviderFactories> 
     <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" 
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 
1

plus probablement partie du fichier de configuration de la machine DbProviderFactories écrasements. Vérifiez s'il existe une ligne Oracle.DataAccess.Client supplémentaire, qui reste après la désinstallation du client Oracle.