Постачальник не сумісний з версією клієнта Oracle


157

Я намагаюся використовувати миттєвий клієнт 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

Відповіді:


91

Я розглядав цю проблему далі, і вам просто потрібно схопити всі відповідні 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 # Executable

4
Ваше рішення працювало на мене - я знайшов вашу публікацію в блозі, перш ніж я знайшов це. Ти чоловік. Дякую! :-) Крім того, використовуючи останню версію ODAC, мені не потрібно було розпаковувати жодну з JAR-файлів. Простий пошук в Windows дуже швидко їх здійснив.
Пандінкус

10
Крім того, я використовував останню версію ODAC (11.2.0.1.2) на своїй машині розробки, і потрібні мені були лише файли: oci.dll, Oracle.DataAccess.dll, oraociei11.dll, OraOps11w.dll. Як зазначає Кріс, ЗАБЕЗПЕЧИТИСЯ, ЩО ВИНАГАЄТЬСЯ В ІДНІЙ СКЛАДІ, ЯК ВИСТАВЛЯЮТЬ. ;-)
Пандінкус

1
Схоже, що новіша версія полегшує пошук DLL. Чудово! Тепер скільки часу, поки оракул зведе їх в один простий дл ...
Кріс

На мене працювали стратегія Кріса і бібліотечний набір Пандінкуса. Я дзвоню клієнту Oracle через PowerShell, тому я поміщую бібліотечний набір у виконавчий каталог PowerShell.
quillbreaker

1
Напевно, ви можете скористатися керованим драйвером C # у ці дні, якщо зможете :)
Кріс

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 (про час Oracle).

Пакет NuGet (також працює на 11 г):

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

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

Для отримання інформації про те, як перетворитись на використання керованих бібліотек:

  • По-перше, ось чудове порівняння коду керованого та некерованого : 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

3
Його хороша новина, що нарешті у Oracle є повністю керований драйвер. Перетягування навколо цього 100 МБ було справжнім тягарем.
Джафін

1
керований драйвер прекрасно працює для мене - у мене не було проблем з моменту переходу на нього / ви можете повернути свої проекти назад до AnyCPU і т. д., і це чудово працює :)
Тод Томсон

5
Просто всі знають, хоча керований постачальник приємний, йому не вистачає безлічі функцій, які дозволяє повний провайдер. А саме, Oracle вбудований в шифрування.
Джастін Скілз

1
Документація Oracle, як мінімум, «розкидана». Ось хороше посилання на деякі непідтримувані методи . Додатково, сам водій поставляється з a, readmeщо окреслює деякі обмеження.
Джастін Скілз

2
Використання керованого драйвера - остаточне рішення! я маю nitghtmare кожного разу, я думаю, весь час, витрачений, коли у мене була невідповідність типу
ettore ct

35

Я встановив лише Oracle Data Provider для .NET 2.0 (11.1.0.6.20) і не встановив миттєвий клієнт Oracle (11.1.0.6.0) .

Я щойно встановив його і помилка зникла!


3
Чи можете ви просто скопіювати 4 миттєві DLL клієнта в ту ж папку, що і ваш EXE, замість того, щоб установити клієнт? (ці файли: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll)
Кріс

2
@Chris: Так, можна. З мого досвіду, хоча, вам потрібно oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll і oracle.dataaccess.dll
Pakman

