Я пытаюсь использовать 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
Для начала вам следует «проигнорировать» все разговоры о x86 / x64 и вместо этого попробовать управляемый драйвер ODP.NET (если вы используете .Net v4 +):
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/
Oracle ODP.net управляемый против неуправляемого драйвера
Избегайте всего "неуправляемого", что DLL, что архитектура выдает! : D (о времени Оракула).
Пакет NuGet (также работает для 11g):
Старый / ручной метод:
Для получения информации о том, как перейти на использование управляемых библиотек:
источник
readme
определенными ограничениями.Я только установил поставщик данных Oracle для .NET 2.0 (11.1.0.6.20) и не установил Oracle Instant Client (11.1.0.6.0) .
Я просто установил его, и ошибка исчезла!
источник
Это может быть вызвано запуском 64-битной среды выполнения .NET на 32-битном клиенте Oracle. Это может произойти, если на вашем сервере вы запускаете приложение, на нем 64 бит. Будет запущено приложение .NET с 64-битной средой исполнения. Вы можете установить флаг CPU вашего проекта в VS для запуска в 32-битной среде выполнения.
источник
Давайте сделаем какое-то резюме:
Сообщение об ошибке «Поставщик несовместим с версией клиента Oracle» может быть вызвано несколькими причинами.
У вас не установлен клиент Oracle. В этом случае сообщение об ошибке действительно вводит в заблуждение.
Поставщик данных Oracle для .NET (ODP.NET, т. Е. Файл
Oracle.DataAccess.dll
) не входит в состав Oracle Instant Client, его необходимо установить отдельно (загрузить из 32-битных компонентов доступа к данным Oracle (ODAC) или 64-битных компонентов доступа к данным Oracle ( ODAC) или выберите соответствующий параметр в Oracle Universal Installer (OUI).Обратите внимание, что при установке провайдера данных Oracle> = 12.1, этот провайдер не будет автоматически зарегистрирован в GAC. При необходимости вы должны зарегистрировать его вручную, см. Oracle Doc 2272241.1 .
Версия ODP.NET не соответствует установленной версии Oracle Client. Вы должны проверить даже младший номер версии! Например,
Oracle.DataAccess.dll
версия 4.112.3.0 не совместима с клиентом Oracle 11.2.0.4 . Внимательно проверяйте версии ODP.NET и Oracle Client. Вы можете использовать SigCheck наoraociei*.dll
и / илиOraOps*w.dll
получить версию Oracle Client.Помните о другой схеме нумерации. Версия файла 4.112.3.0 средства: .NET Framework версии 4, Oracle Release 11.2.0.3.x .
Есть ODP.NET версии "1.x", "2.x" и "4.x". Эти цифры относятся к версиям Microsoft .NET Framework 1.0.3705 / 1.1.4322, 2.0.50727 и 4.0.30319. Версия «1.x» была доступна до версии Oracle Client 11.1. Версия "4.x" была введена с Oracle Client 11.2
Архитектура (32-битная или 64-битная) ODP.NET не соответствует архитектуре вашего приложения. 32-битное приложение работает только с 32-битным Oracle Client / ODP.NET, соответственно, для 64-битного приложения требуется 64-битный Oracle Client / ODP.NET. (Если вы не используете ODP.NET Managed Driver )
Версия .NET Framework не совпадает. Например, если вы компилируете свое приложение с помощью Target .NET Framework 2.0, вы не сможете использовать ODP.NET версии 4.x. Целевая версия .NET Framework должна быть равна или выше, чем версия ODP.NET.
Версия
Oracle.DataAccess.dll
на вашей машине разработки (то есть версия, которая загружается во время компиляции) выше, чем версия на целевой машине.Имейте в виду, что это
Oracle.DataAccess.dll
может быть загружено из GAC, который по умолчанию имеет приоритет над любым локально предоставленным файлом.Решения
Рассмотрите возможность использования управляемого драйвера ODP.NET, его можно загрузить со страницы Oracle: загрузка 64-битных компонентов доступа к данным Oracle (ODAC) . Там вам нужно только скопировать
Oracle.ManagedDataAccess.dll
файл в каталог приложения, больше ничего не требуется. Он работает как для 32-битных, так и для 64-битных.По вашему
*.csproj
, соотв.*.vbproj
отредактируйте вашу ссылку на ODP.NET следующим образом:Атрибуты нравятся
Version=...
илиprocessorArchitecture=...
не обязательны.Ваше приложение будет загружаться правильно в-> не проверено на 100%Oracle.DataAccess.dll
зависимости от выбранной архитектуры и целевой платформы .NET (при условии, что оно установлено правильно)Если вы не знаете версию Oracle Client на целевом компьютере (например, это может быть машина вашего клиента): перейдите на страницу загрузки, упомянутую выше, и загрузите наименьшую версию XCopy компонентов Oracle Data Access. Распакуйте zip и скопируйте только
Oracle.DataAccess.dll
файл на ваш локальный компьютер. В вашем проекте VS сделайте ссылку на эту (скорее всего, устаревшую) DLL. Версия этой DLL является наименьшей версией ODP.NET, с которой будет работать ваше приложение. Когда вы запустите ваше приложение, политика издателя в GAC будет перенаправлена на фактически установленную версию.Я не думаю, что это разумный подход, чтобы взять отдельные DLL и скопировать их в определенные папки. Он может работать на «голой» машине, но если на вашей целевой машине установлены какие-либо продукты Oracle, существует высокий риск несоответствия версий. Удалите все продукты Oracle со своего компьютера и выполните новую установку. Посмотрите, как удалить / полностью удалить Oracle 11g (клиент)? это чтобы получить действительно чистую машину.
Если вам нужно работать с 32-битными и 64-битными приложениями одновременно, следуйте этой инструкции, чтобы установить обе версии на одну машину:
Допущения: Oracle Home называется
OraClient11g_home1
, версия клиента - 11gR2.При желании удалить любой установленный клиент Oracle
Загрузите и установите клиент Oracle x86, например, в
C:\Oracle\11.2\Client_x86
Загрузите и установите клиент Oracle x64 в другую папку, например, в
C:\Oracle\11.2\Client_x64
Откройте инструмент командной строки, перейдите в папку% WINDIR% \ System32 и, как правило,
C:\Windows\System32
создайте символическую ссылкуora112
на папкуC:\Oracle\11.2\Client_x64
(см. Ниже)Перейдите в папку% WINDIR% \ SysWOW64, обычно
C:\Windows\SysWOW64
и создайте символическую ссылкуora112
на папкуC:\Oracle\11.2\Client_x86
(см. Ниже)Измените
PATH
переменную окружения, заменить все записи , какC:\Oracle\11.2\Client_x86
и сC:\Oracle\11.2\Client_x64
помощьюC:\Windows\System32\ora112
, соответствующей их\bin
подпапки. Примечание:C:\Windows\SysWOW64\ora112
не должно быть в среде PATH.При необходимости установите
ORACLE_HOME
переменную среды yor наC:\Windows\System32\ora112
Откройте редактор реестра. Установите значение реестра
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
вC:\Windows\System32\ora112
Заданное значение реестра ,
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
чтобыC:\Windows\System32\ora112
(неC:\Windows\SysWOW64\ora112
)Вы сделали! Теперь вы можете использовать клиент Oracle x86 и x64 без проблем, то есть приложение x86 загрузит библиотеки x86, приложение x64 загрузит библиотеки x64 без каких-либо изменений в вашей системе.
Команды для создания символических ссылок:
Некоторые заметки:
Обе символические ссылки должны иметь одинаковое имя, например
ora112
.Если впоследствии вы захотите установить ODP.NET вручную, позаботьтесь о том, чтобы выбрать соответствующие папки для установки.
Несмотря на их имена, папка
C:\Windows\System32
содержит библиотеки x64, тогда какC:\Windows\SysWOW64
содержит библиотеки x86 (32-разрядные). Не смущайтесь.Может быть, это разумный вариант, например, установить
TNS_ADMIN
переменную среды (соответственно,TNS_ADMIN
записи в реестре) в общем местеTNS_ADMIN=C:\Oracle\Common\network
.источник
Oracle.DataAccess.dll
из пакета nugetOracle.DataAccess.x86
, и его версия Dll есть2.112.1.0
, поэтому я сопоставляю установку Oracle Client с версиейOracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)
ЗДЕСЬ, тогда проблема решена!После нескольких часов устранения неполадок я обнаружил, что эта проблема вызвана наличием Oracle.DataAccess.dll (v4.0) в каталоге bin моего проекта, но во время выполнения также загружается Oracle.DataAccess.dll (v2.x) из GAC. Удаление и чтение записи Oracle.DataAccess в ссылках проекта решило проблему для меня.
Другие файлы, упомянутые здесь, не выглядели необходимыми в моей ситуации.
ОБНОВИТЬ
Основной причиной ошибки «Поставщик не совместим с версией клиента Oracle» является (как правило) то, что управляемая сборка пытается загрузить неуправляемые библиотеки, которые не соответствуют версиям. Похоже, вы можете заставить драйвер Oracle использовать правильные библиотеки, указав путь к библиотеке в web.config 1
источник
установить ODP.Net на целевой машине, и это должно решить проблему ... копирование DLL не выглядит хорошей идеей ...
источник
Для Oracle 11g (11.1.0.7.20) мне пришлось добавить следующие dll вместе с моим Exe для работы.
источник
Мне может показаться, что, хотя у вас есть ODP с Oracle Istant Client, ODP может пытаться использовать вместо этого фактический клиент Oracle. У вас также установлен стандартный клиент Oracle? Я вспоминаю, что Oracle был довольно требователен к нескольким клиентам на одной машине.
источник
У меня была точно такая же проблема. Я удалил (и забыл, что я удалил) oraociei11.dll после компиляции приложения. И он выдавал эту ошибку при попытке выполнить. Поэтому, когда он не может найти dll, что oraociei11.dll, он показывает эту ошибку. Могут быть и другие случаи, когда выдает эту ошибку, но, похоже, это один из них.
источник
Также обратите внимание на пул приложений IIS. Включите 32-битный флаг true или false, когда вы видите это сообщение, какой-то форум оракула направил меня на это!
источник
У меня та же проблема, но в моем случае я не могу просто скопировать dll в папку bin, тогда я только «перепривязываю» версию сборки.
источник
Вот что я сделал, чтобы решить эту проблему, которая сохранялась в течение 3 долгих часов:
Под домом Oracle, расположенным по адресу, у
C:\oracle\product\11.2.0
меня была папка, вclient_1
которой я ранее установилODP.NET
биты для Windows 64 бит.Позже, пытаясь отладить приложение ASP.NET Web API с помощью Visual Studio 2012, я продолжал получать следующее сообщение об ошибке: поставщик не совместим с версией клиента Oracle .
Выполняя поиск в Google, я обнаружил, что это происходит, потому что я использовал
ODP.NET
64 бит. Затем я взялODP.NET
32-разрядную версию Windows и установил ее, но продолжал получать одно и то же сообщение об ошибке.РЕШЕНИЕ: удалил папку
client_1
и установилODP.NET
32 бит. В некоторой степени установщик смешивал биты из 64-битной версии с 32-битной версией. Пойди разберись ...Теперь я снова счастлив и могу открыть новое
OracleConnection
. НУ НАКОНЕЦ ТО! :)источник
Для тех, кто все еще имеет эту проблему: на основе этой статьи
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
Я обнаружил, что на моем сервере отсутствует библиотека Microsoft C ++ Visual Runtime - она была у меня на компьютере разработчика из-за установленной Visual Studio. Я скачал и установил (в настоящее время) самую последнюю версию библиотеки отсюда:
http://www.microsoft.com/en-us/download/details.aspx?id=13523
Запустил настройку и оракул из C # сделал это!
источник
Версия TLDR:
Полная версия:
Во-первых, давайте удостоверимся, что мы понимаем компоненты старого неконтролируемого провайдера (а не нового 12c 100% управляемого провайдера). Он состоит из двух частей:
Проще говоря, Oracle.DataAccess.dll - это почти просто оболочка, переводящая инструкции .net в инструкции ORACLE-NET для неуправляемого клиента.
Тем не менее, когда вы загружаете Oracle.DataAccess, существует порядок, в котором он пытается найти необходимые неуправляемые клиентские библиотеки. Из документации Oracle :
Таким образом, в вашем случае ваше приложение следовало вышеописанному процессу и нашло путь, который содержит неизолированные dll, которые слишком стары относительно используемой вами сборки Oracle.DataAccess.dll.
Может случиться так, что единственная установка Oracle Client на этом компьютере слишком старая. Но это вступает в игру, если на компьютере установлено более одного клиента, и неуправляемые файлы были обнаружены первыми в другой, но более старой установке. Если позже, самое простое - использовать переменную конфигурации dllPath в вашей конфигурации и указать ее в правильной папке Oracle Home Bin:
Если вы хотите установить свежую копию клиента, версия xcopy является самой маленькой и содержит «мгновенный клиент» и указывает DllPath выше на это новое местоположение. Но любая установка клиента Oracle будет работать.
Но если вы хотите избежать всей этой проблемы неуправляемого разрешения клиента, посмотрите, можете ли вы обновить свое приложение, чтобы использовать вместо него 100% -ный управляемый поставщик - это действительно одна или две управляемые сборки, без какой-либо зависимости от неуправляемых файлов.
Также возможно, что вы не загружаете Oracle.DataAccess.dll, как вы думаете, если он установлен и в вашем каталоге bin, и в вашем GAC, но я думаю, что это менее вероятный senario. См. Процесс разрешения сборки для получения дополнительной информации.
источник
Имеет ли пользователь IIS / IWAM разрешения на каталог Oracle? Можете ли вы подключиться к этому источнику данных с помощью другого приложения, такого как Excel или Access?
источник
У нас была та же проблема, потому что сборка Oracle.Data.dll на сетевом ресурсе была обновлена нашими администраторами баз данных. Удаление ссылки из проекта и добавление ее снова решило проблему.
источник
Всего два шага, чтобы решить эту проблему.
удачи.
источник
Я не пошел по пути получения новых DLL. У нас было несколько существующих проектов, которые прекрасно работали, и только мой новый проект вызывал у меня головную боль, поэтому я решил попробовать что-то еще.
В моем проекте использовался внутренний файл Internal.dll, который зависел от Oracle.DataAccess.dll
v4.112.3.0
. По какой-то причине при публикации Visual Studio всегда загружалсяv4.121.0.0
, даже если он не был явно указан ни в одном из файлов конфигурации. Вот почему я получил ошибку.Итак, что я сделал:
/bin
(просто на всякий случай)./bin
.myWebSite.csproj
, но показала неверную версию:v4.121.0.0
вместоv4.112.3.0
.Я вручную изменил ссылку в
myWebSite.csproj
, так что теперь она читается:источник
bin
Иobj
папки вывода папки; это то место, где идут dll, когда вы строите свой проект. Вы должны иметь возможность удалить эти папки в любое время, не создавая конфликтов. Обычно эти папки игнорируются в системе контроля версий. Стандартная практика состоит в том, чтобы создатьExternal References
папку, в которую вы помещаете свои ссылочные библиотеки.HintPath
полностью.Я столкнулся с этой проблемой после того, как установил Oracle Data Tools для Visual Studio 2015, а затем боролся с Oracle в течение часа. Я решил попробовать переустановить клиент Oracle снова вместо этого беспорядка с копированием файлов, изменениями конфигурации и т. Д., И это сработало для меня.
источник
Я столкнулся с подобной проблемой, и основной причиной было то, что 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.
источник
Недавно мне пришлось работать над старым проектом, в котором решение и все содержащиеся в нем проекты были ориентированы на платформу 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/...Решение Криса сработало и для меня. Однако я получил следующее сообщение об ошибке:
По-видимому, на иностранном языке Oraclish это означает, что ваша программа ориентирована либо на все платформы, либо на 32-битные машины. Просто измените целевую платформу в Project Properties на 64-битную и надейтесь на лучшее.
источник
У меня была такая же проблема с Oracle.DataAccess.dll v4.121.2.0. с установкой в 2 дома (32- и 64-разрядные версии). 32-битная версия workerd, 64-битная версия - нет.
В моем случае (после 2 дней попыток) я обнаружил, что проблема была в разрешениях для 64-битной домашней версии. Многие каталоги в этой версии имели исключительно переопределенные разрешения, для которых роль «Аутентифицированные пользователи» не имела доступа «Чтение», что по умолчанию установлено в родительском каталоге. Эти подкаталоги включали «bin», «network / admin», «nls», «oracore», «RDBMS» и, возможно, другие. Я нашел их, отфильтровав результат «ACCESS DENIED» в утилите «Process Monitor» (Procmon.exe) от sysinternals. Как только разрешения были унаследованы от родительского каталога к этим дочерним подкаталогам, все начало работать.
Я не сделал, что бы переопределить разрешения для всего дома оракула, поэтому я сделал их по одному каталогу за раз, но я думаю, если вы не так сильно беспокоитесь о безопасности, вы можете сбросить его для всего соответствующего домашнего каталога оракула.
источник
http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html
источник
Здесь много теоретических ответов, но вот рабочий пример с кодом, который вы можете скопировать, вставить и протестировать немедленно:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. На 64-битных машинах пишут дополнительно вHKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
Oracle.ManagedDataAccess.dll
только 4 МБ и являющуюся чисто управляемой DLL, которая работает в 32-битных и 64-битных процессах. а также и не зависит от других DLL и не требует каких-либо записей в реестре.источник
Oracle.DataAccess.dll
помощью программа загружает в общей сложности 35 Oracle DLL! Лучше сделать обычную установку Oracle Client - если, конечно, вы не используете управляемый драйвер ODP.NET.oracle.key
). Для совместимости необходимо учитывать и второстепенные версии.Oracle.DataAccess, Version=2.112.2.0
не работает сOraOps11w.dll
версией 2.112.4.0 например.