Поставщик не совместим с версией клиента Oracle - PullRequest
153 голосов
/ 18 марта 2009

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

Ответы [ 26 ]

1 голос
/ 15 января 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> 
    
0 голосов
/ 21 апреля 2017

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

  1. Я установил базу данных Oracle Express OracleXE112 , которая уже поставляется с некоторыми предварительно установленными демонстрационными таблицами.
  2. При запуске установщика у вас запрашивают пароль . Я ввел "ххх" в качестве пароля. (не используется в производстве)
  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 (130 МБ!), 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 (160 МБ!), 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 # без какой-либо конфигурации на стороне сервера (только установка по умолчанию):
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"]);
            }
        }
    }
}
0 голосов
/ 18 апреля 2013
  • На 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

0 голосов
/ 17 августа 2015

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

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

0 голосов
/ 21 мая 2013

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

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

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

0 голосов
/ 29 августа 2013

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

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

...