Інше для мене - я встановив би клієнта, але не провайдера
Ev.

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, його потрібно встановити окремо (завантажити з 32-розрядних компонентів доступу до даних Oracle (ODAC) або 64-бітних компонентів доступу до даних Oracle ( ODAC) Завантаження ) або потрібно вибрати відповідно до параметра в Oracle Universal Installer (OUI).

    Зауважте, що при встановленні постачальника даних Oracle> = 12.1, постачальник не автоматично реєструється в GAC. Ви повинні зареєструвати його в разі необхідності вручну, див. Oracle Doc 2272241.1 .

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

    Будьте в курсі різної схеми нумерації. Версія файлу 4.112.3.0 кошти: .NET Framework версії 4, Oracle Release 11.2.0.3.x .

    Існують версії ODP.NET "1.x", "2.x" і "4.x". Ці номери пов'язані з версіями Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 та 4.0.30319. Версія "1.x" була доступна до клієнта Oracle 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 Framework (за умови правильного встановлення) -> не на 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 Client 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)

  • Ви закінчили! Тепер ви можете без проблем використовувати клієнтські програми x86 та x64 Oracle, тобто програма 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.


Цей IMO має більше знань, ніж фактична відповідь. Отже, якщо у мене є програма x86 для .net 4, а версія бази даних знаходиться в 9i, то яку саме версію клієнта повинен мати користувач, якщо у нього 32 або 64-розрядна Windows? Oracle каже, що будь-яка версія клієнта сумісна з будь-якою версією db. Чи є у відповіді 32-розрядні користувачі встановлення 32-розрядної версії, а 64-розрядні користувачі встановлюють 64-бітну версію і використовують керований драйвер ODP.NET для вирішення, з якою ОС він спілкується?
Світлий

1
Коли ви використовуєте керований драйвер ODP.NET, тоді не потрібно встановлювати жодного клієнта Oracle - ось головна його перевага. Він працює як із програмами x86, так і з x64. Без "керованого драйвера ODP.NET" для програми x86 потрібен також клієнт Oracle x86 (тобто 32-бітний), незалежно від архітектури сервера баз даних.
Wernfried Domscheit

Щойно я наткнувся на "Потрібно встановити перерозподільний доступ 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) у моєму каталозі проектів, але час виконання також завантажує 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>

Дякую! Ваше рішення дасть мені думку про те, що я працюю через 2 дні (у мене є Visual Studio 2010 Net 4, клієнт Oracle 10g) ... Я бачу GAC і, звичайно, я встановив 3 версії Oracle.DataAccess.dll, я unistalled all (і видаліть недійсні ключі machine.config у "DbProviderFactories") та перевстановіть лише ODAC1120320 x64. І це працює.
Ернальдо Гонсалес

5

встановіть ODP.Net на цільовій машині, і це має вирішити проблему ... копіювання DLL не виглядає гарною ідеєю ...


5

Для Oracle 11g (11.1.0.7.20) мені довелося додати наступні dll разом зі своїм Exe для роботи.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (досить величезний близько 30 Мб)
  4. Oracle.DataAccess.dll

Ви хочете сказати 130 Мб
Елмуе

2

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


2

У мене була точно така ж проблема. Після видалення програми я видалив (і забув, що видалив) oraociei11.dll. І вона давала цю помилку під час спроби виконання. Отже, коли він не може знайти dll, що oraociei11.dll, він показує цю помилку. Можуть бути й інші випадки, коли він дає цю помилку, але, здається, це один із них.


2

Також шукайте пул додатків IIS Увімкніть 32-розрядний істинний або хибний прапор, коли ви бачите це повідомлення, якийсь форум oracle спрямовував мене на це!


2

У мене така ж проблема, але в моєму випадку я не можу просто скопіювати dlls у папку bin, тоді я лише 'rebind' збірну версію.

<?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>

2

Ось що я зробив, щоб вирішити цю проблему, яка зберігалася протягом 3-х довгих годин:

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

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

  3. Шукаючи Google, я виявив, що це відбувається, тому що я використовував ODP.NET64 біти. Потім я схопив ODP.NETдля Windows 32 біт і встановив його, але я все одно отримував те саме повідомлення про помилку.

  4. РІШЕННЯ: видалили папку client_1та повторно встановили ODP.NET32 біти. Дещо інсталятор змішував біти з 64-бітної версії з 32-бітної версією. Піди розберися...

  5. Тепер я знову щасливий і можу відкрити нове OracleConnection. ОКОНЧНО! :)


