Провайдер несовместим с версией клиента Oracle.

Я пытаюсь использовать мгновенный клиент Oracle ODP.NET 11g (11.1.0.6.20) в моем проекте 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

person EverTheLearner    schedule 18.03.2009    source источник


Ответы (27)


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

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

  • Скачать ODP.Net
  • Разархивируйте файл
  • Разархивируйте все файлы JAR в нем.
  • Grab these dll's that were just unzipped:
    • oci.dll (renamed from 'oci.dll.dbl')
    • Oracle.DataAccess.dll
    • oraociicus11.dll
    • OraOps11w.dll
    • orannzsbb11.dll
    • oraocci11.dll
    • ociw32.dll (переименован в ociw32.dll.dbl)
  • Поместите все библиотеки DLL в ту же папку, что и исполняемый файл C #.
person Chris    schedule 11.08.2009
comment
Ваше решение сработало для меня - нашел ваше сообщение в блоге до того, как нашел это. Ты человек. Спасибо! :-) Кроме того, используя последнюю версию ODAC, мне не нужно было распаковывать какие-либо JAR-файлы ... файлы .dll находились в разных каталогах в моем доме оракула. Простой поиск в Windows очень быстро нашел их. - person Pandincus; 28.12.2010
comment
Кроме того, я использовал последнюю версию ODAC (11.2.0.1.2) на своей машине для разработки, и единственными необходимыми мне файлами были: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Как указывает Крис, УБЕДИТЕСЬ, ЧТО ОНИ В ОДНОЙ ПАПКЕ, КАК ВАШЕ ИСПОЛНИТЕЛЬНОЕ. ;-) - person Pandincus; 28.12.2010
comment
Похоже, что более новая версия упрощает поиск dll. Здорово! А теперь, как скоро Oracle свернет их в одну простую dll ... - person Chris; 05.01.2011
comment
У меня сработал набор стратегий Криса и библиотеки Пандинкуса. Я вызываю клиент oracle через PowerShell, поэтому я помещаю набор библиотек в исполняемый каталог PowerShell. - person quillbreaker; 03.08.2011
comment
Я не мог заставить это работать с Oracle.DataAccess.dll для .net framework 4, только для одного для .net framework 2. Кто-нибудь нашел, какие файлы необходимы для версии .Net 4? - person olorin; 10.10.2011
comment
Отлично; это сработало и для меня! Обратите внимание, что самая последняя загрузка содержит библиотеки DLL напрямую. - person Aasmund Eldhuset; 16.12.2011
comment
Благодарность! сэкономили мне много времени, заставив мое приложение легко работать на других компьютерах, на которых не был установлен клиент - person user12345613; 17.05.2012
comment
Работает даже для .NET 4 (с использованием комментария Pandincus и ODAC 11.2.0.3.0 XCopy ver). В случае возникновения ошибки Невозможно определить имя провайдера для подключения типа Oracle.DataAccess.Client.OracleConnection. просто убедитесь, что ваш app.config (или web.config) содержит: ‹system.data› ‹DbProviderFactories› ‹add name = Local Oracle Data Provider for .NET invariant = Local.Oracle.DataAccess.Client description = Oracle Data Provider for .NET type = Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess / ›‹/DbProviderFactories›‹ /system.data › - person Alec; 05.09.2012
comment
@Pandincus: предложите заменить oraociei11.dll (124 МБ) на облегченную версию oraociicus11.dll (34 МБ) также работает. - person Nigel Touch; 28.11.2012
comment
Загрузите версию ODP.NET для Xcopy, чтобы упростить этот процесс. Это несколько DLL и несколько командных файлов для их копирования, обновления GAC и некоторых обновлений реестра. Вы можете встроить его в свою установку. - person Christian Shay; 19.03.2014
comment
скопировал все файлы из моего локального клиентского каталога oracle в каталог bin моего веб-сайта aspx и сделал ссылку на скопированную Oracle.DataAccess.dll - ›ошибка исчезла и работает :) Спасибо за сообщение! - person Kᴀτᴢ; 27.02.2015
comment
Если ваша системная переменная ORACLE_HOME и TNSNAME верны, у меня это работает. - person Davut Gürbüz; 22.07.2017
comment
В наши дни вам, вероятно, следует использовать управляемый драйвер C #, если вы можете :) - person Chris; 10.10.2017
comment
Это решение может не сработать, если у вашего клиента установлен (нормальный) клиент Oracle, поскольку Oracle.DataAccess.dll установлен в GAC. В таком случае Oracle.DataAccess.dll берется из GAC (который имеет приоритет над папкой вашего .exe), но другие DLL берутся из папки вашего .exe. Это может вызвать ошибку несовместимости версии. - person Wernfried Domscheit; 14.12.2017

