Как написать приложение .Net, которое работает как с SqlServer, так и с Oracle (теперь, когда System.Data.OracleClient устарела)

StackOverflow https://stackoverflow.com/questions/1193066

Вопрос

смотрите также Пространство имен System.Data.OracleClient прекращено?

(Во-первых, не паникуйте, System.Data.OracleClient еще не удаляется Microsoft, однако его нет в клиентской версии .net 4)

Это использование возможно с помощью System.Data.OracleClient, однако Microsoft решила отказаться от OracleClient.(OracleClient — это поставщик ADO.NET для Oracle, разработанный Microsoft и поставляемый как часть .NET Framework.)

Вы можете использовать ODP.Net, однако хотите ли вы, чтобы ваши клиенты Sql Server установили ODP.Net?(Хотите ли вы, чтобы кто-нибудь из ваших клиентов установил программное обеспечение Oracle?)

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

Переход с C# на Java — не лучший вариант, поскольку я программист C# и хочу иметь возможность зарабатывать на жизнь!

Как и большинству независимых поставщиков программного обеспечения, которые должны поддерживать несколько СУБД, нам нужно только решение, которое позволит нам использовать небольшое подмножество Oracle, такое же, как SqlServer.Поэтому System.Data.OracleClient оказался для нас достаточно мощным.

(Может быть, нам следует просто начать хранить все данные в плоских файлах, чтобы администратор базы данных клиента перестал пытаться указывать нам, как писать программное обеспечение.Администраторы баз данных Oracle хуже!)


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

Если бы я использовал JAVA, я мог бы просто использовать драйверы JDBC типа 4.Microsoft предоставляет один для SqlServer, а Oracle — для Oracle.Однако похоже, что Oracle хочет максимально усложнить использование .Net, а Microsoft желает максимально усложнить использование Oracle.


До сих пор лучший вариант выглядит как dotConnect от devArt.

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


Похоже, что Oracle, возможно, собирается выпустить разумного полностью управляемого провайдера ADO.NET, который, возможно, даже будет легко установить!видеть здесь заявлено, что бета-версия – 2011 г., производство – конец 2011 г.

Это было полезно?

Решение

РЕДАКТИРОВАТЬ:Полностью управляемый ODP.NET теперь доступен в рабочей среде.Он очень мал (менее 10 МБ) и не зависит от других файлов.Вы можете получить его здесь:

http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html

Оригинальный ответ:

Один из способов легко Чтобы убедиться, что необходимое клиентское программное обеспечение Oracle (включая ODP.NET) всегда доступно на компьютере развертывания, необходимо встроить его в свое приложение.ODP.NET получил много теперь, когда доступен XCOPY ODP.NET, встроить его стало проще.Скачать его можно по этой ссылке:

http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

При использовании XCOPY ODP.NET все, что вам нужно сделать при развертывании приложения, — это следующее:

1) Скопируйте приложение на целевой компьютер.

2) Запустите «install.bat», который копирует пару Oracle DLL на целевой компьютер (включая ODP.NET и клиентское программное обеспечение Oracle (OCI)).

3) Запустите «configure.bat», который выполнит «gacutil» и обновит реестр целевой машины.

4) Предоставьте приложению информацию о строке подключения.Вы можете использовать строку подключения EZCONNECT («имя_хоста@имя_службы») или вы (или ваш клиент) можете поделиться уже существующими конфигурациями sqlnet, установив запись реестра TNS_ADMIN или переменную среды, чтобы она указывала на другой домашний сервер Oracle, для которого уже настроены псевдонимы подключения sqlnet.

Вот и все!Это действительно так просто.

Я надеюсь, что вы внимательно посмотрите на ODP.NET XCOPY по ссылке выше, чтобы убедиться, насколько легко в наши дни встроить ODP.NET в ваше приложение.


Дополнительные замечания:

Если вы решите не встраивать ODP.NET в свое приложение, как в случае с Microsoft OracleClient, так и в случае с ODP.NET, на любой машине развертывания должно быть установлено дополнительное клиентское программное обеспечение Oracle (OCI).Единственная разница между этими двумя случаями заключается в том, что когда вы используете ODP.NET, он также должен существовать на компьютере развертывания.Хорошей новостью является то, что типичная установка Oracle на компьютере вашего клиента уже включает ODP.NET.

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

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

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

Кристиан Шэй

Оракул

Не стесняйтесь оставлять свои отзывы об этой и других будущих функциях на нашем веб-сайте с запросами функций:http://apex.oracle.com/pls/apex/f?p=18357:46

Другие советы

Вы смотрели на альтернативных поставщиков Oracle, таких как dotConnect от devArt?Этот драйвер, например, представляет собой 100% управляемый код, поддерживает множество расширенных функций Oracle, обеспечивает поддержку Entity Framework (я уверен, что когда-нибудь это появится в ODP.NET).

Существует множество других функций (например, поддержка модели поставщика ASP.NET), которых мы не получили до выпуска ODP.NET 11g.Довольно либеральное лицензирование и разумная цена.Также имеется собственный профайлер, если я правильно помню.

В их тесты, работает лучше, чем ODP.NET.Я хотел бы указать вам на что-то с открытым исходным кодом, но, по моему опыту, как только вы купили Oracle в качестве базы данных, вы уже приняли тот факт, что вы будете вкладывать немного денег в инструменты, связанные с базой данных. .

