Вопрос по c#, oracle, .net – Как мне использовать Oracle из .NET?

26

К сожалению, я пытаюсь использовать Oracle из .NET, и это похоже на возвращение к 1997 году. Правильное объяснение является признаком слабости, и переменные реестра и среды, похоже, имеют свои особенности.

Так вот, как далеко я продвинулся.

Я заполнил огромную анкету о своей жизни на Oracle.com и скачал

ODBC Windows 64-bit Instance Client, 11.2.0.3.0 и разархивировал его в папку. Basic Windows 64-bit Instant Client, 11.2.0.3.0 и распакуйте его в ту же папку, что и выше.

Я запустил установку .exe (без MSI, помните, что это 1997).

Я добавил переменную среды TNS_NAMES, указывающую на корпоративный файл TNSNames.ora на общем сетевом ресурсе, настроил быстрый DSN в Панели управления и запустил тест - это сработало!

Затем я скачал версию XCOPY последней версии ODP.NET для .NET 4.0 и скопировал ее в папку «Зависимости» в рабочей области управления исходным кодом.

Я добавил ссылку из моего проекта вDependencies\odp.net4\odp.net\bin\4\Oracle.DataAccess.dll

Я прочитал, что мне нужно сообщить управляемому персоналу ODP.NET, где он может найти свои неуправляемые библиотеки Oracle, что, как я предполагаю,Dependencies\odp.net4\bin\OraOps11w.dll но это может быть где-то другие двоичные файлы Oracle?

Теперь я устанавливаю параметр файла конфигурации с именем DllPath. К сожалению, документы Oracle, похоже, не осознают, что файлы конфигурации .NET нуждаются в подключении своих разделов в разделе configSections.

Вот раздел файла конфигурации.

<oracle.dataaccess.client>
  <add key="DllPath" value="D:\Trunk\Dependencies\odp.net4\bin" />
</oracle.dataaccess.client>

Что идет в configSection? Несколько потоков, которые я обнаружил в этом, дают пример и затем говорят «я не знаю, какой тип = должен быть», что является основным битом!

Кто-нибудь может мне посоветовать? Кто-нибудь знает ссылку на Руководство для чайников по запросу Oracle View из .NET?

Могу ли я что-то сделать в 1997 году, чтобы перестать использовать Oracle в 2012 году?

UPDATE

Просто быстрое обновление. Я скопировал файл OraOps11w.dll в папку моего выходного лотка и удалил все изменения в файле web.config, которые я добавил ранее.

Теперь я получаю следующую ошибку, которую я исследую.

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.

Некоторые другие форумы говорят о регистрации Oracle.DataAccess.dll в GAC, чего я стремлюсь избежать, и я не вижу, какая разница будет в любом случае, но я попробую.

UPDATE 2

Регистрация библиотеки Oracle.DataAccess.dll в GAC не имела никакого значения, и я отменил ее регистрацию.

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

UPDATE 3

Сегодня утром я скачал и настроил IIS Express 8.0 RC, который имеет 64-битную версию. 64-разрядная версия не поддерживается VS2010, поэтому ее необходимо запускать из командной строки. Это было довольно просто, посмотрев в диспетчере задач, я смог увидеть, какая командная строка VS использует для iisexpress.exe * 32.

К сожалению, я получаю эту ошибку при просмотре моего сайта на 64-битном IIS Express.

Handler "ExtensionlessUrl-Integrated-4.0" has a bad module "ManagedPipelineHandler" in its module list

Это слишком сложная проблема, поэтому я попытаюсь использовать 32-разрядную версию ODP.NET.

UPDATE 4

Я скачал полную версию 32-битной версии, но испугался, увидев универсальный установщик Oracle. Это выглядит слишком 90-ыми, чтобы доверять моей драгоценной коробке разработчика. Таким образом, я использую 32-битную XCopy. клиент, это позволяет мне открыть домашнюю страницу моего сайта, поэтому ссылки работают. Спасибо за те, которые предложили проблему несовпадения архитектуры 32/64.

Теперь я смотрю на эту ошибку при создании экземпляра нового OracleConnection.

The provider is not compatible with the version of Oracle client

UPDATE 5 Я думаю, что я сделал это.

Итак, я скачал 32-битную версию 11g & quot; Instant Client & quot; и просто поместите его в мою папку \ Dependencies для кодовой базы транка решения. Я добавил эту папку в системную переменную среды% PATH%, а также поместил туда файл OraOps11w.dll.

Наконец, _oracleConnection = new OracleConnection (connectionString) не выдает! Теперь я должен убедиться, что у меня есть бутылка Laphroaig на столе, когда я прихожу, чтобы развернуться в Prod.

