Доставчикът не е съвместим с версията на Oracle client

Опитвам се да използвам Oracle ODP.NET 11g (11.1.0.6.20) Instant Client в моя проект ASP.net като Доставчик на данни, но когато стартирам aspx страница Получавам съобщение за грешка „Доставчикът не е съвместим с версията на Oracle client“. Всяка помощ ще бъде оценена.

Позовах се на доставчика на данни във Visual Studio 2005 и кодът отзад изглежда така:

using Oracle.DataAccess.Client;
..

OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
    "Data Source=MyOracleServerName;" +
    "Integrated Security=SSPI";
oOracleConn.Open();

//Do Something

oOracleConn.Close();

Грешката за страницата изглежда така:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client

Source Error: 
Line 21: 
Line 22: 
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +

[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
   Oracle.DataAccess.Client.OracleInit.Initialize() +494
   Oracle.DataAccess.Client.OracleConnection..cctor() +483

Stack Trace: 
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
   Oracle.DataAccess.Client.OracleConnection..ctor() +0
   Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

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


Отговори (27)


Разгледах този проблем по-нататък и вие просто трябва да вземете всички подходящи DLL файлове от същата изтеглена версия на ODP.Net и да ги поставите в същата папка като вашия Exe файл, защото ODP.Net е нервен да не смесва номера на версиите.

Обясних как да направя това тук: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Ето обаче същината:

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

Трябва да „игнорирате“ всички разговори за x86/x64 тук като за начало и вместо това да опитате управлявания драйвер ODP.NET (ако използвате .Net v4+):

https://www.nuget.org/packages/Oracle.ManagedDataAccess/

https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

Oracle ODP.net управляван срещу неуправляван драйвер

Избягвайте всички "неуправлявани" проблеми с каква DLL каква архитектура! :D (крайно време Oracle).

Пакетът NuGet (работи и за 11g):

въведете описание на изображението тук

Старият/ръчен метод:

За информация как да преобразувате към използване на управляваните библиотеки:

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

Инсталирах само Oracle Data Provider за .NET 2.0 (11.1.0.6.20) и не инсталирах Oracle Instant Client (11.1.0.6.0).

Току що го инсталирах и грешката изчезна!

person EverTheLearner    schedule 18.03.2009
comment
Можете ли просто да копирате 4-те незабавни клиентски DLL файлове в същата папка като вашия EXE, вместо да инсталирате клиента? (тези файлове: oci.dll orannzsbb11.dll oraocci11.dll oraociicus11.dll) - person Chris; 11.08.2009
comment
@Chris: Да, можете. Според моя опит обаче ви трябват oci.dll, orannzsbb11.dll, oraociicus11.dll, oraops11w.dll и oracle.dataaccess.dll - person Pakman; 15.01.2013
comment
Обратно за мен - инсталирах клиента, но не и доставчика - person Ev.; 30.05.2014

Това може да бъде причинено от стартиране на 64-битово .NET време за изпълнение срещу 32-битов Oracle клиент. Това може да се случи, ако вашият сървър изпълнява приложението на него 64 бита. Той ще стартира приложението .NET с 64-битова среда за изпълнение. Можете да зададете CPU флага на вашия проект във VS да работи в 32-битово време за изпълнение.

person Daniel    schedule 29.05.2009
comment
Току-що попаднах на този. Работи в (32-битово) тестово приложение, след което падна в IIS. Вместо да изисквам всички включени сборки да бъдат 32-битови, промених на 32-битов AppPool. - person anton.burger; 20.07.2011

Нека направим някакво обобщение:

Съобщението за грешка „Доставчикът не е съвместим с версията на клиента Oracle“ може да бъде причинено от няколко причини.

  • Нямате инсталиран Oracle Client. В този случай съобщението за грешка наистина е подвеждащо.

    Oracle Data Provider за .NET (ODP.NET, т.е. файл Oracle.DataAccess.dll) не е включен в Oracle Instant Client, той трябва да се инсталира отделно (изтегляне от 32-битови компоненти за достъп до данни на Oracle (ODAC) или Изтегляния на 64-битови Oracle Data Access Components (ODAC)) или трябва да изберете съответната опция в Oracle Universal Installer (OUI).

    Обърнете внимание, че при инсталиране на Oracle Data Provider >= 12.1, тогава доставчикът не се регистрира автоматично в GAC. Трябва да го регистрирате ръчно, ако е необходимо, вижте Oracle Doc 2272241.1 .

  • Версията на ODP.NET не съответства на инсталираната версия на Oracle Client. Трябва да проверите дори второстепенния номер на версията! Например Oracle.DataAccess.dll Версия 4.112.3.0 не е съвместима с Oracle Client 11.2.0.4. Проверете внимателно версиите на ODP.NET и Oracle Client. Можете да използвате sigcheck на oraociei*.dll и/или OraOps*w.dll, за да получите версия на Oracle Клиент.

    Имайте предвид различните схеми на номериране. Версия на файла 4.112.3.0 означава: .NET Framework версия 4, Oracle издание 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 може да се зареди от GAC, който по подразбиране има предимство пред всеки локално предоставен файл.

Решения

  • Помислете за използване на управлявания драйвер ODP.NET, той може да бъде изтеглен от страницата на Oracle: Изтегляния на 64-битови компоненти за достъп до данни на Oracle (ODAC). Там трябва само да копирате Oracle.ManagedDataAccess.dll файл в директорията на вашето приложение, нищо друго не се изисква. Работи както за 32bit, така и за 64bit.

  • Във вашия *.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 Client, например в C:\Oracle\11.2\Client_x86

  • Изтеглете и инсталирайте Oracle x64 Client в друга папка, например в C:\Oracle\11.2\Client_x64

  • Отворете инструмента за команден ред, отидете в папка %WINDIR%\System32, обикновено C:\Windows\System32 и създайте символна връзка ora112 към папка C:\Oracle\11.2\Client_x64 (вижте по-долу)

  • Променете към папка %WINDIR%\SysWOW64, обикновено C:\Windows\SysWOW64 и създайте символна връзка ora112 към папка C:\Oracle\11.2\Client_x86 (вижте по-долу)

  • Променете променливата на средата PATH, заменете всички записи като C:\Oracle\11.2\Client_x86 и C:\Oracle\11.2\Client_x64 с C:\Windows\System32\ora112, съответно тяхната подпапка \bin. Забележка: C:\Windows\SysWOW64\ora112 не трябва да е в PATH среда.

  • Ако е необходимо, задайте вашата променлива на средата 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.

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

След няколко часа отстраняване на неизправности открих, че този проблем е причинен от наличието на Oracle.DataAccess.dll (v4.0) в моята директория bin за проекти, но времето за изпълнение също зарежда Oracle.DataAccess.dll (v2.x) от GAC. Премахването и четенето на записа Oracle.DataAccess в референциите на проекта реши проблема за мен.

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

АКТУАЛИЗИРАНЕ

Основната причина за грешката „Доставчикът не е съвместим с версията на клиента на Oracle“ е (обикновено), че управляваният сбор се опитва да зареди неуправляеми библиотеки, които не съответстват на версиите. Изглежда, че можете да принудите драйвера на Oracle да използва правилните библиотеки, като посочите пътя на библиотеката в web.config1

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

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

person HainKurt    schedule 04.02.2010

За Oracle 11g (11.1.0.7.20) трябваше да добавя следните dll заедно с моя Exe, за да работи.

  1. oci.dll
  2. OraOps11w.dll
  3. oraociicus11.dll (доста огромен близо до 30mb)
  4. Oracle.DataAccess.dll
person SKG    schedule 03.03.2011
comment
Искате да кажете 130 MB - person Elmue; 20.04.2017

TLDR версия:

  • Вместо това използвайте 12c 100% управляван доставчик.
  • Ако трябва да използвате стария доставчик, трябва да насочите Oracle.DataAccess.dll към неуправляваните клиентски Dlls на Oracle, които са с правилната версия. Ако имате няколко клиента на Oracle, инсталирани на вашата машина, това може да е просто като включването на конфигурационната променлива „DllPath“ (вижте по-долу) в конфигурацията на вашето приложение, но може също да се наложи да инсталирате нов клиент на Oracle, към който да сочите.

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

Първо, нека се уверим, че разбираме компонентите на стария неуправляван доставчик (не новия 12c 100% управляван доставчик). Състои се от две части:

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

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

Въпреки това, когато заредите Oracle.DataAccess, има ред, в който той се опитва да намери неуправляваните клиентски dll, от които се нуждае. От документация на Oracle:

Oracle.DataAccess.dll търси зависими неуправляеми DLL файлове (като Oracle Client) въз основа на следния ред:

1.Директория на приложението или изпълним файл.

2. Настройка на DllPath, посочена от конфигурацията на приложението или web.config.

3. Настройка на DllPath, посочена от machine.config.

4. Настройка на DllPath, посочена от системния регистър на Windows.

HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\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, но мисля, че това е по-малко вероятното senario. Вижте процес на разрешаване на сглобяване за повече информация.

person b_levitt    schedule 08.12.2016

Струва ми се, че въпреки че имате ODP с Oracle Istant Client, ODP може да се опитва да използва действителния Oracle Client вместо това. Имате ли и стандартен Oracle клиент, инсталиран на машината? Спомням си, че Oracle беше доста придирчив, когато ставаше въпрос за множество клиенти на една и съща машина.

person Peter Meyer    schedule 18.03.2009

Имах абсолютно същия проблем. Изтрих (и забравих, че съм изтрил) oraociei11.dll след компилираното приложение. И даваше тази грешка, докато се опитваше да изпълни. Така че, когато не може да намери dll тази oraociei11.dll, показва тази грешка. Може да има и други случаи, когато дава тази грешка, но това изглежда е един от тях.

person Community    schedule 05.08.2009

Потърсете също IIS Application pool Enable 32-bit true or false flag, когато видите това съобщение, някой форум на оракул ме насочи към това!

person Hydtechie    schedule 12.04.2011

имам същия проблем, но в моя случай не мога просто да копирам dlls в папката bin, а след това само „свързвам“ версията на асемблирането.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>    
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
        <bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
person calderonsteven    schedule 19.03.2013

Ето какво направих, за да разреша този проблем, който продължаваше 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.NET 64 бита. След това взех ODP.NET за Windows 32 бита и го инсталирах, но продължавах да получавам същото съобщение за грешка.

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

  5. Сега отново съм щастлив и мога да отворя нов OracleConnection. НАЙ-НАКРАЯ! :)

