Ответ 1
Я установил Oracle Data Provider для .NET 2.0 (11.1.0.6.20), и я не установил Oracle Instant Client (11.1.0.6.0). > .
Я только что установил его, и ошибка исчезла!
Я пытаюсь использовать 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
Я установил Oracle Data Provider для .NET 2.0 (11.1.0.6.20), и я не установил Oracle Instant Client (11.1.0.6.0). > .
Я только что установил его, и ошибка исчезла!
Я изучал эту проблему дальше, и вам просто нужно собрать всю соответствующую DLL из той же загруженной версии ODP.Net и поместить их в ту же папку, что и ваш файл Exe, потому что ODP.Net суетливый о не смешивании номеров версий.
Я объяснил, как это сделать здесь: http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c Вот суть этого, хотя:
Вам следует "игнорировать" все разговоры 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):
Старый/ручной метод:
Информацию о том, как конвертировать в управляемые библиотеки:
Это может быть вызвано запуском 64-битной среды выполнения .NET для 32-битного клиента Oracle. Это может произойти, если на вашем сервере вы используете приложение на нем 64 бит. Он будет запускать приложение .NET с 64-битной версией. Вы можете установить флаг ЦП в своем проекте в VS для запуска в 32-битной среде исполнения.
Давайте сделаем какое-то резюме:
Сообщение об ошибке "Поставщик несовместим с версией клиента Oracle" может быть вызвано несколькими причинами.
У вас не установлен клиент Oracle. В этом случае сообщение об ошибке действительно вводит в заблуждение.
Поставщик данных Oracle для .NET(ODP.NET, т.е. файл Oracle.DataAccess.dll
) не входит в состав Oracle Instant Client, его необходимо установить отдельно (загрузить из 32-разрядных компонентов доступа к данным Oracle (ODAC) или 64-разрядных). Компоненты Oracle Data Access Components (ODAC) загружаются) или необходимо выбрать соответствующий параметр в Oracle Universal Installer (OUI).
Обратите внимание, что при установке провайдера данных Oracle> = 12.1, этот провайдер не будет автоматически зарегистрирован в GAC. При необходимости вы должны зарегистрировать его вручную, см. Oracle Doc 2272241.1.
Версия ODP.NET не соответствует установленной версии Oracle Client. Вы должны проверить даже младший номер версии! Например, Oracle.DataAccess.dll
версии 4.112.3.0 не совместим с Oracle Client 11.2.0.4. Внимательно проверяйте версии ODP.NET и Oracle Client. Вы можете использовать sigcheck для oraociei*.dll
и/или OraOps*w.dll
чтобы получить версию Oracle Client.
Помните о другой схеме нумерации. Версия файла 4.112.3.0 означает: .NET Framework версии 4, Oracle Release 11.2.0.3.x.
Есть ODP.NET версии "1.x", "2.x" и "4.x". Эти цифры относятся к версиям Microsoft.NET Framework 1.0.3705/1.1.4322, 2.0.50727 и 4.0.30319. Версия "1.x" была доступна до версии Oracle Client 11.1. Версия "4.x" была введена с Oracle Client 11.2
Архитектура (32-битная или 64-битная) ODP.NET не соответствует архитектуре вашего приложения. 32-битное приложение работает только с 32-битным Oracle Client/ODP.NET, соответственно, для 64-битного приложения требуется 64-битный Oracle Client/ODP.NET. (Если вы не используете ODP.NET Managed Driver)
Версия .NET Framework не совпадает. Например, если вы компилируете свое приложение с помощью Target.NET Framework 2.0, вы не сможете использовать ODP.NET версии 4.x. Целевая версия .NET Framework должна быть равна или выше, чем версия ODP.NET.
Версия Oracle.DataAccess.dll
на вашем компьютере разработчика (т. Oracle.DataAccess.dll
Версия, которая загружается во время компиляции) выше, чем версия на целевом компьютере.
Помните, что Oracle.DataAccess.dll
может быть загружен из GAC, который по умолчанию имеет приоритет над любым локально предоставленным файлом.
Решения
Рассмотрите возможность использования управляемого драйвера ODP.NET, его можно загрузить со страницы Oracle: загрузка 64-битных компонентов доступа к данным Oracle (ODAC). Там вам нужно только скопировать файл Oracle.ManagedDataAccess.dll
в каталог приложения, больше ничего не требуется. Он работает как для 32-битных, так и для 64-битных.
В вашем *.csproj
, соотв. *.vbproj
отредактируйте вашу ссылку на ODP.NET следующим образом:
<Reference Include="Oracle.DataAccess">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
</Reference>
Такие атрибуты, как Version=...
или processorArchitecture=...
не требуются. Ваше приложение будет загружать правильный → не проверено на 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 Client в другую папку, например, в C:\Oracle\11.2\Client_x64
Откройте инструмент командной строки, перейдите в папку% WINDIR%\System32, обычно C:\Windows\System32
и создайте символическую ссылку ora112
на папку C:\Oracle\11.2\Client_x64
(см. Ниже)
Перейдите в папку% WINDIR%\SysWOW64, обычно C:\Windows\SysWOW64
и создайте символическую ссылку ora112
на папку C:\Oracle\11.2\Client_x86
(см. Ниже).
Измените PATH
среды PATH
, замените все записи, такие как C:\Oracle\11.2\Client_x86
и C:\Oracle\11.2\Client_x64
на C:\Windows\System32\ora112
, в соответствии с их C:\Windows\System32\ora112
\bin
. Примечание: C:\Windows\SysWOW64\ora112
не должен находиться в среде PATH.
При необходимости установите для переменной среды ORACLE_HOME
значение C:\Windows\System32\ora112
Откройте редактор реестра. Установите значение реестра HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
в C:\Windows\System32\ora112
Задайте для параметра реестра HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
значение C:\Windows\System32\ora112
(не C:\Windows\SysWOW64\ora112
)
Вы сделали! Теперь вы можете без проблем использовать клиент Oracle x86 и x64, то есть приложение x86 загрузит библиотеки x86, приложение x64 загрузит библиотеки x64 без каких-либо изменений в вашей системе.
Команды для создания символических ссылок:
cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86
Некоторые заметки:
Обе символические ссылки должны иметь одинаковое имя, например, ora112
.
Если впоследствии вы захотите установить ODP.NET вручную, позаботьтесь о том, чтобы выбрать соответствующие папки для установки.
Несмотря на их имена, папка C:\Windows\System32
содержит библиотеки x64, тогда как C:\Windows\SysWOW64
содержит библиотеки x86 (32-разрядные). Не смущайтесь.
Возможно, разумно установить TNS_ADMIN
переменную среды TNS_ADMIN
(или, соответственно, записи TNS_ADMIN
в реестре), например TNS_ADMIN=C:\Oracle\Common\network
.
установить ODP.Net на целевой машине, и он должен решить проблему... копирование dll не выглядит хорошей идеей...
Для Oracle 11g (11.1.0.7.20) мне пришлось добавить следующие DLL вместе с моим Exe для работы.
После нескольких часов устранения неполадок, я обнаружил, что эта проблема вызвана тем, что Oracle.DataAccess.dll(v4.0) в моем каталоге bin bin, но среда выполнения также загружает Oracle.DataAccess.dll(v2.x) из ПКК. Удаление и чтение записи Oracle.DataAccess в ссылках на проект решает проблему для меня.
Другие файлы, упомянутые здесь, в моей ситуации не выглядели необходимыми.
Основная причина ошибки "Поставщик несовместима с версией клиента Oracle" (обычно) заключается в том, что управляемая сборка пытается загрузить неуправляемые библиотеки, которые не соответствуют версиям. По-видимому, вы можете заставить драйвер Oracle использовать правильные библиотеки, указав путь к библиотеке в web.config 1
<configuration>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>
Потеряв три часа на этом, моя проблема была просто:
Отсутствует OraOps11w.dll
Почему это сообщение должно генерировать сообщение "поставщик несовместимо с версией клиента Oracle"? Это должно быть плохое кодирование/тестирование Oracle. Я использовал Oracle с 1994 года и много раз с .Net с 2002 года. Это практически всегда боль.
Каждый должен удалить Oracle и следовать за решением Криса выше (верхний ответ). Это должно работать каждый раз
Из другого сообщения в StackOverflow это как удалить Oracle (забыть инструмент удаления Oracle, поскольку он работает не так):
У Chris меньше DLL, чем я на сервере 2003 (32 бит). Это то, что у меня есть:
C:\oracle\instantclient>dir /b
oci.dll
ociw32.dll
Oracle.DataAccess.dll
orannzsbb11.dll
oraocci11.dll
oraociei11.dll
OraOps11w.dll
Orasqlplusic11.dll
sqlplus.exe
tnsnames.ora
C:\oracle\instantclient находится в глобальном пути и переменной среды ORACLE_HOME..Net ссылки C:\oracle\instantclient\Oracle.DataAccess.dll
Мне кажется, что хотя у вас есть ODP с Oracle Istant Client, ODP может пытаться использовать фактический клиент Oracle вместо этого. У вас есть стандартный клиент Oracle, установленный на машине? Я помню, что Oracle довольно разборчив, когда речь заходит о нескольких клиентах на одной машине.
У меня была такая же проблема. Я удалил (и забыл, что я удалил) oraociei11.dll после компиляции приложения. И эта ошибка при попытке выполнить. Поэтому, когда он не может найти dll, что oraociei11.dll, он показывает эту ошибку. Могут быть и другие случаи, когда он дает эту ошибку, но это, кажется, один из них.
Ищите пул приложений IIS. Включите 32-битный флаг true или false, когда вы увидите это сообщение, для меня был задан какой-то oracle форум!
Вот что я сделал для решения этой проблемы, которая сохранялась в течение 3 долгих часов:
В базе данных Oracle, расположенной в C:\oracle\product\11.2.0
, у меня была папка с именем client_1
, где я ранее установил биты ODP.NET
для 64-разрядных бит Windows.
Позже, пытаясь отлаживать приложение ASP.NET Web API с помощью Visual Studio 2012, я продолжал получать это сообщение об ошибке: Поставщик несовместим с версией клиента Oracle.
Поиск Google Я обнаружил, что это происходит, потому что я использовал ODP.NET
64 бит. Затем я схватил ODP.NET
для Windows 32 бит и установил его, но я продолжал получать одно и то же сообщение об ошибке.
РЕШЕНИЕ: удалили папку client_1
и смолировали ODP.NET
32 бита. В некотором роде установщик смешивал биты из 64-битной версии с 32-разрядной версией. Перейти фигурой...
Теперь я снова счастлив, и я могу открыть новый OracleConnection
. В КОНЦЕ КОНЦОВ!:)
Для тех, кто все еще имеет эту проблему: на основе этой статьи
http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html
Я узнал, что на моем сервере отсутствовала Visual Runtime Library Microsoft С++ - у меня это было на моей машине dev из-за установленной Visual Studio. Я загрузил и установил (в настоящее время) самую последнюю версию библиотеки здесь:
http://www.microsoft.com/en-us/download/details.aspx?id=13523
Запустите настройку, и вызов oracle с С# сделал это!
Версия TL;DR:
Полная версия:
Во-первых, давайте позаботимся о том, чтобы понять компоненты старого невозмутируемого провайдера (а не нового 12c 100% управляемого провайдера). Он состоит из двух частей:
Проще говоря, Oracle.DataAccess.dll почти просто обертка, переводя команды .net в инструкции ORACLE-NET для неуправляемого клиента.
При этом, когда вы загружаете Oracle.DataAccess, есть порядок, в котором он пытается найти неуправляемые клиентские dll, которые ему нужны. Из Документация Oracle:
Oracle.DataAccess.dll ищет зависимые неуправляемые библиотеки DLL (такие как как клиент Oracle) на основе следующего порядка:
1.Directory приложения или исполняемого файла.
2.DllPath, заданный конфигурацией приложения или web.config.
3.DllPath, заданный machine.config.
4.DllPath, указанный в реестре Windows.
HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\версия\DLLPath
5.Directories, заданные переменной среды Windows PATH.
Итак, в вашем случае ваше приложение выполнило этот процесс выше и нашло путь, который имеет неуправляемые DLL, которые слишком стары относительно сборки Oracle.DataAccess.dll, которые вы используете.
Просто может быть, что единственный клиент Oracle Client на этой машине слишком стар. Но это вступает в игру, если на компьютере установлено несколько клиентов, а неуправляемые файлы были обнаружены сначала в другой, но более старой установке. Если в дальнейшем проще всего использовать переменную конфигурации dllPath в вашей конфигурации и указать ее в правильной папке Oracle Home Bin:
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
Если вы хотите установить новую копию клиента, xcopy version является самой маленькой и содержит "мгновенный клиент" и точку DllPath выше этого нового местоположения. Но любая установка клиента oracle будет работать.
Но если вы хотите избежать всего этого неуправляемого материала разрешения клиента, посмотрите, можете ли вы обновить приложение, чтобы вместо этого использовать 100% управляемый провайдер - это действительно одна или две управляемые сборки без какой-либо зависимости от неуправляемых файлов.
Возможно также, что вы не загружаете Oracle.DataAccess.dll, который, по вашему мнению, установлен, если он установлен как в вашем каталоге bin, так и в вашем GAC, но я думаю, что это менее вероятный сенарио. Для получения дополнительной информации см. процесс разрешения сборки.
Имеет ли пользователь IIS/IWAM разрешения в каталоге Oracle? Можете ли вы подключиться к этому источнику данных с помощью другого приложения, такого как Excel или Access?
У нас была та же проблема, потому что сборка Oracle.Data.dll на сетевом ресурсе была обновлена нашими администраторами баз данных. Удаление ссылки из проекта и добавление ее снова решило проблему.
У меня такая же проблема, но в моем случае я не могу просто скопировать dll в папку bin, тогда я только "переустанавливаю" версию сборки.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
<bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Всего два шага для решения этой проблемы.
Желаем удачи.
Я не пошел по пути получения новых 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
, поэтому теперь он читает:
<Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>bin\Oracle.DataAccess.dll</HintPath>
</Reference>
Я столкнулся с этой проблемой после того, как я установил Oracle Data Tools для Visual Studio 2015, а затем сражался с Oracle в течение хорошего часа. Я решил попробовать повторно установить клиент Oracle снова вместо этого беспорядка с копированием файлов, изменениями конфигурации и т.д., И это сработало для меня.
Недавно мне пришлось работать над более старым проектом, где решение и все содержащиеся проекты были нацелены на платформу x32. Я продолжал пытаться копировать Oracle.DataAccess.dll и все другие предлагаемые файлы Oracle во всех местах, но каждый раз ударялся о стену. Наконец лампочка в голове загорелась (через 8 часов:)) и попросила проверить установленные сборки ODAC и их платформу. У меня уже установлены все 64-разрядные (x64) клиенты ODAC, но не 32-битные (x32). Установлен 32-разрядный ODAC, и проблема исчезла.
Как проверить версию установленного ODAC: посмотрите в папку C:\Windows\assembly. Свойство "Архитектура процессора" сообщит платформе установленного ODAC.
Восемь часов - это долгое время, когда лампа загорается. Неудивительно, что мне всегда приходится работать на работе:).
Решение Криса работало и на меня. Однако я получил следующее сообщение об ошибке:
Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
По-видимому, на иностранном языке Oraclish это означает, что ваша программа либо предназначена для всех платформ, либо 32-разрядных машин. Просто измените целевую платформу в свойствах проекта на 64-битную и надейтесь на лучшее.
У меня была такая же проблема с Oracle.DataAccess.dll v4.121.2.0. с установкой двух домов (32 и 64-разрядные версии). 32-разрядная версия workerd, 64-разрядная версия не сделала.
В моем случае (после 2 дней попытки) я обнаружил, что проблема связана с разрешениями для 64-битной домашней версии. Многие каталоги в этой версии имели исключительно переопределенные разрешения, в которых у роли "Проверенные пользователи" не было доступа "Чтение", которое по умолчанию установлено в родительском каталоге. Эти подкаталоги включали "bin", "network/admin", "nls", "oracore", "RDBMS" и, возможно, другие. Я нашел их, отфильтровывая "ACCESS DENIED" результат в утилите "Process Monitor" (Procmon.exe) из sysinternals. После того как разрешения были унаследованы из родительского каталога в эти дочерние подкаталоги, все начало работать.
Мне не удалось переопределить разрешения на весь дом оракула, поэтому я сделал их по одному каталогу за раз, но, думаю, если вы не беспокоитесь о безопасности, вы можете reset в целом oracle home directory.
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 и не требует каких-либо записей в реестре.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"]); } } } }