Вам следует для начала «проигнорировать» все разговоры о 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 (о времени Oracle).

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

введите описание изображения здесь

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

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

  • Во-первых, вот отличное сравнение кода управляемого и неуправляемого: http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Убедитесь, что вы загрузили ODP.NET, только версию Xcopy управляемого драйвера
  • From the downloaded zip file, copy and paste into your project directory:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Добавьте ссылку на Oracle.ManagedDataAccess.dll
  • Убедитесь, что ваш exe выпущен (добавлен в папку приложения в VS2010) с обеими DLL
person Tod Thomson    schedule 24.07.2013
comment
Хорошие новости: у Oracle наконец-то появился полностью управляемый драйвер. Таскать с собой эту 100-мегабайтную dll было настоящим бременем. - person Jafin; 24.07.2013
comment
управляемый драйвер отлично работает для меня - у меня не было проблем с тех пор, как я перешел на него / вы можете вернуть свои проекты на AnyCPU и т.д., и он отлично работает :) - person Tod Thomson; 28.11.2013
comment
Чтобы все знали, хотя управляемый провайдер хорош, ему не хватает многих функций, которые позволяет полный провайдер. А именно, встроенное шифрование Oracle. - person Justin Skiles; 28.03.2014
comment
Джастин прав, например, вам нужна дополнительная DLL, зависящая от платформы, чтобы получать некоторые виды транзакций ... Джастин, не могли бы вы подробно рассказать (или предоставить ссылку на список) того, чего не хватает в управляемом провайдере, если вы есть к этому доступ? :) - person Tod Thomson; 31.03.2014
comment
Документация Oracle, мягко говоря, разрознена. Вот хорошая ссылка на некоторые неподдерживаемые методы. Кроме того, сам драйвер имеет readme, обозначающий некоторые ограничения. - person Justin Skiles; 04.04.2014
comment
Хороший ответ, а на 11g работает? Я могу найти только версию 12c управляемого драйвера ODP.NET. - person Zenadix; 19.01.2015
comment
@Zenadix вне моей головы Я думаю, что драйвер предназначен только для версии 12 ... Но почему бы не попробовать его и посмотреть, позволит ли он по-прежнему подключаться к серверу базы данных 11g? У меня такое чувство, что таким образом все может пойти вспять. - person Tod Thomson; 20.01.2015
comment
@TodThomson Я проверил, что драйвер диспетчера ODAC 12c Release 2 (12.1.0.1.2) обратно совместим с Oracle 11g Database. Также обратите внимание, что требуется .NET Framework 4.0 или более поздняя версия. - person Zenadix; 20.01.2015
comment
Окончательное решение - использование управляемого драйвера! У меня кошмар каждый раз, когда я думаю, все время потрачено, когда у меня было несоответствие типа - person ettore ct; 19.04.2016

Я установил только Oracle Data Provider for .NET 2.0 (11.1.0.6.20) и не установил Oracle Instant Client (11.1.0.6.0).

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

person EverTheLearner    schedule 18.03.2009
comment
Можете ли вы просто скопировать четыре клиентские библиотеки DLL в ту же папку, что и ваш EXE, вместо того, чтобы устанавливать клиент? (эти файлы: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll) - person Chris; 11.08.2009
comment
@ Крис: Да, ты можешь. По моему опыту, вам нужны oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll и oracle.dataaccess.dll. - person Pakman; 15.01.2013
comment
Для меня наоборот - я установил клиента, а не провайдера. - person Ev.; 30.05.2014

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

