Инициализатор типа для Oracle.DataAccess.Client.OracleConnection вызвал исключение.

Я разработал приложение, использующее Oracle Data Provider для .NET. Я копирую файл приложения (.exe) и библиотеку ODP (Oracle.DataAccess.dll) на другой компьютер, на котором НЕ установлены клиент Oracle и ODP.NET. Когда я запускаю приложение, я получаю сообщение об ошибке: инициализатор типа для Oracle.DataAccess.Client.OracleConnection выдал исключение.

*****************Exception Text***************
System.TypeInitializationException: The type initlializer for 'Oracle.DataAccess.Client.OracleConnection at Oracle.DataAccess.Client.OracleConnection..cctor()
  --- End of inner exception stack trace ---
  at Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
  ...

Нужно ли мне устанавливать ODP.NET и клиент Oracle на компьютер, на котором я хочу запускать свое приложение? Если да, есть ли другой способ, которым мне не нужно их устанавливать, но я все еще могу запустить свое приложение?

Спасибо


person Sambath Prum    schedule 27.05.2009    source источник


Ответы (7)


И поставщик данных Oracle для .NET (от Oracle), и . Поставщик данных .NET Framework для Oracle (от Microsoft) требует установки клиента Oracle на машина.

person Aleris    schedule 27.05.2009

Два варианта:

  • Установите клиент Oracle на компьютер, на котором вы хотите запустить свою программу.

  • Используйте Oracle.ManagedDataAccess.dll

Вы можете получить его на NuGet (поиск 'oracle managed') или загрузить ODP.NET_Managed.zip (ссылка на бета-версию, но указывает правильное направление)

Я использую это, чтобы на компьютерах, на которых я развертываюсь, не нужно было устанавливать клиент Oracle.

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

person ono2012    schedule 17.06.2013

Самый простой способ!!!

  1. Щелкните проект правой кнопкой мыши и выберите «Управление пакетами NuGet ...».
  2. Найдите Oracle.ManagedDataAccess. Установите его.

Если вы используете Entity Framework и ваша версия Visual Studio - 2012 или более поздняя, то

  1. Снова найдите Oracle.ManagedDataAccess.EntityFramework. Установите его.
  2. Используйте указанные ниже пространства имен в своем файле .cs:
    с использованием Oracle.ManagedDataAccess.Client;
    с использованием Oracle.ManagedDataAccess.EntityFramework;

Готово. Теперь перезапустите визуальную студию и соберите свой код.

Что делают эти пакеты?
После установки этих пакетов не требуется установка дополнительного клиентского программного обеспечения Oracle для подключения к базе данных. .

person Hitsa    schedule 26.01.2017

Хорошо, если вы точно знаете, что другие приложения, использующие тот же процесс, работали; в вашем новом приложении убедитесь, что у вас есть ссылка на доступ к данным и три файла dll ...

Я загрузил ODAC1120320Xcopy_32bit с сайта Oracle:

http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

Ссылка: Oracle.DataAccess.dll (ODAC1120320Xcopy_32bit \ odp.net4 \ odp.net \ bin \ 4 \ Oracle.DataAccess.dll)

Включите эти 3 файла в свой проект:

  • oci.dll (ODAC1120320Xcopy_32bit \ Instantclient_11_2 \ oci.dll)
  • oraociei11.dll (ODAC1120320Xcopy_32bit \ Instantclient_11_2 \ oraociei11.dll)
  • OraOps11w.dll (ODAC1120320Xcopy_32bit \ odp.net4 \ bin \ OraOps11w.dll)

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

Исправление: выделены все три файла и выбрано «Копировать в вывод» = Копировать, если они более новые. Я скопировал, если новее, так как одна из dll превышает 100 МБ, и любые обновления, которые я делаю, не будут копировать эти файлы снова.

Я также столкнулся с ошибкой реестра, это исправило ее.

public void updateRegistryForOracleNLS()
{
    RegistryKey oracle = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\ORACLE");
    oracle.SetValue("NLS_LANG", "AMERICAN_AMERICA.WE8MSWIN1252");
}

Список Oracle nls_lang см. На этом сайте: https://docs.oracle.com/html/B13804_02/gblsupp.htm

После этого все заработало.

Я надеюсь, что это помогает.

person Andrew Grinder    schedule 29.05.2013

Для работы этих классов необходим установленный драйвер клиента oracle.

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

person Lasse V. Karlsen    schedule 27.05.2009
comment
Обратите внимание, что вы также можете получить эту ошибку на 64-битной машине, если вы установили только 32-битный клиент Oracle. - person Klas Mellbourn; 13.04.2010

Вам нужен клиент Oracle: http://www.oracle.com/technology/oramag/oracle/08-nov/o68odpnet.html

