次の方法で共有


IMetadataRetrievalContract を使用して Oracle データベースのメタデータを取得する

Microsoft BizTalk Adapter for Oracle Database では 、IMetadataRetrievalContractエンドポイントが公開されています。このエンドポイントを使用すると、Oracle データベース成果物を参照および検索したり、Web サービス記述言語 (WSDL) ドキュメントの形式で操作のメタデータを取得したりできます。

IMetadataRetrievalContract インターフェイスは、Microsoft Windows Communication Foundation (WCF) 基幹業務 (LOB) アダプター SDK によって実装され、メタデータの参照、検索、および取得機能を提供します。 WCF LOB アダプター SDK は、 IMetadataRetrievalContract インターフェイスに加えて、インターフェイスを実装する MetadataRetrievalClient クラスを公開します。 メタデータを操作するには、 IMetadataRetrievalContract チャネルまたは MetadataRetrievalClient を使用できます。メタデータの参照、検索、および取得に公開されるメソッドは、いずれの場合も同じです。

次のセクションでは、 IMetadataRetrievalContract インターフェイスの使用方法について説明します。

IMetadataRetrievalContract インターフェイス

次の表は、 IMetadataRetrievalContract インターフェイスを操作するときに使用される重要なクラスに関する情報を示しています。

クラスまたはインターフェイス 説明
IMetadataRetrievalContract インターフェイス

(Microsoft.ServiceModel.Channels)
Browse メソッド、Search メソッド、GetMetadata メソッドを定義します。 これらのメソッドは、 IMetadataRetrievalContract チャネルまたは MetadataRetrievalClient を使用してアダプター メタデータを操作することによって呼び出します。
MetadataRetrievalClient クラス

(Microsoft.ServiceModel.Channels)
IMetadataRetrievalContract インターフェイスを実装します。 OracleDBBindingEndpointAddress を指定することで、このクラスのインスタンスを作成し、Oracle データベース用に構成できます。 その後、そのメソッドを呼び出してメタデータを操作できます。
MetadataRetrievalNode クラス

(Microsoft.ServiceModel.Channels)
アダプターのメタデータ ノードを表します。 Browse メソッドと Search メソッドは、この型のノードを返し、GetMetadata メソッドはこの型のノードをパラメーターとして受け取ります。
ServiceDescription クラス

(System.Web.Services.Description)
有効な WSDL ドキュメント ファイルを作成および書式設定する手段を提供します。 GetMetadata メソッドは ServiceDescription オブジェクトを返します。

メタデータ ノード ID

アダプターは、メタデータをノードの階層ツリーとして整理します。 このツリー構造内には、次の 2 種類のメタデータ ノードがあります。

  • 操作ノード は、アダプターが Oracle データベース成果物に対して表示する操作を表します。 操作ノードはツリーの葉です。

  • カテゴリ ノード は、Oracle データベース成果物と、アダプターでの操作に直接対応しない Oracle データベース 成果物のグループを表します。 カテゴリ ノードはツリーの分岐です。他のカテゴリ ノードや操作ノードが含まれています。 たとえば、Oracle のテーブルとパッケージはカテゴリ ノードとして表されます。

    アダプターによって表示される各メタデータ ノードは、一意のノード ID で識別されます。 アダプターによって表示されるメタデータ ノード ID の詳細については、「 メタデータ ノード ID」を参照してください。 IMetadataRetrievalContract インターフェイスを使用してメタデータを参照、検索、および取得するときに、これらのノード ID を使用してターゲット Oracle データベース成果物を指定します。

結合プロパティ

メタデータを操作するために IMetadataRetrievalContract チャネルまたは IMetadataRetrievalClient のどちらを使用する場合でも、インスタンスの作成時に OracleDBBinding を指定する必要があります。

アダプターによるメタデータの生成方法に影響を与えるバインディング プロパティがいくつかあります。 これらのプロパティは次のとおりです。

  • EnableSafeTyping

  • UseSchemaInNamespace

  • PollingStatement

Von Bedeutung

POLLINGSTMT 操作のメタデータを取得する場合は、 PollingStatement バインディング プロパティを設定する必要があります。

メタデータ取得オブジェクトを開く前に、これらのバインド プロパティがアプリケーションに必要な値に設定されていることを確認する必要があります。 Oracle データベース アダプターのバインド プロパティの詳細については、「Oracle Database アダプターのバインド プロパティの読み取り」を参照してください。

メタデータ ノードの閲覧

Browse メソッドを使用して、親ノードに含まれるすべてのメタデータ ノードを返します。 次の例では、Oracle データベースの最初の 3 つのスキーマを参照します。 この例では、 クライアントMetadataRetrievalClient のインスタンスです。