2

Для тих, хто все ще має цю проблему: на основі цієї статті

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

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

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

Здійснив налаштування і дзвінок Oracle від C # встиг!


1
Чувак .... Oracle .... чи можемо ми трохи поговорити? Приходьте сюди, в кутку. Слухай, я провів цілий день, з'ясовуючи, що мав на увазі пекельний "постачальник не сумісний", аби потім з'ясувати, що це через те, що певна залежність від установки не була дотримана. Будь ласка - ні - я вимагаю, щоб ви встановили, щоб ваш інсталятор перевірив ці залежності на час встановлення та попередив користувача, якщо він не виконаний. Дякую.
Джей Салліван

3
До речі, мені доводилося неодноразово повертатися до цього питання про поточний перебіг, і до мене щоразу звертається інша відповідь. Яка трата часу і грошей це спричинила.
Джей Салліван

2

Версія TLDR:

  • Використовуйте замість цього 12c 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 \ Програмне забезпечення \ 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, який, на вашу думку, є, якщо він встановлений як у вашій бін каталозі, так і в GAC, але я думаю, що це менш вірогідний senario. Див процесу дозволу збірки для отримання додаткової інформації.


1

Чи має користувач IIS / IWAM дозволи в каталозі Oracle? Чи можете ви підключитися до цього джерела даних за допомогою іншого додатка, наприклад Excel або Access?


1

У нас була така ж проблема, оскільки збірка Oracle.Data.dll на мережевій частці була оновлена ​​нашими DBA. Видалення посилання з проекту та додавання його знову вирішили проблему.


1

Всього два кроки для вирішення цього питання.

  1. перейдіть до попереднього налаштування пулу додатків і встановіть прапорець "Увімкнути 32-бітну програму" на True.
  2. Переконайтеся, що всі Dlls у вашому сміттєвому коді зараз 32-бітна версія ...

удачі.


@ mazhar-abbas, Чи можете ви pls. зазначте, у якому я можу встановити "Увімкнути 32-бітну програму? Це в IIS чи в проекті?
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> 

2
Це дійсно погана ідея , щоб додати посилання на бібліотеки DLL в папці бін.
Jay Sullivan

1
binІ objпапки виведення папки; ось куди йдуть коси, коли ви будуєте свій проект. Ви повинні мати можливість видалити ці папки в будь-який час, не створюючи конфлікту. Зазвичай ці папки ігноруються в контролі джерела. Стандартна практика полягає в створенні External Referencesпапки, куди ви поміщаєте свої посилання.
Джей Салліван

@notfed Здається, ти маєш рацію. Затримаю це на думці.
Роботрон

Як названо, це лише натяковий шлях для компілятора, а не примусовий посилання. Спочатку шукається GAC для Oracle.DataAccess.dll. Це має працювати, навіть якщо ви видалите HintPathцілком.
Wernfried Domscheit

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.


0

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

Як перевірити версію встановленого ODAC: Подивіться в папку C: \ Windows \ Assembly. Властивість "Архітектура процесора" повідомить платформу встановленого ODAC.

Вісім годин - це тривалий час, коли лампочка загориться. Недарма мені завжди доводиться ганяти на роботі :).


Зауважте, 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-бітні машини. Просто змініть свою цільову платформу в "Властивості проекту" на 64-бітну і сподівайтеся на краще.


3
Це насправді .NETish, а не оралійська
Jay Sullivan

0

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

У моєму випадку (після 2-х днів спроб) я виявив, що проблема полягає в дозволах на 64-бітну домашню версію. Багато довідників у цій версії мали виключно перекриті дозволи, у яких роль "Аутентифіковані користувачі" не мала доступу "Читання", який встановлений за замовчуванням у батьківському каталозі. Ці підкаталоги включали "bin", "network / admin", "nls", "oracore", "RDBMS" та, можливо, інші. Я знайшов їх, відфільтрувавши результат "ЗАВЕРШЕНО ДОСТУП" в утиліті "Монітор процесів" (Procmon.exe) від sysinternals. Після того, як дозволи були успадковані з батьківського каталогу в цих дочірніх каталогах, все почало працювати.