person Leniel Maccaferri    schedule 31.05.2013

За всеки, който все още има този проблем: въз основа на тази статия

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

Открих, че на сървъра ми липсва Microsoft C++ Visual Runtime Library - имах я на моята машина за разработка поради инсталираното Visual Studio. Изтеглих и инсталирах (в момента) най-новата версия на библиотеката от тук:

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

Стартирайте настройката и извикването на oracle от C# успя!

person dabor    schedule 19.12.2013
comment
Пич....Oracle....може ли да поговорим малко? Ела тук, в ъгъла. Слушай, човече, прекарах цял ден в разгадаване какво, по дяволите, трябваше да означава несъвместим доставчик, само за да разбера по-късно, че това е, защото не е спазена някаква зависимост от инсталацията. Моля--не--аз изисквам да накарате вашия инсталатор да проверява за тези зависимости по време на инсталацията и да предупреди потребителя, ако не е срещнах. Благодаря. - person Jay Sullivan; 06.02.2015
comment
Между другото, трябваше да се връщам към този въпрос за stackoverflow многократно и всеки път за мен се отнася различен отговор. Каква загуба на време и пари причини това. - person Jay Sullivan; 06.02.2015

Не тръгнах по пътя на получаване на нови DLL файлове. Имахме куп съществуващи проекти, които работят перфектно и само новият ми проект ми създаваше главоболия, така че реших да опитам нещо друго.