// The first parameter is the node ID.   
// The second parameter is the start index.  
// The third parameter is the maximum number of nodes to return.  
                MetadataRetrievalNode[] nodes = client.Browse(MetadataRetrievalNode.Root.NodeId, 0, 3);  

Von Bedeutung

カテゴリ ノードのみを参照できます。操作ノードを参照することはできません。

メタデータ ノードの検索

Search メソッドを使用して、親ノードに含まれるノードの検索を実行します。 アダプターは、検索式でワイルドカード文字をサポートしています。たとえば、0 個以上の文字に一致するパーセント (%) ワイルドカード文字を指定できます。 次の例は、文字列 "EMP" を含む SCOTT スキーマ内のすべてのテーブルの検索を示しています。 この例では、 クライアントMetadataRetrievalClient のインスタンスです。

// Search for all nodes that contain "EMP" under the SCOTT.Table node.  
// The parameters are the parent node ID, the search expression, and   
// the maximum number of nodes to return.  
IMetadataRetrievalNode[] nodes = client.Search("http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table", "%EMP%", 3);  
  

Von Bedeutung

検索は、限られたノード セットでのみサポートされます。 検索がサポートされているノードと、検索式でサポートされるワイルドカード文字の詳細については、「 メタデータ ノード ID」を参照してください。

操作のメタデータの取得 (WSDL)

GetMetadata メソッドを使用して、操作ノードのグループのサービス記述 (WSDL ドキュメント) を取得します。 SCOTT.EMP テーブルに対してアダプターが利用可能にするすべての操作を含むサービスの説明を取得するために、次の例ではノード ID を指定します。 この例では、 クライアントMetadataRetrievalClient のインスタンスです。

// Get a service description that contains all of the operations   
// surfaced for the SCOTT.EMP table. The IsOperation  
// property is set false because this is a category node.  
nodes = new MetadataRetrievalNode[1];  
nodes[0] = new MetadataRetrievalNode();  
nodes[0].NodeId = "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP";  
nodes[0].IsOperation = false;  
System.Web.Services.Description.ServiceDescription description = client.GetMetadata(nodes);  
  

Von Bedeutung

IsOperation プロパティは、カテゴリ ノードの場合は false、操作ノードの場合は true にする必要があります。

MetadataRetrievalClient の使用

MetadataRetrievalClient の作成と使用は、他の WCF クライアントとほぼ同じです。 クライアントを作成するには、 OracleDBBinding のエンドポイントとインスタンスを指定します。 これは、構成で宣言的に行うか、コード内で命令的に行うことができます。 次に、 MetadataRetrievalClient のメソッドを呼び出して、アダプターからメタデータを参照、検索、および取得します。

次の例は、 MetadataRetrievalClient を使用して Oracle Database アダプターからメタデータを参照、検索、および取得する方法を示しています。 この例では、次の例を示します。

  • Oracle Database スキーマのメタデータ ツリーのルート ノードを参照します。

  • 文字列 "EMP" を含む名前を持つ SCOTT スキーマ内のテーブルを検索します。

  • SCOTT でサポートされているすべての操作のメタデータの取得。カテゴリ ノードを GetMetadata メソッドに渡すことによる EMP テーブル。

  • POLLINGSTMT 操作ノードを GetMetadata メソッドに渡して、POLLINGSTMT 操作のメタデータを取得しています。.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
using System.ServiceModel;  
using Microsoft.Adapters.OracleDB;  
using Microsoft.ServiceModel.Channels;  
  
using System.Web.Services.Description;  
  
namespace OracleMetadataRetrieval  
{  
    class NodeWriter  
    {  
        // This method writes the value of a collection of metadata retrieval nodes  
        // to the console  
        public void Write(string title, MetadataRetrievalNode[] nodes)  
        {  
            Console.WriteLine(title);  
            Console.WriteLine();  
  
            //write all the nodes returned to the console.  
            foreach (MetadataRetrievalNode node in nodes)  
            {  
                Console.WriteLine("NodeId = " + node.NodeId);  
                Console.WriteLine("\tDirection   = " + node.Direction.ToString());  
                Console.WriteLine("\tIsOperation = " + node.IsOperation.ToString());  
                Console.WriteLine("\tDisplayName = " + node.DisplayName);  
                Console.WriteLine("\tDescription = " + node.Description);  
            }  
            Console.WriteLine();  
        }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            MetadataRetrievalClient client = null;  
            NodeWriter nodeWriter = new NodeWriter();  
  
