Partager via


Recevoir des messages d’interrogation modifiés par les données de SQL Server à l’aide du modèle de canal WCF

Vous pouvez configurer l’adaptateur SQL pour recevoir des messages de modification de données périodiques pour SQL Server tables ou vues. Vous pouvez spécifier une instruction d’interrogation que l’adaptateur exécute pour interroger la base de données. L’instruction d’interrogation peut être une instruction SELECT ou une procédure stockée qui retourne un jeu de résultats.

Pour plus d’informations sur la façon dont l’adaptateur prend en charge l’interrogation, consultez Prise en charge des appels entrants à l’aide de l’interrogation.

Important

Si vous souhaitez avoir plusieurs opérations d’interrogation dans une seule application, vous devez spécifier une propriété de connexion InboundID dans le cadre de l’URI de connexion pour la rendre unique. L’ID entrant que vous spécifiez est ajouté à l’espace de noms d’opération pour le rendre unique.

Comment cette rubrique illustre l’interrogation

Dans cette rubrique, pour montrer comment l’adaptateur SQL prend en charge la réception de messages de modification de données, créez une application .NET pour l’opération d’interrogation . Pour cette rubrique, spécifiez polledDataAvailableStatement comme suit :

SELECT COUNT(*) FROM Employee  

PolledDataAvailableStatement doit retourner un jeu de résultats avec la première cellule contenant une valeur positive. Si la première cellule ne contient pas de valeur positive, l’adaptateur n’exécute pas l’instruction d’interrogation.

Dans le cadre de l’instruction d’interrogation, effectuez les opérations suivantes :

  1. Sélectionnez toutes les lignes de la table Employee.

  2. Exécutez une procédure stockée (MOVE_EMP_DATA) pour déplacer tous les enregistrements de la table Employee vers une table EmployeeHistory.

  3. Exécutez une procédure stockée (ADD_EMP_DETAILS) pour ajouter un nouvel enregistrement à la table Employee. Cette procédure prend le nom, la désignation et le salaire de l’employé comme paramètres.

    Pour effectuer ces opérations, vous devez spécifier les éléments suivants pour la propriété de liaison PollingStatement :

SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000   

Une fois l’instruction d’interrogation exécutée, tous les enregistrements de la table Employee sont sélectionnés et le message de SQL Server est reçu. Une fois la procédure stockée MOVE_EMP_DATA exécutée par l’adaptateur, tous les enregistrements sont déplacés vers la table EmployeeHistory. Ensuite, la procédure stockée ADD_EMP_DETAILS est exécutée pour ajouter un nouvel enregistrement à la table Employee. L’exécution d’interrogation suivante ne retournera qu’un seul enregistrement. Ce cycle se poursuit jusqu’à ce que vous fermez l’écouteur de canal.

Configuration d’une requête d’interrogation avec les propriétés de liaison de l’adaptateur SQL

Le tableau suivant récapitule les propriétés de liaison de l’adaptateur SQL que vous utilisez pour configurer l’adaptateur pour recevoir des messages de modification de données. Vous devez spécifier ces propriétés de liaison dans le cadre de l’application .NET pour l’interrogation.

Binding, propriété Description
InboundOperationType Spécifie si vous souhaitez effectuer une opération d’interrogation, de typedPolling ou de notification entrante. La valeur par défaut est Interrogation.
PolledDataAvailableStatement Spécifie l’instruction SQL que l’adaptateur exécute pour déterminer si des données sont disponibles pour l’interrogation. L’instruction SQL doit retourner un jeu de résultats composé de lignes et de colonnes. Uniquement si une ligne est disponible, l’instruction SQL spécifiée pour la propriété de liaison PollingStatement est exécutée.
PollingIntervalInSeconds Spécifie l’intervalle, en secondes, auquel l’adaptateur SQL exécute l’instruction spécifiée pour la propriété de liaison PolledDataAvailableStatement . La valeur par défaut est 30 secondes. L’intervalle d’interrogation détermine l’intervalle de temps entre les sondages successifs. Si l’instruction est exécutée dans l’intervalle spécifié, l’adaptateur attend le temps restant dans l’intervalle.
PollingStatement Spécifie l’instruction SQL pour interroger la table de base de données SQL Server. Vous pouvez spécifier une instruction SELECT simple ou une procédure stockée pour l’instruction d’interrogation. La valeur par défaut est null. Vous devez spécifier une valeur pour PollingStatement afin d’activer l’interrogation. L’instruction d’interrogation est exécutée uniquement s’il existe des données disponibles pour l’interrogation, qui sont déterminées par la propriété de liaison PolledDataAvailableStatement . Vous pouvez spécifier n’importe quel nombre d’instructions SQL séparées par un point-virgule.
PollWhileDataFound Spécifie si l’adaptateur SQL ignore l’intervalle d’interrogation et exécute en continu l’instruction SQL spécifiée pour la propriété de liaison PolledDataAvailableStatement , si des données sont disponibles dans la table interrogée. Si aucune donnée n’est disponible dans la table, l’adaptateur revient à exécuter l’instruction SQL à l’intervalle d’interrogation spécifié. La valeur par défaut est false.

Pour obtenir une description plus complète de ces propriétés, consultez En savoir plus sur les propriétés de liaison de l’adaptateur BizTalk pour SQL Server. Pour obtenir une description complète de l’utilisation de l’adaptateur SQL pour interroger SQL Server, lisez le reste de cette rubrique.