Итак, подведем итог: для IIS Express 7.5 (32-разрядный процесс) в Windows 7, 64:

Download and extract the 32-bit 11g "Instant Client" to some folder and add this location to your PATH. Oci.dll is the main Oracle client-side unmanaged library.

Download and extract the 32-bit ODP.NET to some folder.

Copy the OraOps11w.dll to the main folder in which the Instant Client resides (above).

Add a TNS_ADMIN environment variable pointing to a folder in which TNSNames.ora text file resides. This is like a hosts file and maps Oracle service names to server host names.

Close and re-open Visual Studio to ensure you pick-up the new environment variables, and add a reference to the Oracle.DataAccess.dll managed assembly in your ODP.NET folder.

Это должно быть так. Звучит довольно просто, когда знаешь как.

UPDATE 5.1

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

ORA-12541: TNS:no listener

& Quot; & избранные Quot; потому что, откровенно говоря, получение драйверов Oracle для подключения к базе данных Oracle - это огромная PITA. NotMe
@LukePuplett FYI, начиная с 11.2.0.2.5, компонент доступа к данным Oracle для VS поставляется с поставщиком Entity Framework. Кроме того, вы можете использовать некоторый тупой синтаксис для указания строки подключения в конфигурации вашего приложения, а не в TNS_NAMES. Это все еще PITA, но не так плохо. Кроме того, я просто устанавливаю драйвер на 230 МБ на машину, на которой запущена программа, которая должна обратиться к Oracle, чтобы обойти проблему DLL. cadrell0
Хотя ваш заголовок является достаточно продаваемым, он не так хорош для поиска. Пожалуйста, подумайте об изменении. Austin Salonen
Подождите, пока позже, чтобы изменить его, хотя. В противном случае, когда я буду искать его позже, чтобы отправить моему другу, у которого недавно была точно такая же проблема, я не смогу его найти. Его решением было сдаться и использовать что-то еще. Wug
Насколько я знаю, есть несколько провайдеров для работы с Oracle. Разве вы не просто используете OleDbProvider и относитесь к нему как к любой другой базе данных OleDb? Я знаю, что это было целью Microsoft с .lNET - предоставить стандартные методы доступа к данным, но может случиться так, что Oracle (как и DB2 в System i) имеет свои причуды ... Но на ConnectionStrings.com есть информация, которая кажется чтобы показать, что вы можете сделать это таким образом ...connectionstrings.com/oracle David

Ваш Ответ

5   ответов
5

ентским библиотекой Oracle Client и ODAC.

На 64-битной машине (Windows 7+) вам необходимо установить 64-битный клиент Oracle. Это клиент, который ваша машина будет использовать для подключения к базам данных Oracle, которые развернуты локально на вашей машине. Для приложений, размещенных на веб-сервере или другом терминальном сервере, правило то же самое.

Хитрость в том, что ... как разработчик, наши машины также должны иметь инструменты .Net IDE. У Oracle есть дрянное соглашение об именах, но по сути есть 2 части: ODT (инструментарий) и ODAC (доступ к данным). Поставщик данных ODP.Net является частью библиотек ODAC.

Итак ... вернемся к IDE ... Visual Studio является 32-разрядным, и поэтому мы должны установить вышеупомянутые инструменты в 32-разрядном.

При разработке, отладке и т. Д. VS.Net использует 32-битные клиентские библиотеки и библиотеки доступа к данным для работы с Oracle.

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

Это означает, что если вы нацелитесь на 32 и развернетесь на 64, он сломается ... и наоборот. Лучшее, что можно сделать, это оставить его в разделе любой платформы и просто вспомнить, какого черта ты делаешь :)

Еще одна вещь, с которой нужно быть осторожным, это убедиться, что ваши клиентские и ODAC-пакеты имеют одинаковую версию ... вы не хотите иметь клиент 11g R2 и 11g R5 ODAC, потому что, как только вы развернетесь, дерьмо снова сломается.

Предостережение здесь заключается в том, что если вы хотите "встраивать" клиент oracle внутри вашего приложения, и в этом случае OraOps вместе с несколькими другими библиотеками развертываются вместе с приложением - это называется Oracle Instant Client, а также является частью пакета ODAC и входит в их полнофункциональный клиентский пакет.

The good news...

Oracle скоро (1-й квартал 2013 года) выпустит свой следующий пакет ODP.Net ... который будет полностью управляемой библиотекой кода ... что означает, что больше не будет никакого отдельного клиентского или ODAC-пакета для соответствия, и платформа не будет знать о 32 и 64-разрядные различия ... она будет работать так же, как старая библиотека Microsoft, только она будет создаваться и поддерживаться оракулом с более надежным набором функций. Я только хотел бы, чтобы он прибыл раньше.

