DbProviderFactories for .NET Ошибка

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

_DBFactory = DbProviderFactories.GetFactory(providerName);

Произошла ошибка при создании обработчика раздела конфигурации для system.data: столбец InvariantName должен быть уникальным. Значение 'Oracle.DataAccess.Client' уже присутствует.

с этим поставщиком Name: 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>

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

4 ответа

Решение

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

Поэтому добавление его в ваш файл web.config - это добавление во второй раз, поэтому дублируйте Oracle.DataAccess.Client!

Вы можете сделать ниже? (Обратите внимание на "очистить")

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

Следует отметить, что <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>

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

Другие вопросы по тегам