ODP.NET, Managed Driver: что день грядущий нам готовит

в 13:56, , рубрики: .net, oracle, Песочница, метки: ,

Здравствуйте, уважаемые Хабровчане. Сегодня я хочу немного рассказать про ODP.NET, Managed Driver. Сейчас на сайте Oracle доступна версия Beta 11.2.0.3.60, которая показывает нам, каким станет ODP.NET в ближайшем (я надеюсь) будущем.

Итак, чем же примечателен 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 удачи.

Автор: Kluge

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js