+1 за единственный ответ во всем, что говорит "ODP.Net"!
Плохая новость: если вы используете любого из провайдеров аутентификации Oracle для ASP.Net (роль, профиль, провайдер членства и т. Д.), Эти провайдеры НЕ совместимы с новым Oracle.ManagedDataAccess.dll. Оракул как-то "забыл" что этим провайдерам также необходим доступ к базе данных. Этот доступ к данным предоставляется внутри этих поставщиков и жестко запрограммирован для поиска более старого Oracle.DataAccess.dll (не "Управляемый"). Так что это еще более усложняет то, что уже сложная версия спагетти требовала, чтобы все это заработало.
1

"An attempt was made to load a program with an incorrect format." это ошибка, которая почти всегда означает, что вы смешиваете 32-битные и 64-битные сборки и библиотеки DLL в .NET.

Я заметил, что вы установили 64-битный клиент Oracle, я предполагаю, что после создания DSN вы работаете на 64-битной версии ОС? Ваша проблема может быть из нескольких связанных сценариев:

Your copy of OraOps11w.dll could be a 32-bit assembly and you are using it in a 64-bit app Your copy of OraOps11w.dll could be a 64-bit assembly and you are trying to use it from a 32-bit app one of the unmanaged dependencies of the Oracle Data Provider for .NET is 32-bit and is failing to load into your 32-bit app (or vice versa)

Я считаю, что если ваше приложение предназначено специально для x86, вы должны установить 32-разрядный клиентский пакет Oracle независимо от базовой платформы ОС (например, вам все равно понадобится 32-разрядный клиент Oracle для 32-разрядного приложения, даже если вы используете 64-разрядную версию). версия Windows)

пару вещей для проверки:

Check your "Platform Target" setting in your assembly that calls the Oracle provider: x64 will always try to run as 64-bit, x86 will always try to run as 32-bit and "Any Platform" will JIT compile to the target OS architecture at runtime (32-bit on an x86 system and 64-bit on a x64 system) Run OraOps11w.dll through corflags.exe (see details at this SO post) to see if it is 32-bit, 64-bit or "Any CPU"

Наконец, вы пытались встроить поставщик данных .NET для Oracle (пространство имен System.Data.OracleClient?)

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

Спасибо за примечание. Мое предложение заключалось в том, чтобы устранить проблему с платформой. Если поставщик .NET работал, то несоответствие x86 / x64, скорее всего, связано с OraOps11w.dll, если он все еще получал ту же ошибку, возможно, существует неуправляемая клиентская библиотека Oracle, которая не соответствует целевой платформе его приложения.
+1 за несоответствие архитектуры. Хотя у меня были огромные проблемы с ASP.NET, даже при установке сборки только на x86.
Странно, я пытался сделать то же самое в Windows 2008 и Windows 7, но это не имело значения для ODP.NET. Я проделал тот же технический прием в Windows 2003 для других приложений (не используя Oracle), и они работали нормально. Я думаю, что Oracle делает что-то странное при загрузке зависимостей.
System.Data.OracleClient больше не поддерживается. В .NET 4 есть только исправления ошибок, новые функции не будут добавлены Microsoft, и они предложили использовать библиотеки Oracle ODP.NET.
@ Джим Вроде не по теме для оригинального постера, но, на ваш взгляд, только для 32-битного asp.net: нам пришлось специально изменить все сборки на целевой x86, а затем выполнить шаг здесь:technet.microsoft.com/en-us/library/cc737351.aspx
1

+1 за вашу настоящую любовь к Oracle, и понимая, что это лучшая компания с лучшими продуктами! ;)

Да, процесс загрузки и установки смешной. Я обычно даже не могу найти нужную клиентскую загрузку на их сайте, а Oracle Universal Installer продукта - это ужасно.

Иногда вам понадобится копияOraOps11w.dll в вашем\bin каталог. Иногда нет. Я никогда не понимал, когда это необходимо, а когда - нет, но я думаю, что если на вас ссылаютсяOracle.DataAccess.dll ISN & APOS; тexactly той же версии, что и установленный клиент Oracle, тогда вам нужноOraOps11w.dll.

Можете ли вы объяснить, что вы пытаетесь сделать в вашем конфигурационном файле сDllPath? Установка Oracle должна была зарегистрировать почти все, что ей нужно, вmachine.config для вашего .NET Runtime. Прошло много времени с тех пор, как я установил ODP.NET, но я не помню, чтобы в app.config было много чего, кроме строки подключения.

