次の方法で共有


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)
BrowseSearchGetMetadata の各メソッドを定義します。 これらのメソッドを呼び出すには、 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

重要

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

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

メタデータ ノードの参照

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

// 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);  

重要

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

メタデータ ノードの検索

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

// 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);  
  

重要

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

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

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

// 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);  
  

重要

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 データベースからプログラムでメタデータを取得する