            try  
            {  
                // create a binding and   
                // set the PollingStatement binding property if you want to  
                // return metadata for the POLLINGSTMT operation  
                OracleDBBinding binding = new OracleDBBinding();  
                binding.PollingStatement = "SELECT * FROM EMP";  
  
                // Set PollingId parameter if you want to alter the namespace of the POLLINGSTMT operation  
                EndpointAddress address = new EndpointAddress("oracledb://ADAPTER?PollingId=1");  
  
                client = new MetadataRetrievalClient(binding, address);  
                client.ClientCredentials.UserName.UserName = "SCOTT";  
                client.ClientCredentials.UserName.Password = "TIGER";  
                client.Open();  
  
                // Browse for the first 3 (schema) nodes directly under the root  
                // The parameters are the parent Node ID, the start index, and the maximum number  
                // of nodes to return  
                MetadataRetrievalNode[] nodes = client.Browse(MetadataRetrievalNode.Root.NodeId, 0, 3);  
                nodeWriter.Write("Browse results for the root node:", nodes);  
  
                // Search for first 3 tables that contain "EMP" in the SCOTT schema  
                // The parameters are the parent node ID, the search expression, and the maximum number  
                // of nodes to return  
                nodes = client.Search("http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table", "%EMP%", 3);  
                nodeWriter.Write(String.Format("Search results for \"%EMP%\" under {0} node:", "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table"), nodes);  
  
                // Get a WSDL document that specifies a contract that contains the operations  
                // surfaced for the SCOTT.EMP table. The IsOperation property is set false  
                // because this is a category node.  
                nodes = new MetadataRetrievalNode[1];  
                nodes[0] = new MetadataRetrievalNode();  
                nodes[0].NodeId = "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP";  
                nodes[0].IsOperation = false;  
                System.Web.Services.Description.ServiceDescription description = client.GetMetadata(nodes);  
                description.Write("EmpTableContract.wsdl");  
  
                // Get a WSDL document that specifies a contract that contains the   
                // the POLLINGSTMT operation. The IsOperation property is set true  
                // because this is an operation node.  
                // Note that the operation NodeId is equivalent to the message action.  
                nodes = new MetadataRetrievalNode[1];  
                nodes[0] = new MetadataRetrievalNode();  
                nodes[0].NodeId = "http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMT";  
                nodes[0].IsOperation = true;  
                description = client.GetMetadata(nodes);  
                description.Write("PollingContract.wsdl");  
  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
            }  
            finally  
            {  
                if (client != null)  
                {  
                    if (client.State == CommunicationState.Opened)  
                        client.Close();  
                    else  
                        client.Abort();  
                }  
            }  
        }  
    }  
}  

コンソールでのこのプログラムの出力を次に示します。 各メソッドによって返されるメタデータ取得ノードの構造を確認できます。 また、このプログラムは 2 つの WSDL ドキュメントをファイルに書き込みます。

Browse results for the root node:  
  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/ADAPTERTEST  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = ADAPTERTEST  
        Description = Owned By ADAPTERTEST  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/ADAPTEST  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = ADAPTEST  
        Description = Owned By ADAPTEST  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/ADMIN123  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = ADMIN123  
        Description = Owned By ADMIN123  
  
Search results for "%EMP%" under http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table node:  
  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/AEMP  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = AEMP  
        Description = Table.AEMP  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = EMP  
        Description = Table.EMP  
NodeId = http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/EMP1  
        Direction   = Outbound  
        IsOperation = False  
        DisplayName = EMP1  
        Description = Table.EMP1  

IMetadataRetrievalContract チャネルの使用

また、IMetadataRetrievalContract チャネルを作成し、このチャネルを使用してアダプターからメタデータを参照、検索、および取得することもできます。 (メソッド シグネチャは MetadataRetrievalClient クラスの場合と同じです)。次の例は、これを行う方法を示しています。

…  
//Create a binding and endpoint address.  
OracleDBBinding binding = new OracleDBBinding();  
EndpointAddress address = new EndpointAddress("oracledb://ADAPTER/");  
  
//Create and open a channel factory that will return an IMetadataRetrievalContract object, on which browse, search, and get can be performed.  
ChannelFactory<IMetadataRetrievalContract> factory = new ChannelFactory<IMetadataRetrievalContract>(binding, address);  
factory.Credentials.UserName.UserName = "SCOTT";  
factory.Credentials.UserName.Password = "TIGER";  
factory.Open();  
  
//Obtain an IMetadataRetrievalContract channel from the factory.  
IMetadataRetrievalContract channel = factory.CreateChannel();  
  
//Perform a search using the channel.  
MetadataRetrievalNode[] nodes = channel.Search("http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table", "%EMP%", int.MaxValue);  
…  

こちらもご覧ください

Oracle データベースからプログラムでメタデータを取得する