Compartir a través de


Obtención de metadatos en oracle Database mediante IMetadataRetrievalContract

El adaptador de Microsoft BizTalk para oracle Database expone un punto de conexión IMetadataRetrievalContractque puede usar para examinar y buscar artefactos de base de datos de Oracle y recuperar metadatos para las operaciones en forma de documento de lenguaje de descripción de servicios web (WSDL).

El SDK del adaptador de línea de negocio (LOB) de Microsoft Windows Communication Foundation (WCF) implementa la interfaz IMetadataRetrievalContract y proporciona funcionalidades de exploración, búsqueda y recuperación de metadatos. Además de la interfaz IMetadataRetrievalContract , el SDK del adaptador de LOB de WCF expone la clase MetadataRetrievalClient , que implementa la interfaz . Puede usar un canal IMetadataRetrievalContract o metadataRetrievalClient para trabajar con metadatos; Los métodos expuestos para examinar, buscar y recuperar metadatos son los mismos en cada caso.

En las secciones siguientes se proporciona información sobre cómo usar la interfaz IMetadataRetrievalContract .

Interfaz IMetadataRetrievalContract

En la tabla siguiente se proporciona información sobre las clases importantes que se usan al trabajar con la interfaz IMetadataRetrievalContract .

Clase o interfaz Descripción
Interfaz IMetadataRetrievalContract

(Microsoft.ServiceModel.Channels)
Define los métodos Browse, Search y GetMetadata . Estos métodos se invocan mediante un canal IMetadataRetrievalContract o metadataRetrievalClient para trabajar con metadatos del adaptador.
MetadataRetrievalClient ( clase)

(Microsoft.ServiceModel.Channels)
Implementa la interfaz IMetadataRetrievalContract . Puede crear una instancia de esta clase y configurarla para la base de datos de Oracle proporcionando oracleDBBinding y EndpointAddress. A continuación, puede invocar sus métodos para trabajar con metadatos.
MetadataRetrievalNode (clase)

(Microsoft.ServiceModel.Channels)
Representa un nodo de metadatos en el adaptador. Los métodos Browse y Search devuelven nodos de este tipo y el método GetMetadata toma nodos de este tipo como parámetro.
Clase ServiceDescription

(System.Web.Services.Description)
Proporciona un medio para crear y dar formato a un archivo de documento WSDL válido. El método GetMetadata devuelve un objeto ServiceDescription .

Identificadores de nodo de metadatos

El adaptador organiza sus metadatos como un árbol jerárquico de nodos. Dentro de esta estructura de árbol hay dos tipos de nodos de metadatos:

  • Los nodos de operación representan las operaciones que el adaptador expone en artefactos de base de datos de Oracle. Los nodos de operación son las hojas del árbol.

  • Los nodos de categoría representan artefactos y agrupaciones de bases de datos de Oracle que no corresponden directamente a una operación en el adaptador. Los nodos de categoría son las ramas del árbol; contienen otros nodos de categoría o nodos de operación. Por ejemplo, las tablas y paquetes de Oracle se representan como nodos de categoría.

    Cada nodo de metadatos expuesto por el adaptador se identifica mediante un identificador de nodo único. Para obtener más información sobre los identificadores de nodo de metadatos que expone el adaptador, vea Identificadores de nodo de metadatos. Estos identificadores de nodo se usan para especificar artefactos de base de datos de Oracle de destino cuando se usa la interfaz IMetadataRetrievalContract para examinar, buscar y recuperar metadatos.

Propiedades de enlace

Tanto si usa un canal IMetadataRetrievalContract como un IMetadataRetrievalClient para trabajar con metadatos, debe especificar oracleDBBinding al crear la instancia.

Hay varias propiedades de enlace que afectan a la forma en que el adaptador genera metadatos. Estas propiedades son:

  • EnableSafeTyping

  • UseSchemaInNamespace

  • PollingStatement

Importante

Si desea recuperar metadatos para la operación POLLINGSTMT, debe establecer la propiedad de enlace PollingStatement .

Debe asegurarse de que estas propiedades de enlace se establecen en los valores necesarios para la aplicación antes de abrir el objeto de recuperación de metadatos. Para obtener más información sobre las propiedades de enlace del adaptador de base de datos de Oracle, vea Leer sobre las propiedades de enlace del adaptador de base de datos de Oracle.

Examinar nodos de metadatos

Use el método Browse para devolver todos los nodos de metadatos contenidos en un nodo primario. En el ejemplo siguiente se examinan los tres primeros esquemas de la base de datos de Oracle. En este ejemplo, el cliente es una instancia de 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

Solo puede examinar nodos de categoría; no puede examinar los nodos de la operación.

Búsqueda de nodos de metadatos

Use el método Search para realizar una búsqueda de nodos contenidos en un nodo primario. El adaptador admite caracteres comodín en expresiones de búsqueda; por ejemplo, puede especificar el carácter comodín de porcentaje (%) para que coincida con cero o más caracteres. En el ejemplo siguiente se muestra una búsqueda de todas las tablas del esquema SCOTT que contienen la cadena "EMP". En este ejemplo, el cliente es una instancia de 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 búsqueda solo se admite en un conjunto limitado de nodos. Para obtener más información sobre los nodos en los que se admite la búsqueda y sobre los caracteres comodín admitidos en expresiones de búsqueda, vea Identificadores de nodo de metadatos.

Recuperación de metadatos (WSDL) para operaciones

Use el método GetMetadata para recuperar una descripción del servicio (documento WSDL) para un grupo de nodos de operación. En el ejemplo siguiente se recupera una descripción del servicio que contiene todas las operaciones que el adaptador expone para SCOTT. Tabla EMP especificando su identificador de nodo. En este ejemplo, el cliente es una instancia de 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 propiedad IsOperation debe ser false para los nodos de categoría y true para los nodos de operación.

Uso de metadataRetrievalClient

La creación y el uso de metadataRetrievalClient es mucho igual que cualquier otro cliente WCF. Para crear el cliente, especifique un punto de conexión y una instancia de OracleDBBinding. Puede hacerlo mediante declaración en la configuración o imperativamente en el código. A continuación, se invocan los métodos de MetadataRetrievalClient para examinar, buscar y recuperar metadatos del adaptador.

En el ejemplo siguiente se muestra cómo usar metadataRetrievalClient para examinar, buscar y recuperar metadatos del adaptador de base de datos de Oracle. En el ejemplo se muestra lo siguiente:

  • Examinar el nodo raíz del árbol de metadatos para esquemas de Oracle Database.

  • Búsqueda de las tablas en el esquema SCOTT con nombres que contienen la cadena "EMP".

  • Recuperar metadatos para todas las operaciones admitidas para SCOTT. Tabla EMP pasando un nodo de categoría al método GetMetadata .

  • Para recuperar metadatos para la operación POLLINGSTMT, pase el nodo de operación POLLINGSTMT al método 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();  
                }  
            }  
        }  
    }  
}  

A continuación se muestra la salida de este programa en la consola. Puede ver la estructura de los nodos de recuperación de metadatos devueltos por cada método. El programa también escribe dos documentos WSDL en archivos.

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 de un canal IMetadataRetrievalContract

También puede crear un canal IMetadataRetrievalContract y, a continuación, usar este canal para examinar, buscar y recuperar metadatos del adaptador. (Las firmas de método son las mismas que para la clase MetadataRetrievalClient ). En el ejemplo siguiente se muestra cómo hacerlo.

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

Consulte también

Obtención de metadatos mediante programación desde la base de datos de Oracle