次の方法で共有


WCF チャネル モデルを使用して Oracle データベースに対する操作を呼び出す

IRequestChannel または IOutputChannel 図形を使用して、Oracle Database アダプターに対する操作を呼び出して、アダプターにメッセージを送信できます。 基本的なパターンは、バインド (OracleDBBinding) と接続 URI から作成されたエンドポイントを使用して、必要なチャネル図形のチャネル ファクトリを作成することです。 次に、ターゲット操作の メッセージ スキーマに準拠する SOAP メッセージを表す Message インスタンスを作成します。 その後、チャネル ファクトリから作成されたチャネルを使用して、この メッセージ を Oracle Database アダプターに送信できます。 IRequestChannel を使用している場合は、応答を受け取ります。 Oracle データベースで操作の実行に問題がある場合、Oracle データベース アダプターは Microsoft.ServiceModel.Channels.Common.TargetSystemException をスローします。

WCF で IRequestChannel を使用して操作を送信する方法の概要については、 の「クライアント Channel-Level プログラミング」 https://go.microsoft.com/fwlink/?LinkId=106081を参照してください。

このトピックのセクションでは、WCF チャネル モデルを使用して Oracle データベース アダプターに対する操作を呼び出すのに役立つ情報を提供します。

送信操作のメッセージの作成と使用

Oracle Database アダプターで操作を呼び出すには、 IRequestChannel または IOutputChannel を使用して、ターゲット操作の要求メッセージを送信 しますIRequestChannel を使用する場合、アダプターは応答メッセージで操作の結果を返します。

要求と応答のメッセージ スキーマと各操作のメッセージ アクションの詳細については、「 BizTalk Adapter for Oracle Database のメッセージとメッセージ スキーマ」を参照してください。

要求メッセージを作成し、応答メッセージを使用する方法によって、ノード ストリーミングとノード値ストリーミングのどちらをアダプターによって実行するかが決まります。 これにより、サポートされている操作に対して LOB データのエンド ツー エンド ストリーミングが実行されるかどうかが決定されます。

要求メッセージの作成

要求メッセージは、次の 2 つの方法のいずれかで作成できます。

  • ノード値ストリーミングに使用できるメッセージを作成するには、ノード値ストリーミングを実装する XmlBodyWriter でメッセージ本文を渡す必要があります。

  • ノード ストリーミングに使用できるメッセージを作成するには、 XmlReader でメッセージ本文を渡します。

    通常、ノード値ストリーミングを使用して、要求メッセージ内の Oracle LOB データのエンド ツー エンド ストリーミングをサポートします。 この機能をサポートする唯一の操作は UpdateLOB です。

応答メッセージの使用

応答メッセージは、次の 2 つの方法のいずれかで使用できます。

  • ノード値ストリーミングを使用してメッセージを使用するには、応答メッセージで WriteBodyContents メソッドを呼び出し、ノード値ストリーミングを実装する XmlDictionaryWriter を渡す必要があります。

  • ノード ストリーミングを使用してメッセージを使用するには、応答メッセージで GetReaderAtBodyContents を呼び出して XmlReader を取得します。

    通常、ノード値ストリーミングを使用して、応答メッセージ内の Oracle LOB データのエンド ツー エンド ストリーミングをサポートします。 この機能をサポートする操作は多数あります。

LOB データとメッセージ ストリーミングのサポート

Oracle Database アダプターが LOB データのストリーミングをサポートする方法の詳細については、「 Oracle Database アダプターでのラージ オブジェクト データ型のストリーミング」を参照してください。

LOB データのエンド ツー エンド ストリーミングをサポートするためにコードにノード値ストリーミングを実装する方法の詳細については、「 WCF チャネル モデルを使用した Oracle データベース LOB データ型のストリーミング」を参照してください。

WCF チャネル モデルでの送信操作のトランザクション サポート。

アダプターは、Oracle データベース上の専用トランザクション内で呼び出す各操作を実行します。 TransactionIsolationLevel バインド プロパティを設定することで、これらのトランザクションの分離レベルを制御できます。

このトピックで使用する例について

このトピックの例では、SCOTT を使用します。ACCOUNTACTIVITY テーブル。 これらの成果物を生成するスクリプトは、SDK サンプルと共に提供されます。 SDK サンプルの詳細については、「SDK のサンプル」を参照してください。

チャネルを使用して操作を呼び出す方法

IRequestChannel を使用して操作を呼び出すには、次の手順を実行します。

