Здравствуйте, уважаемые Хабровчане. Сегодня я хочу немного рассказать про ODP.NET, Managed Driver. Сейчас на сайте Oracle доступна версия Beta 11.2.0.3.60, которая показывает нам, каким станет ODP.NET в ближайшем (я надеюсь) будущем.
Итак, чем же примечателен ODP.NET, Managed Driver:
На данный момент не весь функционал старого ODP.NET, Unmanaged Driver поддерживается в Managed Driver (Подробнее здесь, табличка Differences between odp.net, managed driver and odp.net, unmanaged driver). Однако разработчики обещают к релизу это исправить.
Также не все гладко с поддержкой distributed transactions. Во-первых, вызовы Microsoft Distributed Transaction Coordinator API неуправляемы (заявляется, что Oracle с Microsoft идут к 100% управляемости), во-вторых, Oracle Services for MTS работает только с unmanaged ODAC версией (предлагается устанавливать в отдельный Oracle Home), в-третьих, провайдеру приходится подтягивать дополнительную библиотеку Oracle.ManagedDataAccessDTC.dll (две версии: 32-битная и 64-битная)
Итак, теперь немного о переходе с Unmanaged Driver на Managed. Утверждается, что для успешной миграции достаточно добавить в References новую библиотеку, заменить namespace и можно пересобирать проект. Проверим, так ли это.
Возьмем Hello Word приложение для ODP.NET, Unmanaged Drive:
Убедимся, что оно работает.
Затем скачаем с сайта Oracle дистрибутив ODP.NET, Managed Driver (я выбрал Xcopy, распаковал на своем компьютере и выполнил скрипт configure.bat). В References проекта удалим «старый» провайдер и добавим Oracle.ManagedDataAccess.dll. После этого заменим в нашем коде namespace'ы:
Запускаем… и получаем ошибку «ORA-12545: Network Transport: Unable to resolve connect hostname». Да, тут самое время вспомнить, что благодаря ODP.NET, Managed Driver наше приложение более не привязано к клиенту Oracle, установленному на машине, поэтому оно не знает про tnsnames.ora в Oracle Home.
Чтобы решить проблему с подключением достаточно положить файл tnsnames.ora в папку с exe-файлом. Получившиеся exe-файл, библиотеку Oracle.ManagedDataAccess.dll и файл tnsnames.ora можно запустить на компьютере без Oracle Client, чтобы убедиться, что приложение там прекрасно работает.
С помощью Файла конфигурации приложения (Application Configuration File) можно задавать TNS Names более гибко:
Несомненно, новый провайдер ODP.NET, Managed Driver выглядит многообещающе. Управляемость позволит эффективно контролировать ресурсы, а малый размер, независимость от клиента Oracle и разрядности ОС позволит упростить разработку приложений и их развертывание у конечных пользователей. Остается только запастись терпением и пожелать Oracle удачи.
Итак, чем же примечателен ODP.NET, Managed Driver:
- 100% управляемый провайдер
Как постоянно подчеркивает компания Oracle в различных источниках, ODP.NET, Managed Driver — это полностью управляемый провайдер, в отличии от классического ODP.NET. - Одна библиотека размером ~6 мегабайт вместо кучи библиотек на ~150 мегабайт
Для использования провайдера достаточно добавить в проект одну небольшую библиотеку Oracle.ManagedDataAccess.dll.
- Не использует файлы клиента Oracle
Для работы Managed Driver не нужно устанавливать клиент Oracle. Достаточно однойтаблеткибиблиотеки. - Одна сборка для 32-битных и 64-битных систем
Не нужно использовать разные сборки провайдеров для 32-битной и 64-битной систем. - Установка с помощью OUI and xcopy
Можно установить с помощью инсталлятора либо просто распаковать архив и выполнить один скрипт. - Поддерживает Oracle 10.2 и выше
Поддерживаются три последние версии. - Сертифицирован для Net Framework 4 и выше и Visual Studio 2010 и 2012
Ложки дегтя
На данный момент не весь функционал старого ODP.NET, Unmanaged Driver поддерживается в Managed Driver (Подробнее здесь, табличка Differences between odp.net, managed driver and odp.net, unmanaged driver). Однако разработчики обещают к релизу это исправить.
Также не все гладко с поддержкой distributed transactions. Во-первых, вызовы Microsoft Distributed Transaction Coordinator API неуправляемы (заявляется, что Oracle с Microsoft идут к 100% управляемости), во-вторых, Oracle Services for MTS работает только с unmanaged ODAC версией (предлагается устанавливать в отдельный Oracle Home), в-третьих, провайдеру приходится подтягивать дополнительную библиотеку Oracle.ManagedDataAccessDTC.dll (две версии: 32-битная и 64-битная)
Миграция на ODP.NET, Managed Drive
Итак, теперь немного о переходе с Unmanaged Driver на Managed. Утверждается, что для успешной миграции достаточно добавить в References новую библиотеку, заменить namespace и можно пересобирать проект. Проверим, так ли это.
Возьмем Hello Word приложение для ODP.NET, Unmanaged Drive:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Oracle.DataAccess.Client; using Oracle.DataAccess.Types; namespace ConsoleUnmanagedTest { class Program { static void Main(string[] args) { string constr = "user id=scott;password=tiger;data source=orcl"; OracleConnection con = new OracleConnection(); con.ConnectionString = constr; con.Open(); Console.WriteLine("Connected to: " + con.DatabaseName); using (OracleCommand cmd = con.CreateCommand()) { cmd.CommandText = "select ename from scott.EMP where deptno = 30"; using (OracleDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("Name: " + reader.GetString(0)); } } } con.Close(); con.Dispose(); Console.ReadLine(); } } }
Убедимся, что оно работает.
Затем скачаем с сайта Oracle дистрибутив ODP.NET, Managed Driver (я выбрал Xcopy, распаковал на своем компьютере и выполнил скрипт configure.bat). В References проекта удалим «старый» провайдер и добавим Oracle.ManagedDataAccess.dll. После этого заменим в нашем коде namespace'ы:
//using Oracle.DataAccess.Client; //using Oracle.DataAccess.Types; using Oracle.ManagedDataAccess.Client; using Oracle.ManagedDataAccess.Types;
Запускаем… и получаем ошибку «ORA-12545: Network Transport: Unable to resolve connect hostname». Да, тут самое время вспомнить, что благодаря ODP.NET, Managed Driver наше приложение более не привязано к клиенту Oracle, установленному на машине, поэтому оно не знает про tnsnames.ora в Oracle Home.
Чтобы решить проблему с подключением достаточно положить файл tnsnames.ora в папку с exe-файлом. Получившиеся exe-файл, библиотеку Oracle.ManagedDataAccess.dll и файл tnsnames.ora можно запустить на компьютере без Oracle Client, чтобы убедиться, что приложение там прекрасно работает.
С помощью Файла конфигурации приложения (Application Configuration File) можно задавать TNS Names более гибко:
- Задать путь к каталогу с tnsnames.ora
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.manageddataaccess.client> <version number ="4.112.3.60"> <settings> <setting name="TNS_ADMIN" value="D:\OracleTestNetwork\"/> </settings> </version> </oracle.manageddataaccess.client> </configuration>
- Прописать alias'ы:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.manageddataaccess.client> <version number ="4.112.3.60"> <dataSources> <dataSource alias="orcl" descriptor ="(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))"/> </dataSources> </version> </oracle.manageddataaccess.client> </configuration>
Вывод
Несомненно, новый провайдер ODP.NET, Managed Driver выглядит многообещающе. Управляемость позволит эффективно контролировать ресурсы, а малый размер, независимость от клиента Oracle и разрядности ОС позволит упростить разработку приложений и их развертывание у конечных пользователей. Остается только запастись терпением и пожелать Oracle удачи.
