Продолжается подписка на наши издания! Вы не забыли подписаться?

Интеграция Oracle и Windows-приложений

Автор: Juan Carlos Olamendy Turruellas
Опубликовано: 20.10.2008

По распространенному сценарию использования Web-сервисов в создании B2B-систем (business-to-business) вы должны, используя Web-технологии, реализовать некоторые бизнес-функции в виде сервисов, доступных пользователям через границы вашей сети. Обычно для передачи сообщений через границы сети используется HTTP (порт 80) или HTTPS (порт 443), поскольку порты проприетарных протоколов по умолчанию зарыты.

Web-сервисы позволяют интегрировать независимые функции в масштабах предприятия, в то же время поддерживая распределенные транзакции. Я расскажу, как реализовать этот вид функциональности, в частности, как опубликовать PL/SQL-процедуру в виде Web-сервиса, а также как обращаться к ней из клиента Web-сервисов из Windows Communication Foundation (WCF).

Заставить это работать довольно трудно, причем очень просто сделать неверный шаг, особенно когда способы заставить все это работать плохо документированы. Здесь я проведу вас по всему процессу.

В РСУБД Oracle вы определяете бизнес-логику приложения с помощью хранимых процедур на PL/SQL. Oracle Database 10g и Oracle Application Server (Oracle AS) позволяют определять Web-сервис и раскрывать функциональность СУБД через версию OC4J, встроенную в Oracle AS.

Для реализации описываемого здесь решения необходимо основательное понимание WCF. WCF – это единая модель программирования от Microsoft для создания и исполнения сервис-ориентированных приложений. Эта новая коммуникационная подсистема позволяет создавать безопасные и надежные транзакционные решения, взаимодействующие с приложениями на других платформах. WCF объединяет неколько моделей программирования – Web-сервисы, .NET Remoting, распеределенные транзакции и очереди сообщений в одну сервис-ориентированную модель, тем самым снижая сложность решения.

Важная характеристика WCF – работа через Web-сервисы. В основе механизмов коммуникации WCF лежат спецификации Web-сервисов – SOAP, XML, XSD, WSDL и более новые стандарты, включая WS-*-протоколы. Эти спецификации охватывают несколько областей, включая обмен сообщениями, безопасность, надежность, транзакции, топологию сети и модели хостинга.

Разработка серверного кода

Пример, приводимый в этой статье, следует обычному бизнес-сценарию, по которому клиенту нужно интегрировать приложения, работающие с СУБД Oracle под Windows. Вы можете раскрывать, использовать и администрировать всю функциональность, используя такие стандартные интерфейсы, как Web-сервисы, а также надежную модель программирования.

Давайте подключимся к примеру БД, используя учетную запись scott/tiger, и создадим PL/SQL-процедуру, выбирающую информацию об одном сотруднике из таблицы emp, и позволяющую использовать эту функциональность через Web-сервисы. Клиентское приложение будет использовать сервис и показывать информацию в своей Windows-форме.

Прежде чем приступить к реализации примера, вам потребуется установить ПО, перечисленное ниже:

Прежде всего подключитесь к БД и создайте пакет и хранимую процедуру. Подключитесь к БД, исполнив из командной строки команду sqlplusw /nolog. Когда появится консоль SQL*Plus, введите команду connect scott/tiger. Теперь вы подключены к использкуемому по умолчанию экземпляру – в данном случае, к экземпляру ORCL.

Теперь создайте пакет EmpPackage и хранимую процедуру spSelectEmployeeById, которая получает номер работника и возвращает его имя, должность и дату приема на работу (листинг 1). PL/SQL – это используемый в Oracle диалект SQL, который позволяет писать процедуры и функции. Для публикации в виде Web-сервиса процедуру нужно поместить в пакет. Первое выражение в листинге 1 создает PL/SQL-пакет EmpPackage и указывает сигнатуру процедуры. Вы определяете тип данных по ссылкам на каждый параметр, соответствующий типу данных колонки. Например, в процедуре sp-SelectEmployeeById v_empno в сигнатуре emp.empno%type означает, что параметр v_empno того же типа, что и колонка empno в таблице emp. Определение типов данных по ссылке очень полезно и снижает потребность в сопровождении.

Символ "/" приказывает SQL*Plus выполнить PL/SQL-выражения. Второе выражение в листиге 1 создает тело PL/SQL-пакета и реализацию процедуры. Выражение select сохраняет значения колонок ename, job и hiredate из таблицы emp в выходных параметрах v_ename, v_job и v_hiredate.

Листинг 1. PL/SQL – создание EmpPackage и хранимой процедуры spSelectEmployeeById.

Create or replace package EmpPackage is

procedure spSelectEmployeeById(
  v_empno in emp.empno%type,
  v_ename out emp.ename%type,
  v_job out emp.job%type, 
  v_hiredate out emp.hiredate%type);

end EmpPackage;
/

create or replace package body EmpPackage is

procedure spSelectEmployeeById(
  v_empno in emp.empno%type, 
  v_ename out emp.ename%type, 
  v_job out emp.job%type, 
  v_hiredate out emp.hiredate%type)
