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

157

Я пытаюсь использовать 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
EverTheLearner
источник

Ответы:

91

Я рассмотрел эту проблему дальше, и вам просто нужно взять все соответствующие библиотеки 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 #
Крис
источник
4
Ваше решение сработало для меня - нашел ваше сообщение в блоге, прежде чем я нашел это. Ты человек. Спасибо! :-) Кроме того, используя последнюю версию ODAC, мне не нужно было разархивировать ни один из JAR-файлов ... .dll файлы были расположены в разных каталогах в моем доме оракула. Простой поиск окон обнаружил их очень быстро.
Пандинкус
10
Кроме того, я использовал последнюю версию ODAC (11.2.0.1.2) на моей машине для разработки, и мне были нужны только файлы oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Как указывает Крис, УБЕДИТЕСЬ, ЧТО ОНИ В ТО ЖЕ САМОЙ ПАПКЕ, КАК ВАШ ВЫПОЛНЯЕМЫ. ;-)
Pandincus
1
Похоже, что более новая версия облегчает поиск DLL. Большой! Теперь, сколько времени до того, как оракул свернет их в одну простую длл ...
Крис
Стратегия Криса и библиотека Пандинкуса сработали для меня. Я звоню клиенту oracle через PowerShell, поэтому помещаю набор библиотек в каталог исполняемых файлов PowerShell.
Quillbreaker
1
Возможно, вам стоит использовать драйвер C #, если сможете :)
Chris
47

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

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

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

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

  • Во-первых, мы предлагаем отличное сравнение кода между управляемым и неуправляемым : http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
  • Убедитесь, что вы загрузили только версию ODP.NET, Managed Driver Xcopy
  • Из скачанного zip-файла скопируйте и вставьте в каталог вашего проекта:
    • Oracle.ManagedDataAccessDTC.dll
    • Oracle.ManagedDataAccess.dll
  • Добавить ссылку на Oracle.ManagedDataAccess.dll
  • Убедитесь, что ваш exe выпущен (добавлен в папку приложений в VS2010) с обоими DLL
Тод Томсон
источник
3
Хорошая новость в том, что у Oracle наконец-то появился полностью управляемый драйвер. Тащить около 100 МБ DLL было настоящим бременем.
Джафин
1
Управляемый драйвер отлично работает для меня - у меня не было никаких проблем с тех пор, как я перешел на него / вы можете настроить свои проекты на AnyCPU и т. д., и он отлично работает :)
Тод Томсон,
5
Точно так же, как все знают, хотя управляемый поставщик хорош, ему не хватает многих функций, которые позволяет полный поставщик. А именно, в Oracle встроено шифрование.
Джастин Скилз
1
Документация Oracle, как правило, «разбросана», если не сказать больше. Вот хорошая ссылка на некоторые неподдерживаемые методы . Кроме того, сам драйвер поставляется с readmeопределенными ограничениями.
Джастин Скилз
2
Использование управляемого драйвера является окончательным решением! я каждый день болтаю, думаю, все время, проведенное, когда у меня было несоответствие типов
ettore ct
35

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

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

EverTheLearner
источник
3
Можете ли вы просто скопировать 4 мгновенных клиентских DLL-файла в ту же папку, где находится ваш EXE-файл, вместо установки клиента? (эти файлы: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Крис
2
@ Крис: Да, вы можете. По моему опыту, хотя, вам нужно oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll и oracle.dataaccess.dll
Pakman
Для меня наоборот - я бы установил клиент, а не провайдера
Ев.
33

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

Даниил
источник
Просто столкнулся с этим. Работал в (32-битном) тестовом приложении, затем перестал работать в IIS. Вместо того, чтобы требовать, чтобы все используемые сборки были 32-битными, я перешел на 32-битный AppPool.
anton.burger
22

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

Сообщение об ошибке «Поставщик несовместим с версией клиента 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 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 Managed Driver )

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

Вернфрид Домшайт
источник
Это ИМО имеет больше знаний, чтобы забрать, чем фактический ответ. Итак, если у меня есть приложение x86 для .net 4, а версия базы данных - 9i, то какая версия клиента понадобится пользователю, если у него 32- или 64-разрядная версия Windows? Oracle говорит, что любая версия клиента совместима с любой версией БД. Является ли ответ 32-разрядными пользователями установкой 32-разрядной версии, а 64-разрядным пользователям - установкой 64-разрядной версии и использованием управляемого драйвера ODP.NET для определения, с какой ОС идет речь?
Световой
1
Когда вы используете управляемый драйвер ODP.NET, устанавливать клиент Oracle не требуется - это его главное преимущество. Работает как с приложениями x86, так и с x64. Без «Управляемого драйвера ODP.NET» приложению x86 также требуется клиент Oracle x86 (т.е. 32-разрядный), независимо от архитектуры сервера баз данных.
Вернфрид Домшайт
Я только что натолкнулся на «Распространяемый Microsoft Visual C ++ 2010 должен быть установлен» - вы должны добавить это в свое резюме.
Джей Салливан
1
Я не думаю, что эта ошибка связана или вызвана Oracle или ODP.NET
Wernfried Domscheit
Это работает для меня, я устанавливаю 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) ЗДЕСЬ, тогда проблема решена!
Ян Ян Цзянь
6

