Поставщик не совместим с версией клиента 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 ]

87 голосов
/ 11 августа 2009

Я уже больше разбираюсь в этой проблеме, и вам просто нужно взять все соответствующие библиотеки DLL из той же загруженной версии ODP.Net и поместить их в ту же папку, что и файл Exe, потому что ODP.Net суетлив о не смешивании номеров версий.

Я объяснил, как это сделать здесь: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Вот суть этого, хотя:

  • Скачать ODP.Net
  • Распаковать файл
  • Разархивируйте все банки в нем
  • Возьмите эти DLL, которые были только что распакованы:
    • oci.dll (переименован из 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (переименован из 'ociw32.dll.dbl')
  • Поместите все библиотеки DLL в одну папку с исполняемым файлом C #
45 голосов
/ 24 июля 2013

Вы должны "игнорировать" все разговоры по x86 / x64 здесь для начала и вместо этого попробовать управляемый драйвер ODP.NET (если вы используете .Net v4 +):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Управляемый Oracle ODP.net против неуправляемого драйвера

Избегайте всех «неуправляемых» библиотек DLL, какие проблемы возникают у архитектуры! : D (о времени Оракула).

Пакет NuGet (также работает для 11g):

enter image description here

Старый / ручной метод:

Для получения информации о том, как конвертировать в * управляемые библиотеки :

  • Во-первых, вот отличное сравнение кода управляемого против неуправляемого : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Убедитесь, что вы загрузили ODP.NET, только версия Xcopy для управляемого драйвера
  • Из скачанного zip-файла скопируйте и вставьте в каталог вашего проекта:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Добавить ссылку на Oracle.ManagedDataAccess.dll
  • Убедитесь, что ваш exe выпущен (добавлен в Папка приложения в VS2010) с обоими DLL
34 голосов
/ 18 марта 2009

Я только установил поставщик данных Oracle для .NET 2.0 (11.1.0.6.20) и не установил Oracle Instant Client (11.1.0.6.0) .

Я только что установил его, и ошибка исчезла!

32 голосов
/ 29 мая 2009

Это может быть вызвано запуском 64-битной среды выполнения .NET на 32-битном клиенте Oracle. Это может произойти, если на вашем сервере вы запускаете приложение, на нем 64 бит. Будет запущено приложение .NET с 64-битной средой исполнения. Вы можете установить флаг CPU вашего проекта в VS для запуска в 32-битной среде выполнения.

19 голосов
/ 20 августа 2014

Давайте сделаем какое-то резюме:

Сообщение об ошибке «Поставщик несовместим с версией клиента Oracle» может быть вызвано несколькими причинами.

  • У вас не установлен клиент Oracle. В этом случае сообщение об ошибке действительно вводит в заблуждение.

    Поставщик данных Oracle для .NET (ODP.NET, т. Е. Файл Oracle.DataAccess.dll) не включен в Oracle Instant Client, его необходимо установить отдельно (загрузить из 32-битных компонентов доступа к данным Oracle (ODAC) или Загрузки 64-битных компонентов доступа к данным Oracle (ODAC) ), либо вы должны выбрать соответствующую опцию в Oracle Universal Installer (OUI).

    Обратите внимание, что при установке провайдера данных Oracle> = 12.1, этот провайдер не будет автоматически зарегистрирован в GAC. При необходимости вы должны зарегистрировать его вручную, см. Oracle Doc 2272241.1 .

  • Версия ODP.NET не соответствует установленной версии Oracle Client. Вы должны проверить даже младший номер версии! Например, Oracle.DataAccess.dll Версия 4.112.3.0 не совместима с Oracle Client 11.2.0.4 . Внимательно проверяйте версии ODP.NET и Oracle Client. Вы можете использовать sigcheck на oraociei*.dll и / или OraOps*w.dll, чтобы получить версию Oracle Client.

    Помните о другой схеме нумерации. Версия файла 4.112.3.0 означает: .NET Framework версии 4, Oracle Release 11.2.0.3.x .

    Есть ODP.NET версии "1.x", "2.x" и "4.x". Эти цифры относятся к версиям Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 и 4.0.30319. Версия «1.x» была доступна до версии Oracle Client 11.1. Версия «4.x» была представлена ​​вместе с Oracle Client 11.2

  • Архитектура (32-битная или 64-битная) ODP.NET не соответствует архитектуре вашего приложения. 32-битное приложение работает только с 32-битным Oracle Client / ODP.NET, соответственно, для 64-битного приложения требуется 64-битный Oracle Client / ODP.NET. (Если вы не используете Управляемый драйвер ODP.NET )

  • Версия .NET Framework не совпадает. Например, если вы компилируете свое приложение с помощью Target .NET Framework 2.0, вы не сможете использовать ODP.NET версии 4.x. Целевая версия .NET Framework должна быть равна или выше, чем версия ODP.NET.

  • Версия Oracle.DataAccess.dll на вашем компьютере разработчика (т.е. версия, которая загружается во время компиляции) выше, чем версия на целевом компьютере.

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

* Решения 1068 *

  • Рекомендуется использовать управляемый драйвер ODP.NET, его можно загрузить со страницы Oracle: 64-битные загрузки компонентов доступа к данным Oracle (ODAC) . Там вам нужно только скопировать файл Oracle.ManagedDataAccess.dll в каталог приложения, больше ничего не требуется. Он работает как для 32-битных, так и для 64-битных.

  • В вашем *.csproj, соотв. *.vbproj отредактируйте ссылку на ODP.NET следующим образом:

    <Reference Include="Oracle.DataAccess">
      <SpecificVersion>False</SpecificVersion>
      <Private>False</Private>
    </Reference>
    

    Такие атрибуты, как Version=... или processorArchitecture=... не обязательны. Ваше приложение будет загружать правильные Oracle.DataAccess.dll в зависимости от выбранной архитектуры и целевой платформы .NET (при условии, что оно установлено правильно) -> не проверено на 100%

  • Если вы не знаете версию Oracle Client на целевом компьютере (например, это может быть машина вашего клиента): перейдите на страницу загрузки, упомянутую выше, и загрузите наименьшее XCopy версия компонентов доступа к данным Oracle. Извлеките zip и скопируйте только файл Oracle.DataAccess.dll на свой локальный компьютер. В вашем проекте VS сделайте ссылку на эту (скорее всего, устаревшую) DLL. Версия этой DLL является наименьшей версией ODP.NET, с которой будет работать ваше приложение. При запуске приложения политика издателя в GAC будет перенаправлена ​​на фактически установленную версию.

  • Я не думаю, что это разумный подход - брать отдельные библиотеки DLL и копировать их в определенные папки. Он может работать на «голой» машине, но если на вашей целевой машине установлены какие-либо продукты Oracle, существует высокий риск несоответствия версий. Удалите все продукты Oracle со своего компьютера и выполните новую установку. Взгляните на Как удалить / полностью удалить Oracle 11g (клиент)? чтобы получить действительно чистую машину.

  • Если вам нужно работать с 32-битными и 64-битными приложениями одновременно, следуйте этой инструкции для установки обеих версий на одном компьютере:

Допущения: Oracle Home называется OraClient11g_home1, версия клиента - 11gR2.

  • При желании можно удалить любой установленный клиент Oracle

  • Загрузите и установите клиент Oracle x86, например, в C:\Oracle\11.2\Client_x86

  • Загрузите и установите клиент Oracle x64 в другую папку, например C:\Oracle\11.2\Client_x64

  • Откройте инструмент командной строки, перейдите в папку% WINDIR% \ System32, обычно C:\Windows\System32 и создайте символическую ссылку ora112 на папку C:\Oracle\11.2\Client_x64 (см. Ниже)

  • Перейдите в папку% WINDIR% \ SysWOW64, обычно C:\Windows\SysWOW64 и создайте символическую ссылку ora112 на папку C:\Oracle\11.2\Client_x86, (см. Ниже)

  • Измените переменную среды PATH, замените все записи, такие как C:\Oracle\11.2\Client_x86 и C:\Oracle\11.2\Client_x64, на C:\Windows\System32\ora112, соответствующие их подпапке \bin. Примечание: C:\Windows\SysWOW64\ora112 не должно быть в среде PATH.

  • При необходимости установите для переменной среды ORACLE_HOME значение C:\Windows\System32\ora112

  • Откройте редактор реестра. Установить значение реестра HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME в C:\Windows\System32\ora112

  • Установить значение реестра HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME в C:\Windows\System32\ora112 (не C:\Windows\SysWOW64\ora112)

  • Вы сделали! Теперь вы можете использовать клиент Oracle x86 и x64 без проблем, то есть приложение x86 загрузит библиотеки x86, приложение x64 загрузит библиотеки x64 без каких-либо дополнительных изменений в вашей системе.

Команды для создания символических ссылок:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

Некоторые заметки:

  • Обе символические ссылки должны иметь одинаковое имя, например ora112.

  • Если впоследствии вы захотите установить ODP.NET вручную, позаботьтесь о том, чтобы выбрать соответствующие папки для установки.

  • Несмотря на их имена, папка C:\Windows\System32 содержит библиотеки x64, тогда как C:\Windows\SysWOW64 содержит библиотеки x86 (32-разрядные). Не смущайтесь.

  • Возможно, разумно установить общую переменную окружения TNS_ADMIN (соответственно TNS_ADMIN записей в реестре), например TNS_ADMIN=C:\Oracle\Common\network.

5 голосов
/ 03 марта 2011

Для Oracle 11g (11.1.0.7.20) мне пришлось добавить следующие dll вместе с моим Exe для работы.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (довольно большой, близкий к 30 Мб)
  4. Oracle.DataAccess.dll
5 голосов
/ 04 февраля 2010

установите ODP.Net на целевой машине, и это должно решить проблему ... копирование DLL не выглядит хорошей идеей ...

4 голосов
/ 22 октября 2012

После трех часов, потраченных на это, моя проблема была просто:

Отсутствует OraOps11w.dll

Почему это должно генерировать сообщение об ошибке «Поставщик не совместим с версией клиента Oracle»? Это должно быть плохое кодирование / тестирование Oracle. Я использую Oracle с 1994 года и много раз с .Net с 2002 года. Это практически всегда боль.

Каждый должен удалить Oracle и следовать приведенному выше решению Криса (верхний ответ) . Это должно работать каждый раз

Из другого поста о StackOverflow вы узнаете, как удалить Oracle (забудьте об инструменте удаления Oracle, так как он работает неправильно):

  • Удалите все компоненты Oracle с помощью универсального установщика Oracle (OUI).
  • Запустите regedit.exe и удалите ключ HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE. Он содержит записи реестра для всех продуктов Oracle.
  • Удалите все ссылки на службы Oracle, оставленные в следующей части реестра: HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / Ora * Должно быть совершенно очевидно, какие из них относятся к Oracle.
  • Перезагрузите компьютер.
  • Удалите каталог "C: \ Oracle" или любой другой каталог, который является вашим ORACLE_BASE.
  • Удалите каталог «C: \ Program Files \ Oracle».
  • Очистите содержимое вашего каталога "c: \ temp".
  • Опорожните корзину.

У Криса меньше dll, чем у меня на Server 2003 (32 бита). Вот что у меня есть:

C:\oracle\instantclient>dir /b  
oci.dll  
ociw32.dll  
Oracle.DataAccess.dll  
orannzsbb11.dll  
oraocci11.dll  
oraociei11.dll  
OraOps11w.dll  
Orasqlplusic11.dll  
sqlplus.exe  
tnsnames.ora  

C: \ oracle \ instantclient находится в глобальном пути и в переменной среды ORACLE_HOME. Ссылки на код .Net C: \ oracle \ instantclient \ Oracle.DataAccess.dll

4 голосов
/ 08 июня 2013

После нескольких часов устранения неполадок я обнаружил, что эта проблема вызвана наличием Oracle.DataAccess.dll (v4.0) в каталоге bin моего проекта, но среда выполнения также загружает Oracle.DataAccess.dll (v2.x) из GAC. Удаление и чтение записи Oracle.DataAccess в ссылках проекта решило проблему для меня.

Другие файлы, упомянутые здесь, не выглядели необходимыми в моей ситуации.

UPDATE

Основной причиной ошибки «Поставщик не совместим с версией клиента Oracle» является (как правило) то, что управляемая сборка пытается загрузить неуправляемые библиотеки, которые не соответствуют версиям. Похоже, вы можете заставить драйвер Oracle использовать правильные библиотеки, указав путь к библиотеке в файле web.config 1

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
2 голосов
/ 31 мая 2013

Вот что я сделал, чтобы решить эту проблему, которая сохранялась в течение 3 долгих часов:

  1. В Oracle home, расположенном по адресу C:\oracle\product\11.2.0, у меня была папка client_1, в которую я ранее установил ODP.NET бит для Windows 64 бит.

  2. Позже, пытаясь отладить приложение ASP.NET Web API с помощью Visual Studio 2012, я получал следующее сообщение об ошибке: Поставщик не совместим с версией клиента Oracle .

  3. Поиск в Google Я обнаружил, что это происходит, потому что я использовал ODP.NET 64 бит. Затем я взял ODP.NET для Windows 32 бит и установил его, но я продолжал получать то же сообщение об ошибке.

  4. РЕШЕНИЕ: удалил папку client_1 и установил смолу ODP.NET 32 бита. В некоторой степени установщик смешивал биты из 64-битной версии с 32-битной версией. Пойди разберись ...

  5. Теперь я снова счастлив и могу открыть новый OracleConnection. В КОНЦЕ КОНЦОВ! :)

...