Моят проект използваше вътрешно разработен Internal.dll, който зависеше от Oracle.DataAccess.dll v4.112.3.0. По някаква причина при публикуване Visual Studio винаги качваше v4.121.0.0, въпреки че не беше изрично посочено в нито един от конфигурационните файлове. Ето защо получавах грешка.

И така, това, което направих, беше:

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

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference> 
    
person Robotronx    schedule 15.01.2015
comment
Наистина е лоша идея да добавяте препратка към dlls в папка bin. - person Jay Sullivan; 26.01.2015
comment
Папките bin и obj са изходни папки; това е мястото, където dlls отиват, когато създавате вашия проект. Трябва да можете да изтриете тези папки по всяко време, без да създавате конфликт. Обикновено тези папки се игнорират в контрола на източника. Стандартната практика е да създадете папка External References, където да поставите вашите референтни dll. - person Jay Sullivan; 27.01.2015
comment
@notfed Изглежда си прав. Ще запазя това в ума си. - person Robotronx; 28.01.2015
comment
Както е наименувано, това е само път за подсказка за компилатора, а не принудителна препратка. Първо GAC се търси за Oracle.DataAccess.dll. Трябва да работи дори ако изтриете HintPath изцяло. - person Wernfried Domscheit; 01.02.2015