Utilisation du message de demande d’interrogation

L’adaptateur appelle l’opération Interrogation sur votre code pour interroger la base de données SQL Server. Autrement dit, l’adaptateur envoie un message de demande d’interrogation que vous recevez via une forme de canal IInputChannel. Le message de demande d’interrogation 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 d’interrogation de l’une des deux manières suivantes :

  • 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 passer 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 pour obtenir un XmlReader.

À propos des exemples utilisés dans cette rubrique

Les exemples de cette rubrique interrogent la table Employee. L’exemple utilise également la procédure stockée MOVE_EMP_DATA et ADD_EMP_DETAILS. Un script pour générer ces artefacts est fourni avec les exemples. Pour plus d’informations sur les exemples, consultez Exemples pour l’adaptateur SQL. Un exemple, Polling_ChannelModel, basé sur cette rubrique, est également fourni avec les exemples d’adaptateur SQL.

Réception de messages entrants pour une opération d’interrogation à l’aide du modèle de canal WCF

Cette section fournit des instructions sur la façon d’écrire une application .NET (modèle de canal) pour recevoir des messages d’interrogation entrants à l’aide de l’adaptateur SQL.

Pour recevoir des messages d’interrogation à partir de l’adaptateur SQL

  1. Créez un projet Microsoft 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.Sql, Microsoft.ServiceModel.Channels, System.ServiceModelet System.Runtime.Serialization.

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

    • Microsoft.Adapters.Sql

    • System.ServiceModel

    • System.ServiceModel.Description

    • System.ServiceModel.Channels

    • System.Xml

  4. Spécifiez un URI de connexion. Pour plus d’informations sur l’URI de connexion de l’adaptateur, consultez Créer l’URI de connexion SQL Server.

    Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?");  
    
  5. Créez un instance de SqlAdapterBinding 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, PolledDataAvailableStatement et PollingStatement . Pour plus d’informations sur les propriétés de liaison utilisées pour configurer l’interrogation, consultez Prise en charge des appels entrants à l’aide de l’interrogation.

    SqlAdapterBinding binding = new SqlAdapterBinding();  
    binding.InboundOperationType = InboundOperation.Polling;  
    binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE";  
    binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";  
    
  6. Créez une collection de paramètres de liaison et définissez les informations d’identification.

    ClientCredentials credentials = new ClientCredentials();  
    credentials.UserName.UserName = "<Enter user name here>";  
    credentials.UserName.Password = "<Enter password here>";  
    
    BindingParameterCollection bindingParams = new BindingParameterCollection();  
    bindingParams.Add(credentials);  
    
  7. Créez un écouteur de canal et ouvrez-le. Vous créez l’écouteur en appelant la méthode BuildChannelListener<IInputChannel> sur sqlAdapterBinding.

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

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

    Message message = channel.Receive();  
    
  10. Utilisez 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();  
    
  11. Fermez le canal lorsque vous avez terminé le traitement de 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.

  12. Fermez l’écouteur lorsque vous avez terminé 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 une requête d’interrogation qui exécute la table Employee. L’instruction d’interrogation effectue les tâches suivantes :

  • Sélectionne tous les enregistrements de la table Employee.

  • Exécute la procédure stockée MOVE_EMP_DATA pour déplacer tous les enregistrements de la table Employee vers la table EmployeeHistory.

  • Exécute la procédure stockée ADD_EMP_DETAILS pour ajouter un seul enregistrement à la table Employee.

    Les messages d’interrogation sont enregistrés dans C:\PollingOutput.xml.

using System;  
using Microsoft.Adapters.Sql;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
using System.ServiceModel.Channels;  

using System.Xml;  

namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Console.WriteLine("Sample started. This sample will poll 5 times and will perform the following tasks:");  
            Console.WriteLine("Press any key to start polling...");  
            Console.ReadLine();  
            IChannelListener<IInputChannel> listener = null;  

            IInputChannel channel = null;  

            try  
            {  
                TimeSpan messageTimeout = new TimeSpan(0, 0, 30);  

                SqlAdapterBinding binding = new SqlAdapterBinding();  
                binding.InboundOperationType = InboundOperation.Polling;  
                binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE";  
                binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";  

                Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?");  

                ClientCredentials credentials = new ClientCredentials();  
                credentials.UserName.UserName = "<Enter user name here>";  
                credentials.UserName.Password = "<Enter password here>";  

                BindingParameterCollection bindingParams = new BindingParameterCollection();  
                bindingParams.Add(credentials);  

                listener = binding.BuildChannelListener<IInputChannel>(ConnectionUri, bindingParams);  
                listener.Open();  

                channel = listener.AcceptChannel();  
                channel.Open();  

                Console.WriteLine("Channel and Listener opened...");  
                Console.WriteLine("\nWaiting 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;  
                    }  

                    XmlDocument doc = new XmlDocument();  
                    doc.Load(reader);  
                    using (XmlWriter writer = XmlWriter.Create("C:\\PollingOutput.xml"))  
                    {  
                        doc.WriteTo(writer);  
                        Console.WriteLine("The polling response is saved at 'C:\\PollingOutput.xml'");  
                    }  

                    // return the cursor  
                    Console.WriteLine();  

                    // close the reader  
                    reader.Close();  

                    message.Close();  
                }  
                Console.WriteLine("\nPolling done -- hit <RETURN> to finish");  
                Console.ReadLine();  
            }  
            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 SQL à l’aide du modèle de canal WCF