person Daniel    schedule 29.05.2009
comment
Просто столкнулся с этим. Работал в (32-битном) тестовом приложении, потом провалился в IIS. Вместо того, чтобы требовать, чтобы все задействованные сборки были 32-битными, я перешел на 32-битный AppPool. - person anton.burger; 20.07.2011

Подведем некое резюме:

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

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

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

    Обратите внимание: при установке Oracle Data Provider> = 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 Клиент.

    Помните о другой схеме нумерации. Версия файла 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 / ODP.NET, соответственно, для 64-битного приложения требуется 64-битный клиент Oracle / 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, который по умолчанию имеет приоритет над любым локально предоставленным файлом.

Решения

  • Рассмотрите возможность использования управляемого драйвера 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 на целевой машине (например, это может быть машина вашего клиента): перейдите на страницу загрузки, упомянутую выше, и загрузите самую последнюю версию Oracle Data Access XCopy. Компоненты. Распакуйте 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 Client в другую папку, например в 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.

  • При необходимости установите для переменной среды yor 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.

person Wernfried Domscheit    schedule 20.08.2014
comment
У этой ИМО есть больше знаний, чем фактический ответ. Итак, если у меня есть приложение x86 для .net 4, а версия базы данных - 9i, то какая версия клиента потребуется пользователю, если у него 32 или 64-разрядная Windows? Oracle утверждает, что любая клиентская версия совместима с любой версией db. Будет ли ответ: 32-разрядные пользователи устанавливают 32-разрядную версию, а 64-разрядные пользователи устанавливают 64-разрядную версию и используют управляемый драйвер ODP.NET, чтобы решить, с какой ОС он обращается? - person Luminous; 12.12.2014
comment
Когда вы используете управляемый драйвер ODP.NET, не требуется устанавливать какой-либо клиент Oracle - это его главное преимущество. Он работает как с приложениями x86, так и с x64. Без управляемого драйвера ODP.NET приложение x86 требует также x86 (т. Е. 32-разрядного) клиента Oracle, независимо от архитектуры сервера базы данных. - person Wernfried Domscheit; 13.12.2014
comment
Я только что столкнулся с необходимостью установки распространяемого пакета Microsoft Visual C ++ 2010 - вы должны добавить это в свое резюме. - person Jay Sullivan; 06.02.2015
comment
Я не думаю, что эта ошибка связана или вызвана Oracle или ODP.NET - person Wernfried Domscheit; 06.02.2015
comment
У меня это работает, я устанавливаю Oracle.DataAccess.dll из пакета nuget Oracle.DataAccess.x86, а его версия Dll - 2.112.1.0, поэтому я устанавливаю Oracle Client с версией Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64) ЗДЕСЬ, тогда проблема решена! - person yu yang Jian; 30.05.2019
comment
но управляемый доступ к данным не работает для OracleBulkCopy для массовой загрузки Excel - person hud; 24.09.2019
comment
@BN, да ты прав. Однако ограничения управляемого драйвера ODP.NET здесь не обсуждаются. См. Также Различия между управляемым драйвером ODP.NET и неуправляемым драйвером и Различия в конфигурации между ODP.NET, управляемым драйвером и ODP.NET, Неуправляемый драйвер - person Wernfried Domscheit; 24.09.2019

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

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

ОБНОВИТЬ

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

<configuration>
  <oracle.dataaccess.client>
    <settings>
      <add name="DllPath" value="C:\oracle\bin"/>
      <!-- ... -->
    </settings>
  </oracle.dataaccess.client>
</configuration>
person psaxton    schedule 07.06.2013
comment
Спасибо! Ваше решение дает мне представление о том, что оно работает через 2 дня (у меня есть Visual Studio 2010 Net 4, клиент Oracle 10g) ... Я вижу GAC и, конечно же, я установил 3 версии Oracle.DataAccess.dll, я удалил все (и удалите недопустимые ключи machine.config в DbProviderFactories) и переустановите только ODAC1120320 x64. И это работает. - person Hernaldo Gonzalez; 11.08.2014

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

