2010-01-15 24 views
7

Tengo problemas para conseguir que la biblioteca ODP.NEt trabaje con .NET DBProviderFactories. Estoy recibiendo el siguiente error con este código:DbProviderFactories for .NET Error

_DBFactory = DbProviderFactories.GetFactory(providerName); 

producido un error al crear el controlador de sección de configuración para system.data: Columna 'invariantname' está obligado a ser único. El valor 'Oracle.DataAccess.Client' ya está presente.

con este providerName: Oracle.DataAccess.Client

Y la siguiente entrada en el 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> 

¿Alguien sabe lo que está mal? No creo que lo haya configurado dos veces en ningún lado.

+0

el mismo problema y resolución http://stackoverflow.com/questions/4225908/error-when-adding-a-configuration-to-app-config-file –

Respuesta

6

Si instaló ODP.net (por ejemplo, utilizando el instalador universal de Oracle, a diferencia de xcopy), encontrará los mismos DbProviderFactories/add en machine.config.

Así que agregarlo en su web.config lo está agregando por segunda vez, entonces, ¡duplique Oracle.DataAccess.Client!

+0

Entonces, ¿qué lugar es el "correcto"? – ThatAintWorking

+1

Este problema también puede ocurrir si ha instalado ODP.net antes de instalar la versión de .NET que está utilizando, en mi caso .NET4. –

+0

@FredrikC: Gracias por su comentario, ¿hay algún comando para volver a registrarlo –

5

¿Puedes hacer lo siguiente? (Tenga en cuenta el "claro")

<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

Cabe señalar que <clear /> borrará todos los DbProviderFactories que puede que no desee hacer, dependiendo de su situación.

También puedes, simplemente quitar ese derecho de clase antes de volver a añadirlo al añadir esta línea:

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

Así es como todo el <system.data> se vería:

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

Esto puede ser es útil si los entornos de máquina y servidor locales no tienen archivos de configuración coincidentes, como machine.config.

La otra cosa que podría hacer es simplemente eliminarlo de su web.config todos juntos suponiendo que la configuración en su machine.config funcionará. Sin embargo, probaría esto tanto en su máquina de desarrollo como en sus servidores. En mi caso, funcionó en uno pero no en el otro porque los archivos machine.config no coincidían. Para resolver, añadí este mismo ajuste a la machine.config en el servidor sin la <remove invariant="Oracle.ManagedDataAccess.Client" /> así:

<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

Lo más probable es la sección DbProviderFactories de archivos de configuración de la máquina se estrelló. Compruebe si hay una línea Oracle.DataAccess.Client adicional, que aún permanece después de desinstalar el cliente de Oracle.

Cuestiones relacionadas