IRequestChannel のインスタンスを使用して操作を呼び出す方法

  1. チャネル ファクトリ (ChannelFactory<IRequestChannel>) を構築します。 これを行うには、バインディング (OracleDBBinding) とエンドポイント アドレスを指定する必要があります。 バインドとエンドポイント アドレスは、コード内で命令的に指定することも、構成で宣言的に指定することもできます。 構成でバインドとエンドポイント アドレスを指定する方法の詳細については、「 Oracle Database を使用してチャネルを作成する」を参照してください。

    // Create a binding
    OracleDBBinding binding = new OracleDBBinding();
    // Create an endpoint address by using the connection URI
    EndpointAddress address = new EndpointAddress("oracledb://ADAPTER");
    // Create the channel factory
    ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>(binding, address);
    
  2. ClientCredentials プロパティを使用して、チャネル ファクトリのユーザー名パスワード資格情報を設定します。

    factory.Credentials.UserName.UserName = "SCOTT";
    factory.Credentials.UserName.Password = "TIGER";
    
  3. チャネル ファクトリを開きます。

    factory.Open();
    
  4. ファクトリからチャネルを取得して開きます。

    IRequestChannel channel = factory.CreateChannel();
    channel.Open();
    
  5. ターゲット操作の Message インスタンスを作成します。 ターゲット操作のメッセージ アクションが指定されていることを確認します。 この例では、ファイル上に XmlReader を作成することで、メッセージ本文を渡します。 ターゲット操作は、SCOTT/EMP テーブルに対する Select 操作です。

    XmlReader readerIn = XmlReader.Create("SelectAllActivity.xml");
    Message messageIn = Message.CreateMessage(MessageVersion.Default,
        "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select",
        readerIn);
    
  6. チャネルで Request メソッドを呼び出して、Oracle Database アダプターにメッセージを送信し、応答を受信します。 Oracle データベースで例外が発生した場合、アダプターは TargetSystemException をスローします。 (Oracle 以外の例外の場合は、その他の例外が発生する可能性があります)。Oracle エラーの説明は、TargetSystemExceptionInnerException.Message プロパティから取得できます。

    try
    {
        Message messageOut = channel.Request(messageIn);
    }
    catch (Exception ex)
    {
        // handle exception
    }
    
  7. 応答を処理します。 この例では、応答メッセージに 対して GetReaderAtBodyContents が呼び出され、メッセージ本文が取得されます。

    XmlReader readerOut = messageOut.GetReaderAtBodyContents();
    
  8. 応答メッセージの処理が完了したら、リーダーとメッセージを閉じます。

    readerOut.Close();
    messageOut.Close();
    
  9. チャネルとチャネル ファクトリの使用が完了したら、それらを閉じます。 ファクトリを閉じると、ファクトリで作成されたすべてのチャネルが閉じます。

    channel.Close()
    factory.Close();
    
    

    IOutputChannel 図形を使用してメッセージを送信する場合は、次の点を除き、同じ手順に従います。

  • 手順 1 で ChannelFactory<IOutputChannel を> 作成します。

  • 手順 6 でチャネルで Send メソッドを呼び出します。 channel.Send(messageIn);.

  • IOutputChannel に対して返される応答メッセージはありません。

次の例は、 IRequestChannel チャネルを使用して Select 操作を呼び出す方法を示しています。 Select 応答メッセージは XmlReader を使用して使用され、返されるレコードの数がコンソールに書き込まれます。

using System;
using System.Collections.Generic;
using System.Text;

using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
using System.Xml;
using System.IO;
using System.Runtime.Serialization;

namespace RequestChanneSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // The Select operation request message
            const string selectRequestString =
                "\<Select xmlns=\"http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY\"\>" +
                    "<COLUMN_NAMES>*</COLUMN_NAMES>" +
                    "<FILTER>ACCOUNT = 100002</FILTER>" +
                "</Select>";
            try
            {
                // Create binding -- specify binding properties before you open the factory.
                OracleDBBinding odbBinding = new OracleDBBinding();

                // Create address.
                EndpointAddress odbAddress = new EndpointAddress("oracledb://ADAPTER/");

                // Create channel factory from binding and address.
                ChannelFactory<IRequestChannel> factory =
                    new ChannelFactory<IRequestChannel>(odbBinding, odbAddress);

                // Specify credentials
                factory.Credentials.UserName.UserName = "SCOTT";
                factory.Credentials.UserName.Password = "TIGER";

                // Open the factory.
                factory.Open();

                // Get a channel.
                IRequestChannel channel = factory.CreateChannel();

                // Open the channel.
                channel.Open();

                // Create the request message from the string
                StringReader strReader = new StringReader(selectRequestString);
                XmlReader readerIn = XmlReader.Create(strReader);

                Message requestMessage = Message.CreateMessage(MessageVersion.Default,
                    "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select",
                    readerIn);

                Send the message and get a respone
                Message responseMessage = channel.Request(requestMessage);

                // Get an XmlReader from the message
                XmlReader readerOut = (XmlReader) responseMessage.GetReaderAtBodyContents();

                // Count the number of records returned and write to the console.
                readerOut.MoveToContent();
                int numberOfRecordsReturned = 0;
                while (readerOut.Read())
                {
                    if (readerOut.NodeType == XmlNodeType.Element && readerOut.Name == "ACCOUNTACTIVITYRECORDSELECT")
                        numberOfRecordsReturned++;
                }

                Console.WriteLine("{0} records returned.", numberOfRecordsReturned);

                // Close the output reader and message
                readerOut.Close();
                responseMessage.Close();

                //Close channel
                channel.Close();

                //Close the factory
                factory.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

参照

WCF チャネル モデルを使用して Oracle Database アプリケーションを開発する