共用方式為


使用 WCF 通道模型在 Oracle 資料庫上叫用作業

您可以使用 IRequestChannelIOutputChannel 圖形,在 Oracle 資料庫配接器上叫用作業,以將訊息傳送至配接器。 基本模式是使用系結 (OracleDBBinding) 和從連線 URI 建立的端點,為必要的通道圖形建立通道處理站。 然後,您可以建立 Message 實例,代表符合目標作業之訊息架構的 SOAP 訊息。 然後,您可以使用從通道處理站建立的通道,將此 訊息 傳送至 Oracle 資料庫配接器。 如果您使用 IRequestChannel,您會收到回應。 如果在 Oracle 資料庫上執行作業時發生問題,Oracle 資料庫配接器會擲回 Microsoft.ServiceModel.Channels.Common.TargetSystemException

For an overview of how to send operations using an IRequestChannel in WCF, see "Client Channel-Level Programming" at https://go.microsoft.com/fwlink/?LinkId=106081.

本主題中的各節提供資訊,協助您使用 WCF 通道模型在 Oracle 資料庫配接器上叫用作業。

建立和取用輸出作業的訊息

若要在 Oracle 資料庫配接器上叫用作業,您可以使用 IRequestChannelIOutputChannel來傳送目標作業的要求訊息。 如果您使用 IRequestChannel ,配接器會在回應訊息中傳回作業的結果。

如需有關每個作業之要求和回應訊息架構和訊息動作的詳細資訊,請參閱 BizTalk Adapter for Oracle Database 的訊息和訊息架構

如何建立要求訊息並取用回應訊息,決定節點串流或節點值串流是由配接器執行。 接著,這會決定是否針對支援的作業執行 LOB 資料的端對端串流。

建立要求訊息

您可以使用下列兩種方式之一來建立要求訊息:

  • 若要建立可用於節點值串流的訊息,您必須在實作節點值串流的 XmlBodyWriter 中傳遞訊息本文。

  • 若要建立可用於節點串流的訊息,您可以在 XmlReader中傳遞訊息本文。

    您通常會使用節點值串流來支援要求訊息中 Oracle LOB 資料的端對端串流。 唯一支援此功能的作業是 UpdateLOB。

取用回應訊息

您可以使用下列兩種方式之一來取用回應訊息:

  • 若要使用節點值串流取訊息,您必須在回應訊息上呼叫 WriteBodyContents 方法,並傳遞實作節點值串流的 XmlDictionaryWriter

  • 若要使用節點串流取訊息,您可以在回應訊息上呼叫 GetReaderAtBodyContents 以取得 XmlReader

    您通常會使用節點值串流來支援回應訊息中 Oracle LOB 資料的端對端串流。 有許多作業支援這項功能。

LOB 資料和訊息串流支援

如需 Oracle Database 配接器如何支援 LOB 資料串流的詳細資訊,請參閱 在 Oracle 資料庫配接器中串流大型物件資料類型

如需在程式碼中實作節點值串流以支援 LOB 資料的端對端串流的詳細資訊,請參閱 使用 WCF 通道模型串流 Oracle Database 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. 建立目標作業的 訊息 實例。 請確定已指定目標作業的訊息動作。 在此範例中,訊息本文會透過透過檔案建立 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 資料庫配接器並接收回複。 如果 Oracle 資料庫遇到例外狀況,配接器會擲回 TargetSystemException。 (非 Oracle exceptions.) 您可以從TargetSystemExceptionInnerException.Message屬性取得 Oracle 錯誤的描述。

    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 作業。 使用 XmlReader 取用 Select 回應訊息,而傳回的記錄數目會寫入主控台。

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 資料庫應用程式