person HainKurt    schedule 04.02.2010

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

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (довольно большой, около 30 МБ)
  4. Oracle.DataAccess.dll
person SKG    schedule 03.03.2011
comment
Вы хотите сказать 130 МБ - person Elmue; 20.04.2017

Версия TL; DR:

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

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

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

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

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

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

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

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

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

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

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

HKEY_LOCAL_MACHINE \ Программное обеспечение \ 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% управляемый поставщик - на самом деле это всего лишь одна или две управляемые сборки без какой-либо зависимости от неуправляемых файлов.

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

person b_levitt    schedule 08.12.2016

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

person Peter Meyer    schedule 18.03.2009

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

person Community    schedule 05.08.2009

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

person Hydtechie    schedule 12.04.2011

У меня такая же проблема, но в моем случае я не могу просто скопировать библиотеки 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>
person calderonsteven    schedule 19.03.2013

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

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

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

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

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

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

person Leniel Maccaferri    schedule 31.05.2013

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

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

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

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

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

person dabor    schedule 19.12.2013
comment
Чувак .... Оракул .... можно немного обсудить? Подойди сюда, в угол. Слушай, чувак, я весь день выяснял, что, черт возьми, означает несовместимый провайдер, только для того, чтобы позже узнать, что это потому, что не была соблюдена некоторая зависимость при установке. Пожалуйста - нет - я требую, чтобы вы заставили ваш установщик проверять эти зависимости во время установки и предупреждать пользователя, если это не так. встретились. Спасибо. - person Jay Sullivan; 06.02.2015
comment
Между прочим, мне приходилось возвращаться к этому вопросу о stackoverflow несколько раз, и каждый раз ко мне применяется другой ответ. Какая это потеря времени и денег. - person Jay Sullivan; 06.02.2015

Я не пошел по пути получения новых DLL. У нас была куча существующих проектов, которые отлично работают, и только мой новый проект вызывал у меня головную боль, поэтому я решил попробовать что-нибудь еще.

В моем проекте использовалась внутренняя разработка Internal.dll, которая зависела от Oracle.DataAccess.dll v4.112.3.0. По какой-то причине при публикации Visual Studio всегда выгружала v4.121.0.0, даже если это не было явно указано ни в одном из файлов конфигурации. Вот почему я получал ошибку.

Итак, я сделал следующее:

  1. Скопировал Internal.dll из одного из успешно работающих проектов в /bin моего веб-сайта (на всякий случай).
  2. Oracle.DataAccess.dll скопировал из одного из успешно работающих проектов в /bin моего веб-сайта.
  3. Добавьте ссылку на них обоих с моего веб-сайта.
  4. Наконец, ссылка на Oracle.DataAccess появилась в myWebSite.csproj, но показала неправильную версию: v4.121.0.0 вместо v4.112.3.0.
  5. Я вручную изменил ссылку в myWebSite.csproj, теперь она гласит:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 
    
person Robotronx    schedule 15.01.2015
comment
Это действительно плохая идея добавлять ссылку на библиотеки DLL в папку bin. - person Jay Sullivan; 26.01.2015
comment
Папки bin и obj - это папки output; сюда попадают библиотеки DLL при сборке проекта. Вы должны иметь возможность удалить эти папки в любое время, не создавая конфликта. Обычно эти папки игнорируются в системе управления версиями. Стандартной практикой является создание папки External References, в которую вы помещаете свои DLL, на которые есть ссылки. - person Jay Sullivan; 27.01.2015
comment
@notfed Похоже, ты прав. Буду держать это в уме. - person Robotronx; 28.01.2015
comment
Как указано в названии, это только путь подсказки для компилятора, а не принудительная ссылка. Сначала в GAC выполняется поиск Oracle.DataAccess.dll. Он должен работать, даже если вы полностью удалите HintPath. - person Wernfried Domscheit; 01.02.2015

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

person DCookie    schedule 18.03.2009

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

person doekman    schedule 10.11.2011

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

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

удачи.

