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 インターフェイスを実装します。 このクラスのインスタンスを作成し、 OracleDBBinding と EndpointAddress を指定して 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 つのスキーマを参照します。 この例では、 client は 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);
重要
カテゴリ ノードのみを参照できます。操作ノードを参照することはできません。
メタデータ ノードの検索
Search メソッドを使用して、親ノードに含まれるノードの検索を実行します。 アダプターは、検索式でワイルドカード文字をサポートしています。たとえば、0 個以上の文字に一致するパーセント (%) ワイルドカード文字を指定できます。 次の例は、文字列 "EMP" を含む SCOTT スキーマ内のすべてのテーブルの検索を示しています。 この例では、 client は 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);
重要
検索は、限られたノード セットでのみサポートされます。 検索がサポートされているノードと、検索式でサポートされているワイルドカード文字の詳細については、「 メタデータ ノード ID」を参照してください。
操作のメタデータ (WSDL) の取得
GetMetadata メソッドを使用して、操作ノードのグループのサービス記述 (WSDL ドキュメント) を取得します。 次の例では、アダプターが SCOTT に対して実行するすべての操作を含むサービスの説明を取得します。EMP テーブルのノード ID を指定します。 この例では、 client は 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);
重要
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);
…