Спасибо, Ралли, я использовал DllPath, чтобы указать на OraOps11w.dll, но если вы скажете, что я могу выложить его в папку .NET bin, то я мог бы просто сделать это. Luke Puplett
Да, я всегда просто копировал его в папку \ bin при развертывании. Как ни странно, на некоторых серверах это никогда не заботилось о том, есть ли оно там, а на других серверах это вызывало бы исключение с некоторой ошибкой несоответствия версий (я забыл точное сообщение).
-1

и я обнаружил, что запуск несконфигурированных и сконфигурированных файлов bat в копии версии установки программного обеспечения Oracle.DataAccess.dll 11.x может решить или помочь решить проблему.

НАПРИМЕР. configure.bat xxx.netx xxx \ product \ 11.2.0 \ client_1

Пожалуйста, оставьте это как комментарий. Это не ответ.
3

days в прошлом пытался подключить Oracle в Windows 7.

Проблема, с которой я столкнулся, заключалась в том, что у меня было 32-разрядное приложение ASP.NET с установленными 32-разрядными драйверами Oracle ODP.NET. Я не знал, что, хотя приложение ASP.NET работает как 32-разрядный процесс и требует 32-разрядного ODP.NET, IIS является 64-разрядным процессом и обеспечивает доступ ODP.NET к 64-разрядному реестру. ключи. Вы не упомянули, пытались ли вы настроить Oracle для ASP.NET, но я поделюсь своим исправлением.(although it is for the Oracle 10.2 install).

(I'm copying this verbatim from мой блог)

Note: this forces Oracle 11.2.0.1 to use 32-bit only in a 64-bit environment.

Первой ошибкой, которую я сделал, было установить клиент Oracle 10g в Windows 7. Это НЕ БУДЕТ. Если вы установите его, вам придется выполнить некоторую очистку после этого.

Go to Oracle's site and download/install the 11g 32-bit and 64-bit clients. Go here and follow the "Dummy registry entry" steps. Open regedit and verify that HKLM\SOFTWARE\Wow6432Node\ORACLE\inst_loc points to the proper location (probably C:\oracle\Inventory) Point the registry entry at HKLM\SOFTWARE\Wow6432Node\ORACLE\VOBHOME2.0 to the 32-bit Oracle folder Create an ORACLE_HOME environment variable and point it to the 32-bit folder.

Теперь вы должны быть готовы после перезагрузки.

Если вы попытались установить клиент Oracle 10g, вам придется выполнить некоторую очистку. Во-первых, убедитесь, что Oracle 10g полностью удален, разыменован из вашей переменной PATH и каталог удален. Затем найдите сборки, на которые есть ссылки в GAC:

gacutil /l | find /i "Oracle" > c:\[some directory]\oracle.txt

Найдите строки, относящиеся к Oracle.DataAccess версии 10.2, и удалите их из GAC. В качестве примера (это не сработает, если у вас не установлена одна и та же версия):

gacutil /u "Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342"

Когда я сделал это, мне пришлось удалить три сборки:

Oracle.DataAccess Policy.10.1.Oracle.DataAccess Policy.9.2.Oracle.DataAccess

Опять же, вам, вероятно, потребуется перезагрузить компьютер (эй, это Windows).

Если вам необходимо выполнить какую-либо очистку, я такженаписал об этом в блоге

For reference
В случае ссылки на «фиктивную запись реестра» Шаги умирают, вот текст из этого поста Гади:

& Quot; & Quot; Привет, Бен,

Во время разработки при работе с SQL Server Business Intelligence Development Studio компонент Oracle Connector работает в 32-разрядном режиме и, следовательно, загружает 32-разрядный клиент Oracle.

Скорее всего, вы получаете ошибку, потому что соединитель загружает неправильный клиент Oracle (oci.dll), где служба TNS не определена.

Чтобы решить проблему, у вас есть два варианта:

Specify the Oracle connection string, instead of the TNS service name in the Oracle Connection Manager Editor, for example, in the following format: host:port/service_name

Define a dummy registry entry (Z_SSIS) as follows:

Open the regedit utility. Locate the following Key: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE. Right-Click on ORACLE node and click on New -> Key. Call the new key Z_SSIS (to make sure it's the last entry). Right-Click on the Z_SSIS node and click on New -> String. Name the property ORACLE_HOME. Double-Click on the ORACLE_HOME and set it to the location of the Oracle 32Bit installation home directory you whant to use.

С Уважением,

Гади & Quot; & Quot;

См. Обновление 3 об IIS Express 8.0. Luke Puplett
Я рассмотрел мой процесс IISExpress 7.5 и его 32-разрядный процесс. Даже не подозревал, что MS выпустит 32-битное приложение в 2012 году. Я загружаю бета-версию IISExpress 8, которая будет 64-битной и сообщит о ней. Luke Puplett

Похожие вопросы