Ottenere metadati nel database Oracle usando IMetadataRetrievalContract
L'adapter Microsoft BizTalk per Oracle Database espone un endpoint IMetadataRetrievalContractche è possibile usare per esplorare e cercare gli artefatti del database Oracle e recuperare i metadati per le operazioni sotto forma di documento WSDL (Web Services Description Language).
L'interfaccia IMetadataRetrievalContract viene implementata da Microsoft Windows Communication Foundation (WCF) Line of Business Adapter SDK (LOB) e fornisce funzionalità di esplorazione, ricerca e recupero dei metadati. Oltre all'interfaccia IMetadataRetrievalContract , WCF LOB Adapter SDK espone la classe MetadataRetrievalClient , che implementa l'interfaccia . È possibile usare un canale IMetadataRetrievalContract o metadataRetrievalClient per lavorare con i metadati; I metodi esposti per esplorare, cercare e recuperare i metadati sono gli stessi in ogni caso.
Nelle sezioni seguenti vengono fornite informazioni su come usare l'interfaccia IMetadataRetrievalContract .
Interfaccia IMetadataRetrievalContract
Nella tabella seguente vengono fornite informazioni sulle classi importanti usate quando si utilizza l'interfaccia IMetadataRetrievalContract .
Classe o interfaccia | Descrizione |
---|---|
Interfaccia IMetadataRetrievalContract (Microsoft.ServiceModel.Channels) |
Definisce i metodi Browse, Search e GetMetadata . È possibile richiamare questi metodi usando un canale IMetadataRetrievalContract o metadataRetrievalClient per usare i metadati dell'adattatore. |
Classe MetadataRetrievalClient (Microsoft.ServiceModel.Channels) |
Implementa l'interfaccia IMetadataRetrievalContract . È possibile creare un'istanza di questa classe e configurarla per il database Oracle specificando OracleDBBinding e EndpointAddress. È quindi possibile richiamare i relativi metodi per lavorare con i metadati. |
Classe MetadataRetrievalNode (Microsoft.ServiceModel.Channels) |
Rappresenta un nodo di metadati nell'adattatore. I metodi Browse e Search restituiscono nodi di questo tipo e il metodo GetMetadata accetta nodi di questo tipo come parametro. |
Classe ServiceDescription (System.Web.Services.Description) |
Consente di creare e formattare un file di documento WSDL valido. Il metodo GetMetadatarestituisce un oggetto ServiceDescription . |
ID dei nodi di metadati
L'adattatore organizza i metadati come albero gerarchico di nodi. All'interno di questa struttura ad albero sono disponibili due tipi di nodi di metadati:
I nodi dell'operazione rappresentano le operazioni che l'adattatore espone sugli artefatti del database Oracle. I nodi dell'operazione sono le foglie dell'albero.
I nodi categoria rappresentano gli artefatti e i raggruppamenti del database Oracle che non corrispondono direttamente a un'operazione sull'adattatore. I nodi di categoria sono i rami dell'albero; contengono altri nodi di categoria e/o nodi operativi. Ad esempio, le tabelle e i pacchetti Oracle sono rappresentati come nodi di categoria.
Ogni nodo di metadati rilevato dall'adattatore è identificato da un ID nodo univoco. Per altre informazioni sugli ID dei nodi di metadati visualizzati dall'adattatore, vedere ID dei nodi dei metadati. Questi ID nodo vengono usati per specificare gli artefatti del database Oracle di destinazione quando si usa l'interfaccia IMetadataRetrievalContract per esplorare, cercare e recuperare i metadati.
Proprietà di associazione
Se si usa un canale IMetadataRetrievalContract o IMetadataRetrievalClient per utilizzare i metadati, è necessario specificare un oggetto OracleDBBinding quando si crea l'istanza.
Esistono diverse proprietà di associazione che influiscono sul modo in cui l'adattatore genera i metadati. Le proprietà sono riportate di seguito:
EnableSafeTyping
UseSchemaInNamespace
PollingStatement
Importante
Per recuperare i metadati per l'operazione POLLINGSTMT, è necessario impostare la proprietà di associazione PollingStatement .
È necessario assicurarsi che queste proprietà di associazione siano impostate sui valori necessari per l'applicazione prima di aprire l'oggetto di recupero dei metadati. Per altre informazioni sulle proprietà di associazione dell'adattatore Oracle Database, vedere Informazioni sulle proprietà di associazione dell'adapter Oracle Database.
Esplorazione dei nodi dei metadati
Utilizzare il metodo Browse per restituire tutti i nodi di metadati contenuti in un nodo padre. Nell'esempio seguente vengono cercati i primi tre schemi nel database Oracle. In questo esempio, il client è un'istanza di 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);
Importante
È possibile esplorare solo i nodi di categoria; non è possibile esplorare i nodi dell'operazione.
Ricerca di nodi di metadati
Usare il metodo Search per eseguire una ricerca di nodi contenuti in un nodo padre. L'adapter supporta i caratteri jolly nelle espressioni di ricerca; Ad esempio, è possibile specificare il carattere jolly percentuale (%) in modo che corrisponda a zero o più caratteri. Nell'esempio seguente viene illustrata una ricerca di tutte le tabelle nello schema SCOTT che contengono la stringa "EMP". In questo esempio, il client è un'istanza di 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);
Importante
La ricerca è supportata solo in un set limitato di nodi. Per altre informazioni sui nodi in cui è supportata la ricerca e sui caratteri jolly supportati nelle espressioni di ricerca, vedere ID dei nodi dei metadati.
Recupero di metadati (WSDL) per le operazioni
Utilizzare il metodo GetMetadata per recuperare una descrizione del servizio (documento WSDL) per un gruppo di nodi operativi. Nell'esempio seguente viene recuperata una descrizione del servizio contenente tutte le operazioni che l'adattatore presenta per SCOTT. Tabella EMP specificando il relativo ID nodo. In questo esempio, il client è un'istanza di 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);
Importante
La proprietà IsOperation deve essere false per i nodi di categoria e true per i nodi dell'operazione.
Uso di metadataRetrievalClient
La creazione e l'uso di un oggetto MetadataRetrievalClient equivale a qualsiasi altro client WCF. Per creare il client, specificare un endpoint e un'istanza di OracleDBBinding. È possibile eseguire questa operazione in modo dichiarativo nella configurazione o in modo imperativo nel codice. Si richiamano quindi i metodi di MetadataRetrievalClient per esplorare, cercare e recuperare i metadati dall'adapter.
Nell'esempio seguente viene illustrato come usare metadataRetrievalClient per esplorare, cercare e recuperare i metadati dall'adapter Oracle Database. L'esempio illustra:
Esplorazione del nodo radice dell'albero dei metadati per gli schemi di Oracle Database.
Ricerca delle tabelle nello schema SCOTT con nomi che contengono la stringa "EMP".
Recupero dei metadati per tutte le operazioni supportate per SCOTT. Tabella EMP passando un nodo di categoria al metodo GetMetadata .
Recupero dei metadati per l'operazione POLLINGSTMT passando il nodo dell'operazione POLLINGSTMT al metodo GetMetadata .
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();
}
}
}
}
}
Di seguito viene illustrato l'output di questo programma nella console. È possibile visualizzare la struttura dei nodi di recupero dei metadati restituiti da ogni metodo. Il programma scrive anche due documenti WSDL nei file.
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
Uso di un canale IMetadataRetrievalContract
È anche possibile creare un canale IMetadataRetrievalContract e quindi usare questo canale per esplorare, cercare e recuperare i metadati dall'adapter. Le firme del metodo sono le stesse della classe MetadataRetrievalClient . Nell'esempio seguente viene illustrato come eseguire questa operazione.
…
//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);
…