Condividi tramite


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

Vedere anche

Ottenere metadati a livello di codice dal database Oracle