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

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

Ответ 1

Я установил Oracle Data Provider для .NET 2.0 (11.1.0.6.20), и я не установил Oracle Instant Client (11.1.0.6.0). > .

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

Ответ 2

Я изучал эту проблему дальше, и вам просто нужно собрать всю соответствующую 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 в ту же папку, что и ваш исполняемый файл С#

Ответ 3

Вам следует "игнорировать" все разговоры 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):

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

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

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

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

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

  • Версия Oracle.DataAccess.dll на вашем компьютере разработчика (т. 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 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 среды PATH, замените все записи, такие как C:\Oracle\11.2\Client_x86 и C:\Oracle\11.2\Client_x64 на C:\Windows\System32\ora112, в соответствии с их 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 в реестре), например TNS_ADMIN=C:\Oracle\Common\network.

Ответ 6

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

Ответ 7

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

  • oci.dll
  • OraOps11w.dll
  • oraociicus11.dll(довольно большой, около 30 мб)
  • Oracle.DataAccess.dll

Ответ 8

После нескольких часов устранения неполадок, я обнаружил, что эта проблема вызвана тем, что Oracle.DataAccess.dll(v4.0) в моем каталоге bin bin, но среда выполнения также загружает Oracle.DataAccess.dll(v2.x) из ПКК. Удаление и чтение записи 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>

Ответ 9

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

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

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

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

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

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

У Chris меньше 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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

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

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

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

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

Ответ 14

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

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

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

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

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

Ответ 15

Версия TL;DR:

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

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

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

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

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

При этом, когда вы загружаете Oracle.DataAccess, есть порядок, в котором он пытается найти неуправляемые клиентские dll, которые ему нужны. Из Документация Oracle:

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

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

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

3.DllPath, заданный machine.config.

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

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

5.Directories, заданные переменной среды 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 version является самой маленькой и содержит "мгновенный клиент" и точку DllPath выше этого нового местоположения. Но любая установка клиента oracle будет работать.

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

Ответ 19

Всего два шага для решения этой проблемы.

  • перейдите к настройке пула приложений и установите для параметра "Включить 32-битное приложение" значение "Истина".
  • Удостоверьтесь, что все Dll в вашей корзине теперь 32-битная версия...

Желаем удачи.

Ответ 20

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

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

Так что я сделал:

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

Ответ 21

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

Ответ 22

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

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

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

Ответ 23

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

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

Ответ 24

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

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

Мне не удалось переопределить разрешения на весь дом оракула, поэтому я сделал их по одному каталогу за раз, но, думаю, если вы не беспокоитесь о безопасности, вы можете reset в целом oracle home directory.

Ответ 26

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

  • Я установил базу данных Oracle Express OracleXE112, которая уже поставляется с предустановленными демонстрационными таблицами.
  • При запуске программы установки вам предлагается пароль. Я ввел "xxx" в качестве пароля. (не используется в производстве)
  • Мой сервер работает на машине 192.168.1.158
  • На сервере вы должны явно разрешить доступ к процессу TNSLSNR.exe в Windows Брандмауэре. Этот процесс прослушивает порт 1521. Если вы получите ошибку тайм-аута из приведенного ниже кода, проверьте свой брандмауэр.
  • ВАРИАНТ A:. Для С# (.NET2 или .NET4) вы можете загрузить ODAC11, из которого вы должны добавить Oracle.DataAccess.dll в свой проект. Кроме того, эта DLL зависит от: OraOps11w.dll, oci.dll, oraociei11.dll(130MB!), 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(160MB!), oraons.dll, msvcr100.dll. Путь реестра HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  • OPTION C: Если вам не нужна огромная DLL более 100 МБ, вы должны скачать ODP.NET_Managed12.xxxxxxxx.zip, в которой вы найдете Oracle.ManagedDataAccess.dll, который составляет всего 4 МБ и представляет собой чистую управляемую DLL, которая также работает в 32-битных и 64-битных процессах и не зависит от какой-либо другой DLL и не требует каких-либо записей в реестре.
  • Следующий код С# работает для меня без какой-либо конфигурации на стороне сервера (только установка по умолчанию):
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"]);
            }
        }
    }
}