person tuinstoel    schedule 27.05.2009
comment
Привет, @tuinstoel, обратите внимание, что ссылка, которую вы предоставили выше, теперь мертва. - person Tshilidzi Mudau; 10.11.2016

Это старый, но все еще актуальный вопрос, и, хотя ответы здесь полезны, ни один ответ полностью не касался обоих вопросов OP.

1. Нужно ли мне устанавливать ODP.NET и клиент Oracle на компьютер, на котором я хочу запускать свое приложение?

ДА - если вы используете ODP.NET, неуправляемый. Это версия, которую вы обычно устанавливаете, когда выбираете «Oracle Data Provider for .NET» в установщике клиента Oracle (например). Вы загружаете это из Oracle (просто погуглите: URL-адреса Oracle часто меняются).

Но если вы используете ODP.NET, Managed (и вы, вероятно, захотите использовать это вместо этого), тогда нет, вам нужно только установить (или развернуть) ODP.NET, управляемый с помощью приложения, а не полный клиент Oracle. Подробнее см. Ниже.

2. Если да, есть ли другой способ, которым мне не нужно их устанавливать, но я все еще могу запустить свое приложение?

Да, есть хоть один способ. И это Управляемый порт ODP.NET.

К сожалению, обычные обходные пути, включая ODBC, Microsoft Oracle Provider for .NET (да, тот старый, устаревший) и ODP.NET, Unmanaged DLL, требуют установки клиента Oracle. Так продолжалось до тех пор, пока наши друзья из Oracle не предоставили нам небольшую (~ 5 МБ) DLL, которая также является управляемой. Это означает, что больше не нужно удалять 32-битные и 64-битные версии для работы с 32-битными и 64-битными клиентами Oracle! И больше никаких проблем с привязкой сборки, когда вы строите против 10.0.2.1 (или что-то еще), но ваши клиенты устанавливают ряд клиентов от 9i до 12c, включая `` g '' посередине), потому что вы можете просто отправить его с вашим приложением и управляйте им через nuget.

Но если вы используете ODP.NET, Managed, который доступен как пакет nuget, вам не нужно устанавливать Oracle Client. Вам нужна только ODP.NET, Managed DLL. И если вы ранее использовали ODP.NET, неуправляемую DLL, переключиться очень просто: просто измените все свои ссылки на управляемый ODP.NET (файлы .csproj в csharp и т. Д.), А затем измените любые операторы using, например: using Oracle.DataAccess.Client становится using Oracle.ManagedDataAccess.Client и все! (Если вы предположительно не использовали некоторые из более продвинутых функций управления БД в полном клиенте, которые представлены в ODP.NET, Unmanaged, чего я сам не делал, так что удачи в этом ..). А также уничтожьте все эти раздражающие assemblyBindingRedirect узлы из ваших _5 _ / _ 6_ файлов и никогда больше не переживайте из-за этого мусора!

Использованная литература:

Исправление проблем:

Эта ошибка обычно означает, что ODP.NET был найден в порядке, но клиент Oracle не найден или не установлен. Это также может произойти, если архитектура не соответствует (32-разрядный клиент Oracle установлен, но пытается использовать 64-разрядный неуправляемый ODP.NET, или наоборот). Это также может произойти из-за проблем с разрешениями, проблем с путями и других проблем с доменом приложения (ваше веб-приложение, ваш EXE или что-то еще), неспособным найти библиотеки DLL Oracle для фактического взаимодействия с Oracle по сети (ODP.NET Unmanaged DLL - это просто оболочки для этого, которые подключаются к ADO и тому подобное).

Общие решения, которые я нашел для этой проблемы:

Приложение 64-битное?

  • Установите 64-битный клиент Oracle (32-битный клиент не работает)

Приложение 32-битное?

  • Установите 32-битный клиент Oracle (64-битный не работает)

Клиент Oracle уже установлен для правильной архитектуры?

  • Проверьте переменные PATH и ORACLE_HOME среды, убедитесь, что Oracle можно найти (в более новых версиях вместо этого может использоваться реестр)
  • Проверьте ORACLE_HOME и настройки в реестре (и помните: реестр может быть 32-битным или 64-битным, поэтому убедитесь, что вы отметили тот, который соответствует вашему приложению!)
  • Проверьте права доступа к папке ORACLE_HOME. Если вы не знаете, где это, проверьте реестр. Я видел случаи, когда рабочий процесс приложения ASP.NET использовал пользователя сетевой службы, и по какой-то причине установка 32-битных и 64-битных клиентов бок о бок приводила к удалению разрешений у первого клиента для группы Authorized Users .. исправление разрешений в домашней папке это исправлено.
  • Как всегда, удобно использовать SysInternals Process Monitor, чтобы узнать, какой файл отсутствует или не может быть прочитан.
person nothingisnecessary    schedule 26.07.2018