Partager via


Recevoir des messages de modification des données basées sur l’interrogation dans Oracle Database à l’aide du modèle de canal WCF

Vous pouvez configurer l’adaptateur Microsoft BizTalk pour Oracle Database de façon à interroger une table de base de données Oracle ou une vue à la recherche de modifications de données. Pour effectuer une telle opération d’interrogation, l’adaptateur exécute régulièrement une requête SQL sur une table ou une vue Oracle, suivie d’un bloc de code PL/SQL facultatif. Les résultats de la requête SQL sont ensuite retournés par l’adaptateur Oracle Database à votre code en tant que jeu de résultats fortement typé dans une opération POLLINGSTMT entrante. Pour plus d’informations sur le mécanisme utilisé pour configurer et effectuer l’interrogation sur une base de données Oracle à l’aide de l’adaptateur Oracle Database, consultez Recevoir des messages de modification des données basées sur l’interrogation dans l’adaptateur Oracle Database. Il est vivement recommandé de lire cette rubrique avant de continuer.

Vous configurez l’adaptateur Oracle Database pour interroger et la table ou la vue de base de données Oracle en définissant des propriétés de liaison sur un instance d’OracleDBBinding. Dans le modèle de canal WCF, vous utilisez ensuite cette liaison pour générer un écouteur de canal à partir duquel vous pouvez obtenir un canal IInputChannel pour recevoir l’opération POLLINGSTMT de l’adaptateur.

Pour obtenir une vue d’ensemble de la réception d’opérations à l’aide d’un IInputChannel dans WCF, consultez Programmation de Channel-Level de service.

Les sections de cette rubrique fournissent des informations pour vous aider à effectuer une interrogation sur des tables et des vues de base de données Oracle à l’aide du modèle de canal WCF.

Utilisation du message de requête POLLINGSTMT

L’adaptateur appelle l’opération POLLINGSTMT sur votre code pour interroger la base de données Oracle. Autrement dit, l’adaptateur envoie un message de requête POLLINGSTMT que vous recevez sur une forme de canal IInputChannel . Le message de requête POLLINGSTMT contient le jeu de résultats de la requête spécifiée par la propriété de liaison PollingStatement . Vous pouvez utiliser le message POLLINGSTMT de deux façons :

  • Pour consommer le message à l’aide de la diffusion en continu de valeur de nœud, vous devez appeler la méthode WriteBodyContents sur le message de réponse et lui transmettre un XmlDictionaryWriter qui implémente la diffusion en continu de valeur de nœud.

  • Pour utiliser le message à l’aide de la diffusion en continu de nœuds, vous pouvez appeler GetReaderAtBodyContents sur le message de réponse afin d’obtenir un XmlReader.

    Vous utilisez généralement la diffusion en continu de valeur de nœud pour consommer des jeux de résultats qui contiennent des colonnes de données métier Oracle.

    Pour plus d’informations sur la structure des messages de l’opération POLLINGSTMT, consultez Schémas de message pour les opérations d’interrogation.

    Pour plus d’informations sur la façon dont l’adaptateur Oracle Database prend en charge la diffusion en continu sur les données métier, consultez Diffusion en continu de types de données d’objets volumineux dans l’adaptateur Oracle Database.

    Pour plus d’informations sur l’implémentation de la diffusion en continu de valeur de nœud dans votre code pour prendre en charge la diffusion en continu de bout en bout de données LOB, consultez Streaming Oracle Database LOB Types de données à l’aide du modèle de canal WCF.

À propos des exemples utilisés dans cette rubrique

L’exemple de cette rubrique utilise scott. TABLE ACCOUNTACTIVITY et SCOTT. ACCOUNT_PKG. PROCESS_ACTIVITY fonction. Un script pour générer ces artefacts est fourni avec les exemples. L’exemple effectue les opérations suivantes :

  • Dans le cadre de l’instruction d’interrogation, sélectionne tous les enregistrements de la table ACCOUNTACTIVITY et s’affiche sur la console.

  • Dans le cadre de l’instruction post-sondage, l’exemple appelle la fonction PROCESS_ACTIVITY qui déplace tous les enregistrements de la table ACCOUNTACTIVITY vers la table ACTIVITYHISTORY.

  • Les sondages suivants sur la table ACCOUNTACTIVITY ne retournent aucun enregistrement. Toutefois, si vous souhaitez que l’exemple retourne davantage d’enregistrements dans le cadre de l’opération d’interrogation, vous devez insérer certains enregistrements dans la table ACCOUNTACTIVITY. Pour ce faire, exécutez le script more_activity_data.sql fourni avec les exemples.

    Pour plus d’informations sur les exemples, consultez Exemples d’adaptateurs.

Comment interroger une base de données Oracle à l’aide d’un IInputChannel ?

Pour interroger une table ou une vue de base de données Oracle afin de recevoir des messages de modification de données à l’aide du modèle de canal WCF, procédez comme suit.