person Mazhar Abbas    schedule 03.05.2013
comment
@ mazhar-abbas, Подскажите пожалуйста. укажите, в каком я могу установить 'Включить 32-битное приложение? Это в IIS или в Project? - person hiFI; 05.09.2014

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

person David Spenard    schedule 02.12.2016

Я столкнулся с аналогичной проблемой, и основная причина заключалась в том, что у GAC было 2 версии oracle.dataaccess, то есть v4.0_4.112.2.0 и v4.0_4.112.4.0. Мое приложение имело в виду v4.0_4.112.2.0, поэтому, когда я удалил v4.0_4.112.4.0 из GAC, он работал нормально.

Путь GAC: C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ Oracle.DataAccess

Раньше:  введите описание изображения здесь

После:  введите описание изображения здесь

Чтобы удалить версию, можно просто удалить соответствующую папку из GAC.

person p4ulinux    schedule 07.01.2020

Эта проблема может возникнуть при использовании неуправляемой ссылки на Oracle, если у вас более одного клиента Oracle, или иногда, если вы ссылаетесь на другую версию
Есть два способа решить эту проблему:

  1. Первое и быстрое решение - удалить неуправляемую ссылку и использовать управляемую из NuGet. См. Это, прежде чем использовать эту опцию Различия между управляемым драйвером ODP.NET и неуправляемым драйвером

  2. Второе решение - исправить неуправляемую целевую версию проекта, как показано ниже:

  • Сначала проверьте эталонную версию проекта oracle (из ссылок на проекты / (зависимости ›сборки)› Oracle.DataAccess щелкните правой кнопкой мыши ›свойства):

     введите описание изображения здесь

     введите описание изображения здесь

Затем проверьте версию Oracle GAC

  • попал в gac из запуска (Win + R)% windir% \ Microsoft.NET \ assembly
     введите описание изображения здесь

  • Выберите платформу, которая соответствует платформе вашего проекта

     введите описание изображения здесь

  • чтобы проверить целевую платформу (щелкните правой кнопкой мыши проект ›свойства)

    введите описание изображения здесь

  • Из поиска в папке gac в Oracle.DataAccess

     введите описание изображения здесь

  • Щелкните правой кнопкой мыши Oracle.DataAccess ›свойства› подробности и проверьте версию

    < img src = "https://i.stack.imgur.com/YSvcU.png" alt = "введите описание изображения здесь" />

  • если вы заметили, что версии разные, это проблема, и чтобы ее исправить, нам нужно перенаправить версию сборки (в запускаемом проекте перейдите в файл конфигурации и добавьте раздел ниже)

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.121.2.0" />
      </dependentAssembly>
</assemblyBinding>

как это  введите описание изображения здесь

oldVersion: должно охватывать версию вашего проекта newVersion: версия GAC publicKeyToken: Из GAC

 введите описание изображения здесь

person Osama AbuSitta    schedule 21.09.2020

Недавно мне пришлось работать над более старым проектом, в котором решение и все содержащиеся в нем проекты были ориентированы на платформу x32. Я продолжал пытаться скопировать Oracle.DataAccess.dll и все другие предлагаемые файлы Oracle во все места, но каждый раз ударялся о стену. Наконец лампочка в голове загорелась (через 8 часов :)), и попросили проверить установленные сборки ODAC и их платформу. У меня уже были установлены все 64-битные (x64) клиенты ODAC, но не 32-битные (x32). Установил 32-битный ODAC и проблема исчезла.

Как проверить версию установленного ODAC: Загляните в папку C: \ Windows \ assembly. Свойство «Архитектура процессора» информирует платформу об установленном ODAC.

Восемь часов - долгое время, чтобы лампочка загорелась. Неудивительно, что на работе мне всегда приходится изнурять себя :).

person DiligentKarma    schedule 21.05.2013
comment
Обратите внимание: C:\Windows\assemblies показывает только сборки до версии .NET framework 2.0. Версии 3.x / 4.x не отображаются, см. stackoverflow.com/questions/28213105/ - person Wernfried Domscheit; 11.12.2017

Решение Криса сработало и для меня. Однако я получил следующее сообщение об ошибке, в котором говорится:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