is
begin
  select ename, job, hiredate
    into v_ename, v_job, v_hiredate
    from emp
    where empno=v_empno;
end;

end EmpPackage;
/

Подключение к OC4J и Oracle

Теперь вы можете опубликовать эту хранимую процедуру как Web-сервис, используя технологии из JDeveloper. JDeveloper предоставляет возможности создания и развертывания Web-сервисов, а также маленький встроенный OC4J для тестирования Web-сервисов.

Чтобы запустить встроенный OC4J, откройте окно командной строки, перейдите в каталог %JDEVELOPER_HOME%\jdev\bin и введите start_oc4j. При первом исполнении этой команды у вас запросят пароль к серверу приложений. После ввода пароля дождитесь появления сообщения "Oracle Containers for J2EE 10g (10.1.3.1.0) initialized." После этого можете свернуть окно, но не закрывайте его.

Теперь откройте JDeveloper и создайте соединение с OC4J. Перейдите в View | Connection Navigator, откройте окно Connection Navigator, щелкните правой кнопкой мыши по узлу Application Server, выберите New Application Server Connection и щелкните Next на странице приветствия. На странице Type введите значащее имя для вашего соединения, например, oc4jconn, и нажмите Next. На странице Authentication введите пароль для пользователя oc4jadmin (это тот пароль, который вы выбрали при первом запуске OC4J). Выберите Deploy Password и нажмите Next. На странице Connection нажмите Next, a на странице Test щелкните по Test Connection.


Рисунок 1.

Чтобы создать подключение к БД, перейдите в Connection Navigator, щелкните правой кнопкой по узлу Database, выберите New Database Connection и нажмите Next на странице приветствия. На странице Type введите значащее имя для вашего соединения, например, oracleconn, и нажмите Next. На странице Authentication введите scott в поле Username и tiger в поле Password. Выберите Deploy Password и нажмите Next. На странице задайте следующие значения: Driver=Thin, Hostname={адрес или DNS СУБД}, JDBC Port:1521 и SID=ORCL. Нажмите Next, а затем выберите Test Connection на странице Test.

Теперь нужно создать и развернуть PL/SQL Web-сервис. Для создания приложения и проекта выберите в главном меню View | Application Navigator и откройте окно Applications Navigator. Щелкните правой кнопкой по узлу Applications, выберите New Application, введите значащее имя для приложения, например, PLSQLWS_App, и нажмите OK. В диалоге Create Project введите имя проекта, например, PLSQLWS_Proj (в JDeveloper одно приложение содержит несколько проектов, а один проект содержится в только одном приложения).

В окне Applications Navigator щелкните правой кнопкой по узлу PLSQLWS_Proj и выберите New… из контекстного меню. В окне New Gallery в дереве Categories выберите узел Business Tier | Web Services, а в нем – PL/SQL Web Service (рисунок 1). Нажмите ОК. Появится мастер создания Web-сервисов.

На странице Select J2EE Web Service Version выберите J2EE 1.4 (JAX-RPC) и нажмите Next. Нажмите Next на странице приветствия, а на странице Database Connection and Package введите следующие значения: Database Connection=oracleconn (созданное подключение к СУБД), Database Package=EMPPACKAGE (пакет, приведенный в листинге 1), Web Service Name=EmployeeWService и Java Package=com.plsqlpackage. Выберите SOAP 1.1 Binding и нажмите Next. На странице Message Format нажмите Next, а на странице Program Units выберите процедуру SPSELCTEMPLOYEEBYID и нажмите Next. Пропустите страницы Type Mapping Options page и User Defined Type Mapping. Наконец, нажмите Next на странице Handler Details, чтобы закончить создание этого Web-сервиса.