Я не мав, що замінити дозволи на весь будинок Oracle, тому я робив їх по одній директорії за один раз, але, мабуть, якщо ви не турбуєтесь про безпеку, ви можете скинути її на весь відповідний домашній каталог oracle.



-3

Тут багато теоретичних відповідей, але ось робочий приклад з кодом, який ви можете скопіювати, вставити та протестувати негайно:

  1. Я встановив базу даних Oracle Express OracleXE112, яка вже постачається з деякими попередньо встановленими демонстраційними таблицями.
  2. Коли ви запускаєте інсталятор, вам буде запропоновано пароль . Я ввів "xxx" як пароль. (не використовується у виробництві)
  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 (130MB!), 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 (160MB!), 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 = СПОСОБИЙ)));"
    + "User ID = SYSTEM; Пароль = xxx;";

використовуючи (OracleConnection conn = новий OracleConnection (oradb)) 
{
    conn.Open ();
    використовуючи (OracleCommand cmd = новий OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "вибрати TABLESPACE_NAME з DBA_DATA_FILES";

        використовуючи (OracleDataReader dr = cmd.ExecuteReader ())
        {
            поки (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Досить зайвий набір для встановлення всього сервера баз даних Oracle, коли вам просто потрібен працюючий клієнт.
Wernfried Domscheit

Ви все одно відповідаєте погано. Немає необхідності копіювати будь-які DLL-файли Oracle в каталог додатків, оскільки за замовчуванням ви їх знайдете через ‰ PATH% (якщо ви не змінюєте їх самостійно) Підказка реєстру застосовується лише для.version 4.x і працює лише для 32-розрядний клієнт Oracle, однак невідповідність 32-розрядних та 64-бітних - головна тема цього питання.
Wernfried Domscheit

Ваш коментар показує, що ви не прочитали моєї відповіді. Якщо я хочу написати програму, яка спілкується з сервером Oracle, не потрібно нічого встановлювати з Oracle. Я просто використовую вищезгадану DLL та розповсюджую її за допомогою свого додатка. Таким чином, нічого не буде в змінній PATH на машині кінцевого користувача. До речі, використання змінної PATH (яка походить від старої епохи DOS з 1980 року) сильно застаріла в сучасному програмному забезпеченні. Моя відповідь рекомендує ВАРІАНТ C, який не потребує жодних контурів реєстру і не залежить від 32 або 64 біт. Я згадав ВАРІАНТИ A і B лише для повноти.
Елмуе

Я думаю, що без належної налаштування% PATH% ваша Windows не працюватиме взагалі - навіть у версії 10. У своїй відповіді я згадав, що не розумно копіювати будь-які DLL-файли Oracle зі своїм додатком. Я не знаю вихідний код цих dll, але може бути більше залежностей від вашої клієнтської сторони, яких ви не бачите, наприклад, викликані мовними налаштуваннями, наборами символів, часовим поясом і т. Д. Коли я буду простежувати, Oracle.DataAccess.dllтоді програма завантажує всього 35 DLL-файлів Oracle! Краще зробити звичайну установку Oracle Client - якщо, звичайно, не використовувати драйвер ODP.NET Managed.
Wernfried Domscheit

1
Думаю, я згадав про свої занепокоєння: (1) Встановлення бази даних марно, тобто надмір. (2) Варіанти A і B працюють лише за певних умов, наприклад, вони не зчитують жодних параметрів NLS з Реєстру (для яких вам потрібен файл oracle.key). Для сумісності потрібно враховувати і незначні версії. Oracle.DataAccess, Version=2.112.2.0наприклад, не працює з OraOps11w.dllверсією 2.112.4.0.
Wernfried Domscheit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.