По-видимому, на иностранном языке Oraclish это означает, что ваша программа ориентирована либо на все платформы, либо на 32-битные машины. Просто измените целевую платформу в Project Properties на 64-битную и надейтесь на лучшее.

person Cameron Castillo    schedule 29.08.2013
comment
Это на самом деле .NETish, а не Oraclish - person Jay Sullivan; 27.02.2014

У меня была такая же проблема с Oracle.DataAccess.dll v4.121.2.0. с установкой на 2 дома (32- и 64-битные версии). 32-битная версия workerd, 64-битная версия - нет.

В моем случае (после 2 дней попыток) я обнаружил, что проблема заключалась в разрешениях на 64-битную домашнюю версию. Многие каталоги в этой версии имели исключительные переопределенные разрешения, в которых роль «Прошедшие проверку» не имела доступа «Чтение», который установлен по умолчанию для родительского каталога. Эти подкаталоги включали «bin», «network / admin», «nls», «oracore», «RDBMS» и, возможно, другие. Я нашел их, отфильтровав результат «ACCESS DENIED» в утилите «Process Monitor» (Procmon.exe) от sysinternals. Как только разрешения были унаследованы от родительского каталога к этим дочерним подкаталогам, все начало работать.

Я не знал, что отменять разрешения для всего дома оракула, поэтому я делал их по одному каталогу за раз, но я думаю, если вы так не беспокоитесь о безопасности, вы можете сбросить его для всего соответствующего домашнего каталога оракула.

person Greg Z.    schedule 17.08.2015

  • На 64-битной машине скопируйте «msvcr71.dll» из C: \ Windows \ SysWOW64 в каталог bin вашего приложения.
  • На 32-разрядной машине скопируйте «msvcr71.dll» из C: \ Windows \ System32 в каталог bin вашего приложения.

http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html

person JordanBean    schedule 18.04.2013

Здесь много теоретических ответов, но вот рабочий пример с кодом, который вы можете скопировать, вставить и немедленно протестировать:

  1. Я установил базу данных Oracle Express OracleXE112, которая уже поставляется с некоторыми предустановленными демонстрационными таблицами.
  2. При запуске установщика вас просят ввести пароль. Я ввел «ххх» в качестве пароля. (в производстве не используется)
  3. Мой сервер работает на компьютере 192.168.1.158
  4. На сервере вы должны явно разрешить доступ процессу TNSLSNR.exe в брандмауэре Windows. Этот процесс прослушивает порт 1521. Если вы получаете ошибку тайм-аута из приведенного ниже кода, проверьте свой брандмауэр.
  5. ВАРИАНТ A: для C # (.NET2 или .NET4) вы можете загрузить ODAC11, из которого вам нужно добавить Oracle.DataAccess.dll в свой проект. Кроме того, эта DLL зависит от: OraOps11w.dll, oci.dll, oraociei11.dll (130 МБ!), Msvcr80.dll. Эти библиотеки DLL должны находиться в том же каталоге, что и EXE, или вы должны указать путь к DLL в: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. На 64-битных машинах напишите дополнительно в HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. ВАРИАНТ Б: если вы загрузили ODAC12, вам потребуются Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 МБ!), oraons.dll, msvcr100.dll. Путь в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. ВАРИАНТ C: Если вам не нужны огромные библиотеки DLL размером более 100 МБ, вам следует загрузить ODP.NET_Managed12.xxxxxxxx.zip, в котором вы найдете Oracle.ManagedDataAccess.dll, размер которого составляет всего 4 МБ и представляет собой полностью управляемую DLL. который также работает в 32-битных и 64-битных процессах, не зависит от других DLL и не требует каких-либо записей в реестре.
  8. Следующий код C # у меня работает без какой-либо конфигурации на стороне сервера (только установка по умолчанию):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(DESCRIPTION="
    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
    + "(CONNECT_DATA=(SERVER=DEDICATED)));"
    + "User Id=SYSTEM;Password=xxx;";