Есть большая разница между объявлением устаревшим и удалением.

Если вы просто используете подмножество функций, общих как для SQL Server, так и для Oracle, то у вас все будет хорошо, если вы перейдете на ASP.Net 4.0 и продолжите программировать так, как вы это делаете сейчас.

Используя что-то вроде EntitySpaces, позволит вам быть относительно независимым от поставщика.(он использует OracleClient в своем DAL)

Полностью согласен с Филиппом в том, что клиентское программное обеспечение Oracle доставляет неудобства.Я потерял счет, сколько раз я его устанавливал, и ненавидел этот опыт.Предпочитайте мне MySQL, SQLServer или даже Access.

(Вообще-то я беру свой комментарий обратно):-)

Используйте «Шаблон фабрики поставщиков», который по сути использует фабрику для предоставления поставщика данных, который полностью абстрагируется от методов запроса базы данных, которые его используют, здесь является Сообщение блога с некоторым примером кода, который также показывает, как это сделать Жан-Поль Будху о демистификации шаблонов проектирования В части 1 на dnrtv.com также показано, как это сделать.

Это очень крутая штука, по сути, у вас есть фабрика, которая предоставляет методы для получения соединения.

public IDbConnection GetConnection()
{
     IDbConnection connection =  _frameworkDBProviderFactory.CreateConnection();
     connection.ConnectionString = _authenticationSettings.ConnectionString;            
     return connection;
} 

хотя интерфейс, позволяющий вызывать любой тип базы данных, объект подключения которого реализует интерфейс IDbConnection (SQLServer, MySQL, Oracle и т. д.), и он просто работает.

Абстрагируясь от того, какую БД вы используете, вы можете даже поменять их местами во время выполнения, и ваше приложение никогда об этом не узнает, в этом нет необходимости, поэтому для подключения к базе данных Orical загрузите ОДП.НЕТ, то же самое с MySQL-коннектор оба реализуют IDbConnection и пишут свой код для абстрактного соединения.

В дополнение к тому, что предлагали другие, вы можете рассмотреть возможность использования шаблона Provider и ODP.NET Oracle.

Быть независимым от базы данных — очень сложная работа, потому что здесь есть много специфических вещей (именование переменных привязки, кавычки объекта и т. д.).Используйте библиотеку типа NHibernate который создает прослойку между вашим приложением и реальной базой данных.

Если вам нужно подключиться к обеим базам данных, тогда это вопрос развертывания.Если вы подключаетесь к oracle (используя System.Data.OracleClient или Oracle.DataAccess.Client), вам необходимо установить клиентское программное обеспечение oracle на вашем компьютере.Поставщика базы данных, развернутого с помощью платформы, недостаточно для подключения к базе данных Oracle.

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

Для лучшего развертывания Oracle ввел концепцию мгновенный клиент.Этот клиент можно развернуть с помощью развертывания xcopy.Начиная с oracle 11, мгновенный клиент может быть связан с ODP.Net.

Установка ODP.Net описана в посте Кристиана Шея.

Сборка Oracle.DataAccess не должна находиться в глобальном кэше сборок.Поместите его в свой каталог bin.Мгновенный клиент, используемый Oracle.DataAccess, не должен находиться в другом каталоге на вашем клиентском компьютере.Поместите его в свой каталог bin.А документация описывает, как настроить приложение для поиска мгновенного клиента.

Будет ли возможно использование ODBC для обоих?

Пока вы не вызываете объект ODP.Net, вам не нужно устанавливать ODP, если вы получаете доступ только к SQL Server.

Я считаю, что ODBC по-прежнему может использовать как SQL Server, так и Oracle с некоторой прозрачностью, поэтому я бы рассмотрел возможность использования ADO.Net с поставщиком ODBC.Он не даст вам всей производительности и возможностей, которые могли бы дать SqlClient или OracleClient, но он должен быть очень близок к тому же коду для Oracle или SQL Server.

Вы можете рассмотреть возможность использования ДоСоник 3.0!Я запускаю приложение на основе SQLServer, MySQL и SQLite, и пользователь может переключаться между этими тремя во время выполнения!

По моему опыту, вы не можете просто развернуть DLL поставщика данных ODP.NET.Oracle требует домашней установки для чего-то большего, чем конфигурация по умолчанию (например, мы используем разрешение имен LDAP, требуя, чтобы файл LDAP.ora находился в специальном домашнем пути).

Однако ODP.NET прекрасно реализует стандарты ADO.NET 2.0 (DbProviderFactory и т. д.).И в течение некоторого времени в моей компании я программировал на основе базовых классов (DbConnection, DbCommand и т. д.) без необходимости использования конкретных классов.

Я предлагаю, чтобы этот доступ к данным работал, — использовать/следовать рекомендациям в Энтлиб или используйте NHibernate.

Если у вас возникли проблемы с логистикой или ИТ при установке ODP.NET или доставке его вашему заказчику/клиенту, я предлагаю вам поговорить с вашими ИТ-специалистами и Oracle о решениях для этой проблемы.

Клиент должен установить odp.net и клиент Oracle на свои машины.Не следует его развертывать.Ваше приложение найдет необходимые библиотеки Oracle в GAC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top