Pour recevoir des messages modifiés par des données à l’aide d’un IInputChannel

  1. Créez un projet Visual C# dans Visual Studio. Pour cette rubrique, créez une application console.

  2. Dans le Explorateur de solutions, ajoutez une référence à Microsoft.Adapters.OracleDB, Microsoft.ServiceModel.Channels, System.ServiceModelet System.Runtime.Serialization.

  3. Ouvrez le fichier Program.cs et ajoutez les espaces de noms suivants :

    • Microsoft.Adapters.OracleDB

    • Microsoft.ServiceModel.Channels

    • System.ServiceModel

    • System.ServiceModel.Description

    • System.ServiceModel.Channels

    • System.Xml

    • System.Runtime.Serialization

    • System.IO

    • Microsoft.ServiceModel.Channels.Common

  4. Créez une instance d’OracleDBBinding et définissez les propriétés de liaison requises pour configurer l’interrogation. Au minimum, vous devez définir les propriétés de liaison InboundOperationType, PollingStatement et PollingInterval . Pour cet exemple, vous définissez également la propriété de liaison PostPollStatement . Pour plus d’informations sur les propriétés de liaison utilisées pour configurer l’interrogation, consultez Recevoir des messages de modification de données basés sur l’interrogation dans l’adaptateur Oracle Database.

    OracleDBBinding binding = new OracleDBBinding();  
    binding.InboundOperationType = InboundOperation.Polling;  
    binding.PollingInterval = 30;  
    binding.PollingStatement = "SELECT * FROM ACCOUNTACTIVITY FOR UPDATE";  
    binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;"  
    
  5. Créez une collection de paramètres de liaison et définissez les informations d’identification.

    ClientCredentials credentials = new ClientCredentials();  
    credentials.UserName.UserName = "SCOTT";  
    credentials.UserName.Password = "TIGER";  
    
    BindingParameterCollection bindingParams = new BindingParameterCollection();  
    bindingParams.Add(credentials);  
    
  6. Créez un écouteur de canal et ouvrez-le. Vous créez l’écouteur en appelant la méthode BuildChannelListener<IInputChannel> sur OracleDBBinding. Vous pouvez modifier l’espace de noms cible pour l’opération POLLINGSTMT en définissant la propriété PollingId dans l’URI de connexion. Pour plus d’informations sur l’URI de connexion de l’adaptateur, consultez Créer l’URI de connexion Oracle Database.

    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
    listener.Open();  
    
  7. Obtenez un canal IInputChannel en appelant la méthode AcceptChannel sur l’écouteur et ouvrez-le.

    IInputChannel channel = listener.AcceptChannel();  
    channel.Open();  
    
  8. Appelez Receive sur le canal pour obtenir le message POLLINGSTMT suivant à partir de l’adaptateur.

    Message message = channel.Receive();  
    
  9. Consommez le jeu de résultats retourné par l’opération POLLINGSTMT. Vous pouvez utiliser le message à l’aide d’un XmlReader ou d’un XmlDictionaryWriter.

    XmlReader reader = message.GetReaderAtBodyContents();  
    
  10. Fermez le canal une fois que vous avez terminé de traiter la demande.

    channel.Close()  
    

    Important

    Vous devez fermer le canal une fois que vous avez terminé le traitement de l’opération POLLINGSTMT. L’échec de la fermeture du canal peut affecter le comportement de votre code.

  11. Fermez l’écouteur lorsque vous avez fini de recevoir des messages modifiés par les données.

    listener.Close()  
    

    Important

    La fermeture de l’écouteur ne ferme pas les canaux créés à l’aide de l’écouteur. Vous devez fermer explicitement chaque canal créé à l’aide de l’écouteur.

Exemple

L’exemple suivant montre comment configurer l’adaptateur Oracle Database pour interroger les tables et les vues de base de données Oracle et recevoir l’opération POLLLINGSTMT à l’aide du modèle de canal WCF. Le jeu de résultats retourné dans l’opération POLLINGSTMT est écrit dans la console à l’aide d’un XmlReader.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
// Add WCF, WCF LOB Adapter SDK, and Oracle Database adapter namepaces  
using System.ServiceModel;  
using System.ServiceModel.Description;  
using Microsoft.ServiceModel.Channels;  
using Microsoft.Adapters.OracleDB;  
  
// Add this namespace for channel model  
using System.ServiceModel.Channels;  
  
using System.Xml;  
using System.Runtime.Serialization;  
using System.IO;  
  
// Include this namespace for the WCF LOB Adapter SDK and Oracle exceptions  
using Microsoft.ServiceModel.Channels.Common;  
  