После нескольких часов устранения неполадок я обнаружил, что эта проблема вызвана наличием 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>
psaxton
источник
Спасибо! Ваше решение дает мне представление о том, что работать через 2 дня (у меня Visual Studio 2010 Net 4, клиент Oracle 10g) ... Я вижу GAC и, конечно, я установил 3 версии Oracle.DataAccess.dll, я удалил все (и удалите недопустимые ключи machine.config в «DbProviderFactories») и переустановите только ODAC1120320 x64. И это работает.
Эрнальдо Гонсалес,
5

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

HainKurt
источник
5

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

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

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

Питер Мейер
источник
2

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


источник
2

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

Hydtechie
источник
2

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

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

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

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

  3. Выполняя поиск в Google, я обнаружил, что это происходит, потому что я использовал ODP.NET64 бит. Затем я взял ODP.NET32-разрядную версию Windows и установил ее, но продолжал получать одно и то же сообщение об ошибке.

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

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

Лениэль Маккаферри
источник
2

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

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 # сделал это!

Дабор
источник
1
Чувак .... Оракул .... мы можем немного поговорить? Иди сюда, в угол. Слушай, чувак, я потратил весь день на выяснение того, что, черт возьми, «несовместимый провайдер» должен был означать, только чтобы потом выяснить, что это потому, что некоторая зависимость от установки не была соблюдена. Пожалуйста - нет - я требую, чтобы вы установили ваш установщик, чтобы проверить эти зависимости во время установки, и предупредить пользователя, если он не встречается. Спасибо.
Джей Салливан
3
Кстати, мне неоднократно приходилось возвращаться к этому вопросу о стековом потоке, и каждый раз для меня применялся другой ответ. Какая трата времени и денег это вызвало.
Джей Салливан
2

Версия TLDR:

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

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

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

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

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

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

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

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 Client на этом компьютере слишком старая. Но это вступает в игру, если на компьютере установлено более одного клиента, и неуправляемые файлы были обнаружены первыми в другой, но более старой установке. Если позже, самое простое - использовать переменную конфигурации 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, но я думаю, что это менее вероятный senario. См. Процесс разрешения сборки для получения дополнительной информации.

b_levitt
источник
1

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

DCookie
источник
1

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

doekman
источник
1

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

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

удачи.

Мажар Аббас
источник
@ mazhar-abbas, не могли бы вы, пожалуйста. укажите, в каком я могу установить «Включить 32-битное приложение»? Это в IIS или Project?
hiFI
1

Я не пошел по пути получения новых 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> 
Robotron
источник
2
Это действительно плохая идея - добавить ссылку на dll в папку bin.
Джей Салливан
1
binИ objпапки вывода папки; это то место, где идут dll, когда вы строите свой проект. Вы должны иметь возможность удалить эти папки в любое время, не создавая конфликтов. Обычно эти папки игнорируются в системе контроля версий. Стандартная практика состоит в том, чтобы создать External Referencesпапку, в которую вы помещаете свои ссылочные библиотеки.
Джей Салливан
@ notfed Кажется, ты прав. Буду держать это в уме.
Роботрон
Как указано, это только путь подсказки для компилятора, а не принудительная ссылка. Сначала в GAC выполняется поиск Oracle.DataAccess.dll. Это должно работать, даже если вы удалите HintPathполностью.
Вернфрид Домшайт
1

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

Дэвид Спенард
источник
1

Я столкнулся с подобной проблемой, и основной причиной было то, что 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.

p4ulinux
источник
0

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

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

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

DiligentKarma
источник
Обратите внимание, C:\Windows\assembliesпросто показывает сборки до .NET Framework версии 2.0. Версии 3.x / 4.x не отображаются, см stackoverflow.com/questions/28213105/...
Wernfried Домшайт
0

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

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-битную и надейтесь на лучшее.

Кэмерон Кастильо
источник
3
Это на самом деле .NETish, а не Oraclish
Джей Салливан
0

У меня была такая же проблема с 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. Как только разрешения были унаследованы от родительского каталога к этим дочерним подкаталогам, все начало работать.

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

Грег З.
источник
-3

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

  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. ВАРИАНТ B: Если вы загрузили 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 # работает для меня без какой-либо конфигурации на стороне сервера (только установка по умолчанию):
использование Oracle.DataAccess.Client;
или
использование Oracle.ManagedDataAccess.Client;

....

string oradb = "Источник данных = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED)));"
    + "Идентификатор пользователя = SYSTEM; Пароль = xxx;";

использование (OracleConnection conn = новый OracleConnection (oradb)) 
{
    conn.Open ();
    использование (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "выбрать TABLESPACE_NAME из DBA_DATA_FILES";

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