Потребителят на IIS/IWAM има ли разрешения за директорията на Oracle? Можете ли да се свържете с този източник на данни с помощта на друго приложение, като Excel или Access?

person DCookie    schedule 18.03.2009

Имахме същия проблем, тъй като сборката Oracle.Data.dll на мрежов дял беше актуализирана от нашия DBA. Премахването на препратката от проекта и добавянето й отново реши проблема.

person doekman    schedule 10.11.2011

Само две стъпки за решаване на този проблем.

  1. отидете на предварителна настройка на набора от приложения и задайте флага „Активиране на 32-битово приложение“ на True.
  2. Уверете се, че всички DLL файлове във вашия Bin са 32-битова версия сега...

късмет.

person Mazhar Abbas    schedule 03.05.2013
comment
@mazhar-abbas, може ли, моля. посочете в кое мога да настроя „Разрешаване на 32-битово приложение? В IIS ли е или в Project? - person hiFI; 05.09.2014

Срещнах този проблем, след като инсталирах Oracle Data Tools за Visual Studio 2015 и след това се борих с Oracle за добър час. Реших да опитам да преинсталирам клиента на Oracle отново вместо тази бъркотия с копиране на файлове, промени в конфигурацията и т.н., и това проработи за мен.

person David Spenard    schedule 02.12.2016

Сблъсках се с подобен проблем и основната причина беше, че GAC имаше 2 версии на oracle.dataaccess, т.е. v4.0_4.112.2.0 и v4.0_4.112.4.0. Моето приложение се отнасяше до v4.0_4.112.2.0, така че когато премахнах v4.0_4.112.4.0 от GAC, то работи добре.

GAC път: C:\Windows\Microsoft.NET\assembly\GAC_64\Oracle.DataAccess

Преди: въведете описание на изображението тук

След: въведете описание на изображението тук

За да премахнете версия, можете просто да изтриете съответната папка от GAC.

person p4ulinux    schedule 07.01.2020

