Установка ODP.net на сервер для разрешения Oracle.DataAccess.Client.OracleException: поставщик несовместим с версией клиента Oracle.

У меня есть тестовая среда для службы, которую будет использовать мой сайт, и производственная среда. В моей тестовой среде на сервере установлен ODP.net. Эта служба, использующая Oracle, пока работает довольно гладко. У меня вообще не работает клиент Oracle на этом сервере. С другой стороны, у меня есть сервер, на котором установлен клиент Oracle, но, похоже, на нем не установлен ODP.net (я нахожусь в процессе двойной проверки, но это ситуация на этот вопрос SO) . На рабочем сервере я получаю это исключение:

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

на обоих серверах у меня есть dll Oracle.DataAccess в папках bin и lib (не думаю, что она мне нужна в папке lib, но зачем раскачивать лодку... Я уверен, что вы можете придумать вескую причину, но не сейчас!!!). Мой вопрос: нужно ли мне устанавливать ODP.net на производственный сервер? Это решило какие-либо проблемы, с которыми вы столкнулись? Я видел сообщение SO, в котором говорится, что это решило для них аналогичную проблему. Не могли бы вы порекомендовать порядок действий? Спасибо!


person SoftwareSavant    schedule 29.11.2011    source источник


Ответы (5)


Существует множество небольших подверсий клиента оракула, и, вероятно, клиенты оракула, установленные на машине, выдающие ошибку, не являются точно той же версией, из которой был получен файл Oracle.DataAccess.dll.

Лучше всего убедиться, что вы используете точно один и тот же установочный пакет на каждом компьютере и сервере разработки. Это позволит избежать любого несоответствия.

В качестве альтернативы, то, что я делал в прошлом, чтобы решить эту проблему (и это может быть не «лучшее» решение, но обычно оно работает для меня), заключалось в том, чтобы также скопировать файл OraOps11.dll в ваш каталог \bin вместе с файлом Oracle.DataAccess.dll.

Получите файл из той же установки оракула на той же машине, где вы получили Oracle.DataAccess.dll. Он должен находиться в папке с примерно таким названием, в зависимости от того, где вы установили Oracle и какой версии:

C:\oracle\product\11.1.0\client_1\bin\OraOps11.dll

person CodingWithSpike    schedule 29.11.2011
comment
Что такое OraOps11.dll и для чего он нужен? И это будет в корзине моего приложения, верно? - person SoftwareSavant; 29.11.2011
comment
Кстати, последняя версия, которую я использую, была изменена 9 ноября 2010 г., 1:48. Так что я уверен, что это одна и та же версия. Они оба являются 64-битной версией. - person SoftwareSavant; 29.11.2011
comment
Я не совсем уверен, что делает OraOps11.dll, но да, я копирую его в любую папку, в которой находится .exe или .dll моего приложения. - person CodingWithSpike; 30.11.2011
comment
У меня сработало ... не знаю, зачем нужна OraOps11w.dll, но с ней это сработало. спасибо - person Pascal; 01.02.2013
comment
Я не могу поверить, что размер оракулов компании производит такие плохие продукты. Серьезно, каждый раз, когда мне требуется обновить какую-либо из их dll или версию, это как на полпути к самоубийству. Почему им так сложно правильно управлять своими версиями?! - person YavgenyP; 06.02.2013
comment
Это решение также работает для версии 12.1.2 (4.121.2.0) Oracle.DataAccess. Только в этом случае имя копируемой DLL — OraOps12.dll. - person Greg Z.; 08.10.2015
comment
@YavgenyP это из-за небрежной среды JAVA. Однажды мне сказали, что JAVA похожа на прибивание желе к дереву. Это яркий пример того, почему я потратил так много времени на устранение этих мелких проблем с Oracle/JAVA. - person JoshYates1980; 19.05.2016

Это сработало для меня, как только я их запустил:

OraProvCfg /action:config /product:odp /frameworkversion:v2.0.50727 /providerpath:C:\app\Administrator\product\11.2.0\client_1\ODP.NET\bin\2.x\Oracle.DataAccess.dll

OraProvCfg /action:config /product:odp /frameworkversion:v4.0.30319 /providerpath:C:\app\Administrator\product\11.2.0\client_1\ODP.NET\bin\4\Oracle.DataAccess.dll

Удачи

person Elie    schedule 31.10.2012

Я столкнулся с точно такой же проблемой, я пытался скопировать как можно больше dll, но безуспешно.

В конце концов мне пришлось установить «ODTwithODAC121012» (32-разрядная версия) на сервер (Win 2008 R2 64-разрядная версия).

После установки убедитесь:

  • PATH обновляется с указанием местоположения DLL Oracle: \product\12.1.0\client_1\bin и \product\12.1.0\client_1
  • Перезапустите сервер.
  • Включите 32-разрядную версию для пула приложений в IIS.
person Abdallah    schedule 19.07.2014

Я столкнулся с той же проблемой на сервере Windows 2012, на котором я установил Oracle 10.2.0.3 (предполагаемая версия оракула 10.2, совместимая с 64-битной версией), и развернул веб-сайт, который использовал клиент Oracle 10.2.0.1.

Я перепробовал все решения в этом посте, но тот, который сработал, был последним пунктом ответа Абдаллы:

"Включить 32-разрядную версию для пула приложений в IIS"

Конечно, мне также пришлось развернуть свое веб-приложение с правильной ссылкой на Oracle.Data.Access (10.2.0.3).

Наконец, сообщение об ошибке сбило меня с толку, потому что заставило меня ослепнуть, чтобы решить проблему с версией, но настоящая проблема заключалась в том, что IIS не мог выполнять 32-битное приложение.

Надеюсь, поможет

person Fernando    schedule 16.03.2015

Спасибо... это помогло мне сэкономить время при преобразовании 32-разрядной версии в 64-разрядную версию нашего приложения ASP.Net...

В деталях: сервер APP ищет клиентские библиотеки, даже мы используем компонент удаленного взаимодействия для подключения к ORACLE db... с 64-разрядным клиентом ORACLE.

Исключение, которое я получил, было разрешено после копирования этих 5 dll в мою папку app/bin.

  1. oci.dll
  2. oraociicu11.dll
  3. oraops11w.dll
  4. orannzsbb11.dll
  5. ociw32.dll

Сообщение об ошибке: Инициализатор типа для «Oracle.DataAccess.Types.OracleString» вызвал исключение.

Сведения об ошибке: System.TypeInitializationException: инициализатор типа для «Oracle.DataAccess.Types.OracleString» вызвал исключение. ---> Oracle.DataAccess.Client.OracleException Поставщик несовместим с версией клиента Oracle в Oracle.DataAccess.Client.OracleInit.Initialize() --- Конец внутренней трассировки стека исключений ---

Трассировка стека сервера: в System.Runtime.Serialization.FormatterServices.nativeGetUninitializedObject(тип RuntimeType) в System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObject(ParseRecord pr) в System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseMember (ParseRecord pr) в System.Runtime.Serialization.Formatters.Binary._BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) в System.Runtime.Serialization.Formatters.Binary._BinaryParser.Run() в System.Runtime .Serialization.Formatters.Binary.ObjectReader.Deserialize (обработчик HeaderHandler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (поток сериализацииStream, обработчик HeaderHandler fCh, логический fCheck). Логическое значение isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binar y.BinaryFormatter.Deserialize (поток сериализацииStream, обработчик HeaderHandler, логическое значение fCheck, метод IMethodCallMessageCallMessage) в System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage (сообщение IMessage)

Исключение повторно сгенерировано в [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, тип Int32)

person Kishore    schedule 18.07.2012