namespace OraclePollingCM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Uri connectionUri = new Uri("oracleDB://ADAPTER/");  
  
            IChannelListener<IInputChannel> listener = null;  
            IInputChannel channel = null;  
  
            // set timeout to receive POLLINGSTMT message  
            TimeSpan messageTimeout = new TimeSpan(0, 0, 30);  
  
            Console.WriteLine("Sample Started");  
  
            try  
            {  
                // Create a binding: specify the InboundOperationType, PollingInterval (in seconds), the           
                // PollingStatement,and the PostPollStatement.  
                OracleDBBinding binding = new OracleDBBinding();  
                binding.InboundOperationType = InboundOperation.Polling;  
                binding.PollingInterval = 30;  
                binding.PollingStatement = "SELECT * FROM ACCOUNTACTIVITY FOR UPDATE";  
                binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;";  
  
                // Create a binding parameter collection and set the credentials  
                ClientCredentials credentials = new ClientCredentials();  
                credentials.UserName.UserName = "SCOTT";  
                credentials.UserName.Password = "TIGER";  
  
                BindingParameterCollection bindingParams = new BindingParameterCollection();  
                bindingParams.Add(credentials);  
  
                Console.WriteLine("Opening listener");  
                // get a listener  from the binding  
                listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
                listener.Open();  
  
                Console.WriteLine("Opening channel");  
                // get a channel from the listener  
                channel = listener.AcceptChannel();  
                channel.Open();  
  
                Console.WriteLine("Channel opened -- waiting for polled data");  
                Console.WriteLine("Receive request timeout is {0}", messageTimeout);  
  
                // Poll five times with the specified message timeout   
                // If a timeout occurs polling will be aborted  
                for (int i = 0; i < 5; i++)  
                {  
                    Console.WriteLine("Polling: " + i);  
                    Message message = null;  
                    XmlReader reader = null;  
                    try  
                    {  
                        //Message is received so process the results  
                        message = channel.Receive(messageTimeout);  
                    }  
                    catch (System.TimeoutException toEx)  
                    {  
                        Console.WriteLine("\nNo data for request number {0}: {1}", i + 1, toEx.Message);  
                        continue;  
                    }  
  
                    // Get the query results using an XML reader  
                    try  
                    {  
                        reader = message.GetReaderAtBodyContents();  
                    }  
                    catch (Exception ex)  
                    {  
                        Console.WriteLine("Exception :" + ex);  
                        throw;  
                    }  
  
                    // Write the TID, ACCOUNT, AMOUNT, and TRANSDATE for each record to the Console  
                    Console.WriteLine("\nPolling data received for request number {0}", i+1);  
                    Console.WriteLine("Tx ID\tACCOUNT\tAMOUNT\tTx DATE");  
  
                    while (reader.Read())  
                    {  
                        if (reader.IsStartElement())  
                        {  
                            switch (reader.Name)  
                            {  
                                case "POLLINGSTMTRECORD":  
                                    Console.Write("\n");  
                                    break;  
  
                                case "TID":  
                                    reader.Read();  
                                    Console.Write(reader.ReadString() + "\t");  
                                    break;  
  
                                case "ACCOUNT":  
                                    reader.Read();  
                                    Console.Write(reader.ReadString() + "\t");  
                                    break;  
                                case "AMOUNT":  
                                    reader.Read();  
                                    Console.Write(reader.ReadString() + "\t");  
                                    break;  
  
                                case "TRANSDATE":  
                                    reader.Read();  
                                    Console.Write(reader.ReadString() + "\t");  
                                    break;  
  
                                default:  
                                    break;  
                            }  
                        }  
                    }  
  
                    // return the cursor  
                    Console.WriteLine();  
  
                    // close the reader  
                    reader.Close();  
  
                    //            To save the polling data to a file you can REPLACE the code above with the following  
                    //  
                    //            XmlDocument doc = new XmlDocument();  
                    //            doc.Load(reader);  
                    //            using (XmlWriter writer = XmlWriter.Create("PollingOutput.xml"))  
                    //            {  
                    //                doc.WriteTo(writer);  
                    //            }  
                    message.Close();  
                }  
  
                Console.WriteLine("\nPolling done -- hit <RETURN> to finish");  
                Console.ReadLine();  
            }  
            catch (TargetSystemException tex)  
            {  
                Console.WriteLine("Exception occurred on the Oracle Database");  
                Console.WriteLine(tex.InnerException.Message);  
            }  
            catch (ConnectionException cex)  
            {  
                Console.WriteLine("Exception occurred connecting to the Oracle Database");  
                Console.WriteLine(cex.InnerException.Message);  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
                if (ex.InnerException != null)  
                {  
                    Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);  
                }  
            }  
            finally  
            {  
                // IMPORTANT: close the channel and listener to stop polling  
                if (channel != null)  
                {  
                    if (channel.State == CommunicationState.Opened)  
                        channel.Close();  
                    else  
                        channel.Abort();  
                }  
  
                if (listener != null)  
                {  
                    if (listener.State == CommunicationState.Opened)  
                        listener.Close();  
                    else  
                        listener.Abort();  
                }  
            }  
        }  
    }  
}  

Voir aussi

Développer des applications Oracle Database à l’aide du modèle de canal WCF