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

Спасибо

Ответы

Ответ 2

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

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

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

Ответ 3

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

  • Щелкните правой кнопкой мыши по проекту и выберите " Управление пакетами NuGet..."
  • Найдите Oracle.ManagedDataAccess. Установите его.

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 7

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

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

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

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

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

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

К сожалению, обычные обходные пути, в том числе ODBC, Microsoft Oracle Provider для.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, управляемая DLL. И если вы ранее использовали ODP.NET, Unmanaged DLL, его очень легко переключить: просто измените все свои ссылки на управляемые 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 Unmanaged 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-приложения использовал пользователя Network Service и по какой-то причине установка 32-разрядных и 64-разрядных клиентов бок о бок приводила к удалению разрешений с первого клиента для группы " Authorized Users ". perms на домашней папке исправил это.
  • Как всегда, полезно использовать SysInternals Process Monitor, чтобы узнать, какой файл отсутствует или его невозможно прочитать.