Здравствуйте, уважаемые Хабровчане. Сегодня я хочу немного рассказать про 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