Този проблем може да възникне при използване на неуправляема препратка към оракул, ако имате повече от един клиент на оракул или понякога, ако препращате към различна версия
Има два начина за разрешаването му:

  1. Първото и бързо решение е да премахнете неуправляваната препратка и да използвате управляваната от NuGet, вижте това преди, за да използвате тази опция Разлики между управлявания драйвер на ODP.NET и неуправлявания драйвер

  2. Второто решение е да коригирате неуправляваната целева версия на проекта, както е показано по-долу:

  • Първо проверете референтната версия на проекта на oracle (от препратки към проекти/(зависимости › сборки ) › Oracle.DataAccess, щракнете с десния бутон › свойства):

    въведете описание на изображението тук

    въведете описание на изображението тук

След това проверете версията на Oracle GAC

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

  • Проверете платформата, която съответства на вашата платформа на проекта

    въведете описание на изображението тук

  • за да проверите вашата целева платформа (щракнете с десния бутон върху свойствата на вашия проект ›)

    въведете описание на изображението тук

  • От търсене в папка gac до Oracle.DataAccess

    въведете описание на изображението тук

  • Щракнете с десния бутон върху Oracle.DataAccess › свойства › подробности и проверете версията

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

  • ако забележите, че версиите са различни, това е проблемът и за да го поправим, трябва да пренасочим версията на сглобяването (в стартиращия проект отидете на конфигурационния файл и добавете секцията по-долу)

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

като това въведете описание на изображението тук

oldVersion : трябва да покрива вашата версия на проекта newVersion : GAC версия publicKeyToken : От GAC

въведете описание на изображението тук

person Osama AbuSitta    schedule 21.09.2020

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

Как да проверите версията на инсталирания ODAC: Погледнете в папка C:\Windows\assembly. Свойството „Архитектура на процесора“ ще информира платформата за инсталирания ODAC.

Осем часа са много време, за да светне крушката. Нищо чудно, че винаги трябва да се бавя на работа :).

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

Решението на Крис проработи и при мен. Все пак получих следното съобщение за грешка, което гласи:

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

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

person Cameron Castillo    schedule 29.08.2013
comment
Това всъщност е .NETish, а не Oraclish - person Jay Sullivan; 27.02.2014

Имах същия проблем с Oracle.DataAccess.dll v4.121.2.0. с инсталация за 2 домове (32 и 64 битови версии). 32-битовата версия работеше, 64-битовата версия не.

В моя случай (след 2 дни опити) открих, че проблемът е в разрешенията за 64-битовата домашна версия. Много директории в тази версия имаха изключително заменени разрешения, където ролята на „Удостоверени потребители“ нямаше достъп „Четене“, който е зададен по подразбиране в родителската директория. Тези поддиректории включват "bin", "network/admin", "nls", "oracore", "RDBMS" и вероятно други. Намерих ги, като филтрирах резултата „ОТКАЗАН ДОСТЪП“ в помощната програма „Монитор на процеса“ (Procmon.exe) от sysinternals. След като разрешенията бяха наследени от родителската директория към тези дъщерни поддиректории, всичко започна да работи.

Не исках да заменя разрешенията за цялата начална директория на oracle, така че ги направих една директория наведнъж, но предполагам, че ако не се тревожите за сигурността толкова много, можете да я нулирате за цялата съответна начална директория на oracle.

person Greg Z.    schedule 17.08.2015

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

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

person JordanBean    schedule 18.04.2013

Тук има много теоретични отговори, но тук идва работещ пример с код, който можете да копирате и поставите и да тествате веднага:

  1. Инсталирах базата данни Oracle Express OracleXE112, която вече идва с някои предварително инсталирани демонстрационни таблици.
  2. Когато стартирате инсталатора, ще бъдете попитани за парола. Въведох "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. ОПЦИЯ Б: Ако сте изтеглили 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 MB, трябва да изтеглите ODP.NET_Managed12.x.x.x.xxxxx.zip, в който ще намерите Oracle.ManagedDataAccess.dll, който е само 4 MB и е чист управляван DLL който работи и в 32-битови и 64-битови процеси и не зависи от други DLL и не изисква никакви записи в системния регистър.
  8. Следният C# код работи за мен без никаква конфигурация от страна на сървъра (само инсталацията по подразбиране):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

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

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

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