Поставщик не совместим с версией клиента Oracle - PullRequest
153 голосов
/ 18 марта 2009

Я пытаюсь использовать Oracle ODP.NET 11g (11.1.0.6.20) Instant Client в моем проекте ASP.net в качестве поставщика данных , но при запуске На странице aspx появляется сообщение « Поставщик не совместим с версией клиента Oracle ». Любая помощь будет оценена.

Я ссылался на поставщик данных в Visual Studio 2005, и код выглядит следующим образом:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

Ошибка для страницы выглядит следующим образом:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Ответы [ 26 ]

2 голосов
/ 18 марта 2009

Мне может показаться, что, хотя у вас есть ODP с Oracle Istant Client, ODP может пытаться использовать реальный Oracle Client вместо этого. У вас также есть стандартный клиент Oracle? Я вспоминаю, что Oracle довольно требователен к нескольким клиентам на одной машине.

2 голосов
/ 08 декабря 2016

Версия TLDR:

  • Вместо этого используйте 12c 100% управляемого провайдера .
  • Если вам необходимо использовать старого поставщика, вам нужно указать Oracle.DataAccess.dll на неуправляемые клиентские DLL-библиотеки правильной версии. Если на вашем компьютере установлено несколько клиентов Oracle, это может быть очень просто, например, включить в конфигурацию приложения переменную конфигурации «DllPath» (см. Ниже), но вам также может потребоваться установить новый клиент Oracle для указания.

Полная версия:

Во-первых, давайте удостоверимся, что мы понимаем компоненты старого неконтролируемого провайдера (а не нового 12с 100% управляемого провайдера). Он состоит из двух частей:

  1. управляемый компонент .net - Oracle.DataAccess.dll
  2. неуправляемый (не ..net) клиент

Проще говоря, Oracle.DataAccess.dll - это почти просто оболочка, переводящая инструкции .net в инструкции ORACLE-NET для неуправляемого клиента.

Тем не менее при загрузке Oracle.DataAccess существует порядок, в котором он пытается найти необходимые неуправляемые клиентские библиотеки. Из документации Oracle :

Oracle.DataAccess.dll ищет зависимые неуправляемые библиотеки DLL (например, как клиент Oracle) в следующем порядке:

1.Каталог приложения или исполняемого файла.

2. Параметр DllPath, указанный в конфигурации приложения или web.config.

3.DllPath, указанный в machine.config.

4.DllPath параметр, указанный в реестре Windows.

HKEY_LOCAL_MACHINE \ Software \ Oracle \ ODP.NET \ версия \ DLLPath

5.Каталоги, указанные в переменной среды Windows PATH.

Итак, в вашем случае ваше приложение выполнило описанный выше процесс и обнаружило путь, в котором есть неизолированные dll, которые слишком стары по сравнению с используемой вами сборкой Oracle.DataAccess.dll.

Возможно, единственный установленный на этом компьютере клиент Oracle слишком устарел. Но это вступает в игру, если на компьютере установлено более одного клиента, и неуправляемые файлы были обнаружены первыми в другой, но более старой установке. Если позже, самое простое - использовать переменную конфигурации dllPath в вашей конфигурации и указать ее в правильной папке Oracle Home Bin:

<configuration>
  <oracle.dataaccess.client> 
    <add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
  </oracle.dataaccess.client>
</configuration>

Если вы хотите установить новую копию клиента, xcopy версия является самой маленькой и содержит «мгновенный клиент» и указывает DllPath выше на это новое местоположение. Но любая установка клиента oracle будет работать.

Но если вы хотите избежать всего этого неуправляемого решения проблем с клиентом, посмотрите, можете ли вы обновить свое приложение, чтобы использовать вместо него 100% -ный управляемый поставщик - это действительно одна или две управляемые сборки, без какой-либо зависимости от неуправляемых файлов. 1052 *

Также возможно, что вы не загружаете Oracle.DataAccess.dll, как вы думаете, если он установлен как в каталоге bin, так и в вашем GAC, но я думаю, что это менее вероятный senario. См. процесс разрешения сборки для получения дополнительной информации.

2 голосов
/ 19 декабря 2013

Для тех, кто все еще имеет эту проблему: на основе этой статьи

http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

Я обнаружил, что на моем сервере отсутствует библиотека Microsoft C ++ Visual Runtime - она ​​была у меня на компьютере разработчика из-за установки Visual Studio. Я скачал и установил (в настоящее время) самую последнюю версию библиотеки отсюда:

http://www.microsoft.com/en-us/download/details.aspx?id=13523

Запустил установку, и оракульный вызов из C # сделал это!

2 голосов
/ 12 апреля 2011

Также ищите пул приложений IIS. Включите 32-битный флаг true или false, когда вы видите это сообщение, какой-то форум оракула указал мне на это!

2 голосов
/ 05 августа 2009

У меня была точно такая же проблема. Я удалил (и забыл, что я удалил) oraociei11.dll после компиляции приложения. И он выдавал эту ошибку при попытке выполнить. Поэтому, когда он не может найти dll, что oraociei11.dll, он показывает эту ошибку. Могут быть и другие случаи, когда выдается эта ошибка, но, похоже, это один из них.

1 голос
/ 19 марта 2013

У меня та же проблема, но в моем случае я не могу просто скопировать dll-файлы в папку bin, тогда я только «перепривязываю» версию сборки.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
1 голос
/ 10 ноября 2011

У нас была такая же проблема, потому что сборка Oracle.Data.dll на сетевом ресурсе была обновлена ​​нашими администраторами баз данных. Удаление ссылки из проекта и добавление ее снова решило проблему.

1 голос
/ 03 мая 2013

Всего два шага, чтобы решить эту проблему.

  1. перейдите к расширенной настройке пула приложений и установите для флага «Включить 32-битное приложение» значение True.
  2. Убедитесь, что все Dll в вашей корзине 32-битная версия ...

удачи.

1 голос
/ 18 марта 2009

Имеет ли пользователь IIS / IWAM разрешения на каталог Oracle? Можно ли подключиться к этому источнику данных с помощью другого приложения, такого как Excel или Access?

1 голос
/ 02 декабря 2016

Я столкнулся с этой проблемой после того, как установил Oracle Data Tools для Visual Studio 2015, а затем боролся с Oracle в течение хорошего часа. Я решил попробовать переустановить клиент Oracle снова вместо этого беспорядка с копированием файлов, изменениями конфигурации и т. Д., И это сработало для меня.

...