Чтобы развернуть Web-сервис на OC4J, в Applications Navigator щелкните правой кнопкой по файлу WebServices.deploy в узле проекта Resources и выберите Deploy to|oc4jconn. Теперь откройте в браузере страницу администрирования OC4J (http://localhost:8888/em), введите пароль и посмотрите на тестовую страницу Web-сервиса (рисунок 2).


Рисунок 2.

Разработка клиентских компонентов

Теперь перейдем к созданию клиентских компонентов, взаимодействующих с сервисами на сервере. Клиент будет включать приложение Windows Forms, использующее функциональность PL/SQL Web-сервиса с помощью технологии WCF. Откройте VS .NET, выберите File | New | Project и в дереве Project Types выберите Windows. Выберите Windows Application в Templates, после чего введите значащие имена для проекта, решения и каталога, в котором будут храниться соответствующие файлы.

Откройте командную строку, перейдите в каталог, содержащий файлы проекта, и выполните команду "svcutil http://localhost:8888/PLSQLWS_App-PLSQLWS_Proj-context-root/EmployeeW-ServiceSoapHttpPort?wsdl", где ссылку на localhost нужно заменить именем сервера, где развернут PL/SQL Web-сервис. Утилита svcutil.exe позволяет создавать прокси-классы WCF, контракты и конфигурационные файлы для доступа к Web-сервисам. В данном случае вы передаете URL как параметр, содержащий WSDL-документ, который содержит метаданные, описывающие всю информацию, нужную для доступа к конечной точке сервиса. Создание WCF-прокси не интегрировано в VS .NET, так что svcutil.exe приходится вызывать из командной строки, а не из среды разработки.

Теперь нужно подключить файл сгенерированного прокси к проекту. Перейдите в Solution Explorer и щелкните по кнопке Refresh, чтобы увидеть сгенерированные файлы. Щелкните правой кнопкой по файлу EmployeeWService.cs и выберите Include In Project. Добавьте к проекту конфигурационный файл приложения (App.config) и скопируйте в него все содержимое output.config. Конфигурационный файл содержит информацию об удаленных сервисах, конечных точках, адресах, контрактах, операциях и привязках. Этот файл в случае надобности можно редактировать вручную. Наконец, добавьте ссылку на сборки System.ServiceModel и System.Runtime.Serialization, содержащие объекты, реализующие механизм связи технологии WCF.

Теперь перейдем к интерфейсу пользователя. Добавьте два элемента управления Label, чтобы вывести пользователю осмысленные сообщения. Затем добавьте два элемента управления Textbox – одно для номера работника, а другое (read-only) для вывода информации о работнике. Наконец, добавьте одну кнопку для отправки запроса к PL/SQL Web-сервису (листинг 2)

Листинг 2. C# – дизайн UI

using System.Windows.Forms;
using com.plsqlpackage.EmployeeWService.wsdl.types;

namespace WCF_Employee_Win
{
  public partial class MainForm : Form
  {
    public MainForm()
    {
      InitializeComponent();
    }

    private void button1_Click(sender, EventArgs e)
    {
      int empNo;
      int.TryParse(_tbEmpNo.Text.Trim(), out empNo);

      if (empNo != 0)
      {
        EmployeeWServiceClient objProxy = new EmployeeWServiceClient();
        EmployeeWServiceUser_spselectemployeebyid_Out response = 
          objProxy.spselectemployeebyid(empNo);

        this.m_tbResult.Text = string.Format("Name={0} HireDate={1} Job={2}", 
          response.venameOut, 
          response.vhiredateOut, 
          response.vjobOut); 

        objProxy.Close();
      }
    }
  }
}

Теперь создайте экземпляр WCF прокси-класса EmployeeWServiceClient (objProxy), а затем пошлите сообщение сервису, используя метод spselectemployeebyid, передавая номер работника как параметр. Экземпляр объекта response класса EmployeeWServiceUser_spselectemployeebyid_Out получает ответ и ссылается на него. Форматированный результат показывает имя, дату приема на работу и должность выбранного работника. Вы можете обращаться к этой информации через свойства ответного сообщения (venameOut, vhiredateOut, и vjobOut). Лучше закрывать прокси, если клиент больше не использует его. Это закрывает соединение и сессию работы с сервисом.

Конфигурационный файл, сгенерированный утилитой svcutil.exe (листинг 3), описывает расположение и контракты конечной точки сервиса, а также нижележащие механизмы доступа к ней. Этот файл перечисляет все конечные точки сервиса.

Листинг 3. Конфигурационный файл

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="EmployeeWServiceSoapHttp" 
          closeTimeout="00:01:00"
          openTimeout="00:01:00" 
          receiveTimeout="00:10:00" 
          sendTimeout="00:01:00"
          allowCookies="false" 
          bypassProxyOnLocal="false" 
          hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" 
          maxBufferPoolSize="524288" 
          maxReceivedMessageSize="65536"
          messageEncoding="Text" 
          textEncoding="utf-8" 
          transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas 
            maxDepth="32" 
            maxStringContentLength="8192" 
            maxArrayLength="16384"
            maxBytesPerRead="4096" 
            maxNameTableCharCount="16384" />
          <security mode="None">
            <transport 
              clientCredentialType="None" 
              proxyCredentialType="None"
              realm="" />
            <message 
              clientCredentialType="UserName" 
              algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address=
        "http://crvc18.crvc.tel.etecsa.cu:8888/
PLSQLWS_App-PLSQLWS_Proj-context-root/EmployeeWServiceSoapHttpPort"
        binding="basicHttpBinding" 
        bindingConfiguration="EmployeeWServiceSoapHttp"
        contract="EmployeeWService" 
        name="EmployeeWServiceSoapHttpPort" />
    </client>
  </system.serviceModel>
</configuration>

Теперь, когда у вас есть шаблон создания сервис-ориентированных приложений, работающих на разных платформах, вы можете адаптировать приведенный в статье пример к вашей собственной ситуации. Вы можете создать собственные PL/SQL-пакеты и процедуры, соответствующие вашей бизнес-логике, и воспользоваться механизмами ссылок на типы данных. Затем вы можете использовать хранимые процедуры как Web-сервисы, открытые для клиентов внутри вашей организации и за ее пределами.


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

Copyright © 1994-2016 ООО "К-Пресс"