Abrufen von Metadaten in Oracle-Datenbank mithilfe von IMetadataRetrievalContract
Der Microsoft BizTalk-Adapter für Oracle-Datenbank macht einen IMetadataRetrievalContract-Endpunktverfügbar, mit dem Sie nach Oracle-Datenbankartefakten suchen und Metadaten für Vorgänge in Form eines WSDL-Dokuments (Web Services Description Language) abrufen können.
Die IMetadataRetrievalContract-Schnittstelle wird vom Lob-Adapter-SDK (Microsoft Windows Communication Foundation) (WCF) implementiert und bietet Funktionen zum Durchsuchen, Suchen und Abrufen von Metadaten. Zusätzlich zur IMetadataRetrievalContract-Schnittstelle macht das WCF LOB Adapter SDK die MetadataRetrievalClient-Klasse verfügbar, die die Schnittstelle implementiert. Sie können entweder einen IMetadataRetrievalContract-Kanal oder einen MetadataRetrievalClient verwenden, um mit Metadaten zu arbeiten. Die Methoden, die zum Durchsuchen, Suchen und Abrufen von Metadaten verfügbar gemacht werden, sind jeweils identisch.
Die folgenden Abschnitte enthalten Informationen zur Verwendung der IMetadataRetrievalContract-Schnittstelle .
Die IMetadataRetrievalContract-Schnittstelle
Die folgende Tabelle enthält Informationen zu wichtigen Klassen, die beim Arbeiten mit der IMetadataRetrievalContract-Schnittstelle verwendet werden.
Klasse oder Schnittstelle | BESCHREIBUNG |
---|---|
IMetadataRetrievalContract-Schnittstelle (Microsoft.ServiceModel.Channels) |
Definiert die Methoden Browse, Search und GetMetadata . Sie rufen diese Methoden entweder mithilfe eines IMetadataRetrievalContract-Kanals oder eines MetadataRetrievalClients auf, um mit Adaptermetadaten zu arbeiten. |
MetadataRetrievalClient-Klasse (Microsoft.ServiceModel.Channels) |
Implementiert die IMetadataRetrievalContract-Schnittstelle . Sie können eine instance dieser Klasse erstellen und für Ihre Oracle-Datenbank konfigurieren, indem Sie eine OracleDBBinding-Instanz und eine EndpointAddress bereitstellen. Anschließend können Sie die zugehörigen Methoden aufrufen, um mit Metadaten zu arbeiten. |
MetadataRetrievalNode-Klasse (Microsoft.ServiceModel.Channels) |
Stellt einen Metadatenknoten auf dem Adapter dar. Die Browse- und Search-Methoden geben Knoten dieses Typs zurück, und die GetMetadata-Methode verwendet Knoten dieses Typs als Parameter. |
ServiceDescription-Klasse (System.Web.Services.Description) |
Stellt eine Möglichkeit zum Erstellen und Formatieren einer gültigen WSDL-Dokumentdatei bereit. Die GetMetadata-Methode gibt ein ServiceDescription-Objekt zurück. |
IDs von Metadatenknoten
Der Adapter organisiert seine Metadaten als hierarchische Struktur von Knoten. Innerhalb dieser Strukturstruktur gibt es zwei Arten von Metadatenknoten:
Vorgangsknoten stellen Vorgänge dar, die der Adapter in Oracle-Datenbankartefakten zeigt. Vorgangsknoten sind die Blätter der Struktur.
Kategorieknoten stellen Oracle-Datenbankartefakte und Gruppierungen von Oracle-Datenbankartefakten dar, die nicht direkt einem Vorgang auf dem Adapter entsprechen. Kategorieknoten sind die Verzweigungen der Struktur. sie enthalten andere Kategorieknoten und/oder Vorgangsknoten. Oracle-Tabellen und -Pakete werden beispielsweise als Kategorieknoten dargestellt.
Jeder vom Adapter angezeigte Metadatenknoten wird durch eine eindeutige Knoten-ID identifiziert. Weitere Informationen zu den vom Adapter angezeigten Metadatenknoten-IDs finden Sie unter Metadatenknoten-IDs. Sie verwenden diese Knoten-IDs, um Oracle-Zieldatenbankartefakte anzugeben, wenn Sie die IMetadataRetrievalContract-Schnittstelle zum Durchsuchen, Suchen und Abrufen von Metadaten verwenden.
Bindungseigenschaften
Unabhängig davon, ob Sie einen IMetadataRetrievalContract-Kanal oder einen IMetadataRetrievalClient zum Arbeiten mit Metadaten verwenden, müssen Sie beim Erstellen des instance eine OracleDBBinding-Instanz angeben.
Es gibt mehrere Bindungseigenschaften, die sich darauf auswirken, wie der Adapter Metadaten generiert. Diese Eigenschaften sind:
EnableSafeTyping
UseSchemaInNamespace
PollingStatement
Wichtig
Wenn Sie Metadaten für den POLLINGSTMT-Vorgang abrufen möchten, müssen Sie die Eigenschaft PollingStatement-Bindung festlegen.
Sie sollten sicherstellen, dass diese Bindungseigenschaften auf die für Ihre Anwendung erforderlichen Werte festgelegt sind, bevor Sie das Metadatenabrufobjekt öffnen. Weitere Informationen zu den Bindungseigenschaften des Oracle Database-Adapters finden Sie unter Informationen zu den Bindungseigenschaften des Oracle Database-Adapters.
Durchsuchen von Metadatenknoten
Sie verwenden die Browse-Methode , um alle Metadatenknoten zurückzugeben, die in einem übergeordneten Knoten enthalten sind. Im folgenden Beispiel werden die ersten drei Schemas in der Oracle-Datenbank gesucht. In diesem Beispiel ist der Client ein instance von 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);
Wichtig
Sie können nur Kategorieknoten durchsuchen. Sie können vorgangsknoten nicht durchsuchen.
Suchen nach Metadatenknoten
Sie verwenden die Search-Methode , um eine Suche nach Knoten durchzuführen, die in einem übergeordneten Knoten enthalten sind. Der Adapter unterstützt Feldhalterzeichen in Suchausdrücken. Beispielsweise können Sie das Feldzeichen prozent (%) angeben, um mit null oder mehr Zeichen übereinzupassen. Das folgende Beispiel zeigt eine Suche nach allen Tabellen im SCOTT-Schema, die die Zeichenfolge "EMP" enthalten. In diesem Beispiel ist der Client ein instance von 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);
Wichtig
Die Suche wird nur für eine begrenzte Gruppe von Knoten unterstützt. Weitere Informationen zu den Knoten, auf denen die Suche unterstützt wird, und zu den in Suchausdrücken unterstützten Feldhalterzeichen finden Sie unter Metadatenknoten-IDs.
Abrufen von Metadaten (WSDL) für Vorgänge
Sie verwenden die GetMetadata-Methode , um eine Dienstbeschreibung (WSDL-Dokument) für eine Gruppe von Vorgangsknoten abzurufen. Im folgenden Beispiel wird eine Dienstbeschreibung abgerufen, die alle Vorgänge enthält, die der Adapter für scott darstellt. EMP-Tabelle durch Angabe der Knoten-ID. In diesem Beispiel ist der Client ein instance von 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);
Wichtig
Die IsOperation-Eigenschaft sollte für Kategorieknoten false und true für Vorgangsknoten sein.
Verwenden eines MetadataRetrievalClient
Das Erstellen und Verwenden eines MetadataRetrievalClient ist mit jedem anderen WCF-Client identisch. Sie erstellen den Client, indem Sie einen Endpunkt und eine instance von OracleDBBinding angeben. Sie können dies entweder deklarativ in der Konfiguration oder imperativ in Ihrem Code tun. Anschließend rufen Sie die Methoden des MetadataRetrievalClient auf, um Metadaten aus dem Adapter zu durchsuchen, zu durchsuchen und abzurufen.
Das folgende Beispiel zeigt, wie Sie einen MetadataRetrievalClient zum Durchsuchen, Suchen und Abrufen von Metadaten aus dem Oracle Database-Adapter verwenden. Das Beispiel veranschaulicht Folgendes:
Durchsuchen des Stammknotens der Metadatenstruktur für Oracle Database-Schemas.
Suchen nach den Tabellen im SCOTT-Schema mit Namen, die die Zeichenfolge "EMP" enthalten.
Abrufen von Metadaten für alle Vorgänge, die für scott unterstützt werden. EMP-Tabelle durch Übergeben eines Kategorieknotens an die GetMetadata-Methode .
Abrufen von Metadaten für den POLLINGSTMT-Vorgang durch Übergeben des Vorgangsknotens POLLINGSTMT an die GetMetadata-Methode ..
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();
}
}
}
}
}
Im Folgenden wird die Ausgabe dieses Programms in der Konsole gezeigt. Sie können die Struktur der Metadatenabrufknoten sehen, die von jeder Methode zurückgegeben werden. Das Programm schreibt auch zwei WSDL-Dokumente in Dateien.
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
Verwenden eines IMetadataRetrievalContract-Kanals
Sie können auch einen IMetadataRetrievalContract-Kanal erstellen und dann diesen Kanal zum Durchsuchen, Suchen und Abrufen von Metadaten aus dem Adapter verwenden. (Die Methodensignaturen sind identisch mit der MetadataRetrievalClient-Klasse .) Das folgende Beispiel zeigt, wie dies geschieht.
…
//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);
…
Weitere Informationen
Programmgesteuertes Abrufen von Metadaten aus der Oracle-Datenbank