2010-01-15 3 views
7

У меня возникла проблема с получением библиотеки ODP.NEt для работы с .NET DBProviderFactories. Я получаю следующее сообщение об ошибке с этим кодом:DbProviderFactories for .NET Ошибка

_DBFactory = DbProviderFactories.GetFactory(providerName); 

Произошла ошибка при создании раздела конфигурации обработчика для System.Data: Column «InvariantName» ограничена, чтобы быть уникальным. Значение «Oracle.DataAccess.Client» уже присутствует.

с этим ProviderName: Oracle.DataAccess.Client

И следующую запись в 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> 

Кто-нибудь знает, что это не так? Я не думаю, что у меня он был настроен дважды в любом месте.

+0

та же проблема и решение http://stackoverflow.com/questions/4225908/error-when-adding-a-configuration-to-app-config-file –

ответ

6

Если вы установили ODP.net (например, используя универсальный установщик oracle, в отличие от xcopy), вы найдете те же DbProviderFactories/add в machine.config.

Так что добавление его в ваш web.config добавляет его во второй раз - так что дубликат Oracle.DataAccess.Client!

+0

Итак, какое место является «правильным»? – ThatAintWorking

+1

Эта проблема может возникнуть, если вы установили ODP.net перед установкой используемой версии .NET, в моем случае .NET4. –

+0

@FredrikC: Спасибо за ваш комментарий, есть ли какая-либо команда, чтобы зарегистрировать его снова –

5

Вы можете сделать это внизу? (Обратите внимание, что «ясно»)

<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

Следует отметить, что <clear /> очистит все DbProviderFactories, которые вы не можете сделать, в зависимости от ситуации.

Вы также можете просто удалить этот класс права, прежде чем повторно добавить его, добавив следующую строку:

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

Вот как весь <system.data> будет выглядеть:

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

Это может быть полезно, если в вашей локальной и серверной среде нет соответствующих файлов конфигурации, таких как machine.config.

Другая вещь, которую вы могли бы сделать, это просто удалить ее из вашего web.config вместе, предполагая, что параметр в вашем machine.config будет работать. Тем не менее, я бы протестировал это как на вашей машине разработки, так и на ваших серверах. В моем случае он работал над одним, а не с другим, потому что файлы machine.config не совпадали. Для того, чтобы решить, я добавил этот же параметр в machine.config на сервере без <remove invariant="Oracle.ManagedDataAccess.Client" />, как так:

<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

Скорее всего, файл DbProviderFactories раздел машины конфигурации разбился. Проверьте, есть ли дополнительная строка Oracle.DataAccess.Client, которая по-прежнему остается после удаления клиента oracle.