Вопрос

Я пытаюсь использовать 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
Это было полезно?

Решение 3

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

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

Другие советы

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

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

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

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

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

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

Подведем некий итог:

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

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

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

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

  • Версия ODP.NET не соответствует установленной версии клиента Oracle.Вы должны проверить даже дополнительный номер версии!Например, Oracle.DataAccess.dll Версия 4.112.3.0 несовместим с Oracle Client 11.2.0.4.Внимательно проверьте версии ODP.NET и Oracle Client.Вы можете использовать проверка подписи на 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 может быть загружен из ПКК который по умолчанию имеет приоритет над любым локально предоставленным файлом.

Решения

  • Рассмотрите возможность использования управляемого драйвера 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.Распакуйте архив и скопируйте только 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.

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

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

<Ол>
  • oci.dll
  • OraOps11w.dll
  • oraociicus11.dll (довольно большой, около 30 МБ)
  • Oracle.DataAccess.dll
  • Потратив на это три часа, моя проблема заключалась в следующем:

    Отсутствует 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: emp».
    • Очистите корзину.

    У Криса меньше DLL, чем у меня на сервере 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

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

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

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

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

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

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

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

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

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

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

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

    http: //oradim.blogspot. ком / 2009/09 / odpnet-провайдер-это-не-совместимая-with.html

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

    http://www.microsoft.com/en- нас / скачать / details.aspx? ID = 13523

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

    Версия TLDR:

    • Используйте 12с 100% управляемый провайдер вместо.
    • Если вам необходимо использовать старый поставщик, вам необходимо указать Oracle.DataAccess.dll на неуправляемые библиотеки Oracle Client Dll правильной версии.Если на вашем компьютере установлено несколько клиентов 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) на основе следующего порядка:

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

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

    3. Параметр DllPath, указанный в файле Machine.config.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Итак, что я сделал:

    <Ол>
  • Скопировал Internal.dll из одного из успешно запущенных проектов на мой веб-сайт /bin (просто на всякий случай).
  • Скопировал Oracle.DataAccess.dll из одного из успешно запущенных проектов на мой веб-сайт myWebSite.csproj.
  • Добавьте ссылку на них обоих с моего веб-сайта.
  • Наконец-то ссылка на Oracle.DataAccess появилась в <=>, но показала неверную версию: <=> вместо <=>.
  • Я вручную изменил ссылку в <=>, так что теперь она читается:

    <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> 
    
  • Я столкнулся с этой проблемой после того, как установил Oracle Data Tools для Visual Studio 2015, а затем боролся с Oracle в течение часа. Я решил попробовать переустановить клиент Oracle снова вместо того, чтобы возиться с копированием файлов, изменениями конфигурации и т. Д., И это сработало для меня.

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

    Как проверить версию установленного ODAC: посмотрите в папке C: \ Windows \ Assembly. & Quot; Процессорная архитектура & Quot; свойство сообщит платформе установленный ODAC.

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

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

    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-битные машины. Просто измените целевую платформу в свойствах проекта на 64-разрядную и надейтесь на лучшее.

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

    В моем случае (после двух дней попыток) я обнаружил, что проблема заключалась в разрешениях для 64-битной домашней версии. Множество каталогов в этой версии были переопределены исключительно разрешения, где роль «Прошедшие проверку» не имела доступа «Чтение», который установлен по умолчанию для родительского каталога.Эти подкаталоги включали «bin», «network/admin», «nls», «oracore», «RDBMS» и, возможно, другие.Я нашел их, отфильтровав результат «ДОСТУП ЗАПРЕЩЕН» в утилите «Монитор процессов» (Procmon.exe) из sysinternals.Как только разрешения были унаследованы от родительского каталога до дочерних подкаталогов, все начало работать.

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

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

    http://randomdevtips.blogspot.com/2012/06/provider-is-not-совместимо-с-версией.html

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

    <Ол>
  • Я установил базу данных Oracle Express OracleXE112 , которая уже поставляется с некоторыми предварительно установленными демонстрационными таблицами.
  • При запуске установщика у вас запрашивают пароль . Я ввел & Quot; xxx & Quot; как пароль. (не используется в производстве)
  • Мой сервер работает на компьютере 192.168.1.158
  • На сервере вы должны явно разрешить доступ для процесса TNSLSNR.exe в Windows Брандмауэр . Этот процесс прослушивает порт 1521. Если вы получили ошибку тайм-аута из приведенного ниже кода, проверьте брандмауэр.
  • ВАРИАНТ 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\...
  • ВАРИАНТ 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
  • ВАРИАНТ C: . Если вам не нужны огромные библиотеки DLL размером более 100 МБ, вам следует загрузить ODP.NET_Managed12.xxxxxxxx.zip, в котором вы найдете Oracle.ManagedDataAccess.dll, который составляет всего 4 МБ и это чисто управляемая DLL, которая работает в 32-битных и 64-битных процессах, не зависит от других DLL и не требует записей в реестре.
  • Следующий код 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"]);
                }
            }
        }
    }
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top