using (OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection  = conn;
        cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES";

        using (OracleDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                listBox.Items.Add(dr["TABLESPACE_NAME"]);
            }
        }
    }
}
person Elmue    schedule 20.04.2017
comment
Довольно сложно установить весь сервер базы данных Oracle, когда вам просто нужен работающий клиент. - person Wernfried Domscheit; 11.12.2017
comment
В любом случае ваш ответ плохой. Нет необходимости копировать какие-либо библиотеки DLL Oracle в каталог приложения, потому что при установке по умолчанию вы найдете их через ‰ PATH% (если вы не измените его самостоятельно). Подсказка Registy применима только для версии 4.x и работает только для 32- бит Oracle client. Однако несоответствие 32-битных и 64-битных версий является основной темой этого вопроса. - person Wernfried Domscheit; 13.12.2017
comment
Ваш комментарий показывает, что вы не читали мой ответ. Если я хочу написать приложение, которое взаимодействует с сервером Oracle, нет необходимости устанавливать что-либо из Oracle. Я просто использую вышеупомянутую DLL и распространяю ее вместе со своим приложением. Таким образом, на компьютере конечного пользователя в переменной PATH ничего не будет. Между прочим, использование переменной PATH (которая пришла из старой DOS с 1980 года) в современном программном обеспечении крайне не рекомендуется. Мой ответ рекомендует ВАРИАНТ C, который не требует никаких путей реестра и не зависит от 32 или 64 бит. Я упомянул ВАРИАНТЫ A и B только для полноты. - person Elmue; 13.12.2017
comment
Я думаю, что без правильной настройки% PATH% ваша Windows не будет работать вообще - даже в версии 10. Я упомянул в своем ответе, что неразумно вручную копировать любые DLL Oracle с вашим приложением. Я не знаю исходный код этих dll, но на стороне вашего клиента может быть больше зависимостей, которых вы не видите, например запускается языковыми настройками, наборами символов, часовым поясом и т. д. Когда я провожу трассировку с Oracle.DataAccess.dll, программа загружает всего 35 Oracle DLL! Лучше сделать обычную установку Oracle Client - если, конечно, вы не используете управляемый драйвер ODP.NET. - person Wernfried Domscheit; 13.12.2017
comment
Ты неправ. Я не говорю об Oracle.DataAccess.dll. Еще раз, поскольку вы не читаете: я говорю о ВАРИАНТЕ C. Oracle.ManagedDataAccess.dll не имеет никаких зависимостей, как я уже писал выше. Он работает на 32- и 64-битных версиях и не зависит от записей в реестре. Вместо того, чтобы публиковать свои теории, почему бы вам просто не попробовать? Создайте проект, использующий эту DLL, и запустите его в чистой установке Windows. Оно работает. Я использую это с годами. Мои клиенты протестировали его на всех версиях Windows без каких-либо проблем. Как вы видите, ваши комментарии и ваш голос "против" совершенно глупы. - person Elmue; 13.12.2017
comment
Ваш ВАРИАНТ C абсолютно хорош, но ваши ВАРИАНТЫ A и B слабые. Они могут работать только при определенных условиях. Скорее всего, они работают на вас, но не подходят для общего решения. - person Wernfried Domscheit; 13.12.2017
comment
Вы не говорите мне ничего нового. Поэтому я описал преимущества ВАРИАНТА C, который, очевидно, является рекомендуемым вариантом. Но его можно использовать только в проекте C #. Для проекта C ++ OPTION C бесполезен. Наконец, все это обсуждение показывает только то, что вы не прочитали полностью то, что я написал, или вы не поняли. Так почему вы отрицаете мой ответ, который на 100% правильный? - person Elmue; 14.12.2017
comment
Думаю, я уже упоминал о своих опасениях: (1) Установка базы данных бесполезна, т. Е. Излишне. (2) Варианты A и B работают только при определенных условиях, например, они не читают никаких NLS-настроек из реестра (для чего вам нужен файл oracle.key). Для совместимости необходимо учитывать также минорные версии. Oracle.DataAccess, Version=2.112.2.0 не работает, например, с OraOps11w.dll версией 2.112.4.0. - person Wernfried Domscheit; 14.12.2017
comment
Я зря трачу время на тебя. - person Elmue; 14.12.2017