Инициализатор типа для Oracle.DataAccess.Client.OracleConnection вызвал исключение - PullRequest
16 голосов
/ 27 мая 2009

Я разработал приложение, которое использует поставщик данных Oracle для .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 на компьютер, на котором я хочу запустить свое приложение? Если да, есть ли другой способ, которым я не должен устанавливать их, но все еще могу запустить мое приложение?

Спасибо

Ответы [ 7 ]

6 голосов
/ 26 января 2017

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

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

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

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

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

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

6 голосов
/ 30 мая 2013

Хорошо, когда вы точно знаете, что другие приложения, которые использовали тот же процесс, работали; В вашем новом приложении убедитесь, что у вас есть ссылка на доступ к данным и три файла 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

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

Надеюсь, это поможет.

6 голосов
/ 27 мая 2009

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

4 голосов
/ 17 июня 2013

Попробуйте использовать Oracle.ManagedDataAccess.dll

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

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

1 голос
/ 26 июля 2018

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

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

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

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

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

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

К сожалению, обычные обходные пути, включая ODBC, Microsoft Provider Oracle для .NET (да, тот старый, устаревший) и ODP.NET, неуправляемую 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, то это очень легко переключить: просто измените все ссылки на Managed ODP.NET (файлы .csproj в csharp и т. Д.), А затем измените любой using утверждения, например: using Oracle.DataAccess.Client становится using Oracle.ManagedDataAccess.Client и все! (Если вы предположительно не использовали некоторые из более продвинутых функций управления БД в полном клиенте, которые представлены в ODP.NET, Unmanaged, чего я не сделал сам, так что удачи вам в этом ..). А также уничтожьте все эти надоедливые assemblyBindingRedirect узлы из ваших app.config / web.config файлов и никогда больше не потеть в этом мусоре!

Ссылки:

Поиск и устранение неисправностей:

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

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

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

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

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

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

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

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

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

Возможно, существуют сторонние структуры соединений, которые могут обрабатывать Oracle, возможно, кто-то еще может знать о некоторых конкретных.

...