Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous pouvez configurer l’adaptateur Microsoft BizTalk pour Oracle Database pour recevoir des messages modifiés de données basées sur l’interrogation sur une table ou une vue Oracle. Pour recevoir des messages modifiés par des données, 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 application sous la forme d’un 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 modifiés de données basés sur l’interrogation dans l’adaptateur Oracle Database. Nous vous recommandons vivement de lire cette rubrique avant de continuer.
Pour recevoir l’opération POLLINGSTMT lorsque vous utilisez le modèle de service WCF, vous devez :
Générez un contrat de service WCF (interface) pour l’opération POLLINGSTMT à partir des métadonnées exposées par l’adaptateur. Pour ce faire, vous utilisez le plug-in Visual Studio Ajouter un service d’adaptateur ou l’outil utilitaire de métadonnées ServiceModel (svcutil.exe).
Implémentez un service WCF à partir de cette interface.
Hébergez ce service WCF à l’aide d’un hôte de service (System.ServiceModel.ServiceHost).
Les rubriques de cette section fournissent des informations et des procédures pour vous aider à interroger les tables et vues de base de données Oracle dans le modèle de service WCF.
À propos des exemples utilisés dans cette rubrique
Les exemples de cette rubrique utilisent la table /SCOTT/ACCOUNTACTIVITY et la fonction /SCOTT/Package/ACCOUNT_PKG/PROCESS_ACTIVITY. Un script pour générer ces artefacts est fourni avec les exemples BizTalk Adapter Pack. Pour plus d’informations sur les exemples, consultez Exemples d’adaptateurs.
Configuration de l’interrogation dans le modèle de service WCF
Vous configurez l’adaptateur Oracle Database pour effectuer l’interrogation sur les tables et vues de base de données Oracle en définissant des propriétés de liaison et une propriété de connexion facultative (paramètre). Certaines de ces propriétés sont obligatoires, et d’autres, pour avoir un effet, doivent être définies à la fois au moment du design et au moment de l’exécution.
Au moment du design, vous définissez les paramètres de connexion et les propriétés de liaison lorsque vous vous connectez à Oracle Database pour générer un contrat de service WCF.
Au moment de l’exécution, vous définissez des propriétés de liaison sur l’objet OracleDBBinding que vous utilisez pour créer l’hôte de service. Vous définissez le paramètre de connexion lorsque vous ajoutez un écouteur de service à l’hôte du service.
La liste suivante fournit une brève vue d’ensemble des propriétés de liaison et des paramètres de connexion utilisés pour configurer l’interrogation :
Propriété de liaison PollingStatement . Vous devez définir cette propriété de liaison au moment du design et au moment de l’exécution.
Propriétés de liaison facultatives. Celles-ci ne doivent être définies qu’au moment de l’exécution.
Propriété de liaison AcceptCredentialsInUri . Vous devez définir cette propriété de liaison sur true pendant l’exécution si vous souhaitez activer les informations d’identification dans l’URI de connexion. Le nom d’utilisateur et le mot de passe doivent être présents dans l’URI de connexion lorsque vous ajoutez un point de terminaison de service à l’hôte du service.
Paramètre de chaîne de requête PollingId dans l’URI de connexion. Si vous souhaitez modifier l’espace de noms de l’opération POLLINGSTMT, vous devez définir cette propriété de connexion au moment de la conception et au moment de l’exécution.
Pour obtenir une description complète des propriétés de liaison et des paramètres de connexion utilisés pour configurer l’interrogation, consultez Recevoir des messages basés sur des modifications de données basées sur l’interrogation dans l’adaptateur Oracle Database.
Contrat et classe de service WCF
Vous utilisez le plug-in Visual Studio Add Adapter Service ou l’outil Utilitaire de métadonnées ServiceModel (svcutil.exe) pour créer un contrat de service WCF (interface) et des classes de prise en charge pour l’opération POLLINGSTMT.
Lorsque vous vous connectez à la base de données Oracle avec l’un de ces outils pour générer un contrat de service pour l’opération POLLINGSTMT :
Vous devez spécifier la propriété de liaison PollingStatement . L’adaptateur utilise l’instruction SELECT de cette propriété de liaison pour générer les métadonnées correctes pour le jeu de résultats fortement typé retourné par l’opération POLLINGSTMT.
Vous pouvez éventuellement spécifier un paramètre PollingId dans l’URI de connexion. L’adaptateur utilise ce paramètre pour générer l’espace de noms pour l’opération POLLINGSTMT.
Dans les exemples suivants :
PollingStatement a la valeur « SELECT * FROM ACCOUNTACTIVITY FOR UPDATE ».
PollingId est défini sur « AcctActivity ».
Contrat de service WCF (interface)
Le code suivant montre le contrat de service WCF (interface) généré pour l’opération POLLINGSTMT.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.LobServices.OracleDB/2007/03", ConfigurationName="POLLINGSTMT_OperationGroup")]
public interface POLLINGSTMT_OperationGroup {
// CODEGEN: Generating message contract since the wrapper namespace (http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMTAcctActivity)
// of message POLLINGSTMT does not match the default value (http://Microsoft.LobServices.OracleDB/2007/03)
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMT")]
void POLLINGSTMT(POLLINGSTMT request);
}
Contrats de message
L’espace de noms du contrat de message est modifié par le paramètre PollingId dans l’URI de connexion. Le message de demande retourne un ensemble d’enregistrements fortement typés.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="POLLINGSTMT", WrapperNamespace="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMTAcctActivity", IsWrapped=true)]
public partial class POLLINGSTMT {
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMTAcctActivity", Order=0)]
public microsoft.lobservices.oracledb._2007._03.POLLINGSTMTAcctActivity.POLLINGSTMTRECORD[] POLLINGSTMTRECORD;
public POLLINGSTMT() {
}
public POLLINGSTMT(microsoft.lobservices.oracledb._2007._03.POLLINGSTMTAcctActivity.POLLINGSTMTRECORD[] POLLINGSTMTRECORD) {
this.POLLINGSTMTRECORD = POLLINGSTMTRECORD;
}
}
Espace de noms de contrat de données
Un contrat de données est un accord en bonne et due forme entre un service et un client qui décrit de manière abstraite les données à échanger. Autrement dit, pour communiquer, le client et le service n’ont pas besoin de partager les mêmes types, mais seulement les mêmes contrats de données.
En cas de messages de modification de données, l’espace de noms du contrat de données est également modifié par le paramètre PollingId (si spécifié) dans l’URI de connexion. Le contrat de données est composé d’une classe qui représente un enregistrement fortement typé dans le jeu de résultats de la requête. Les détails de la définition de classe sont omis dans cet exemple. La classe contient des propriétés qui représentent les colonnes du jeu de résultats.
Dans l’exemple suivant, l’Id d’interrogation « AcctActivity » est utilisé.
namespace microsoft.lobservices.oracledb._2007._03.POLLINGSTMTAcctActivity {
using System.Runtime.Serialization;
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="POLLINGSTMTRECORD", Namespace="http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMTAcctActivity")]
public partial class POLLINGSTMTRECORD : object, System.Runtime.Serialization.IExtensibleDataObject {…}
}
}
Classe de service WCF
Le plug-in Add Adapter Service Reference génère également un fichier qui a un stub pour la classe de service WCF implémentée à partir du contrat de service (interface). Le nom du fichier est OracleDBBindingService.cs. Vous pouvez insérer la logique pour traiter l’opération POLLINGSTMT directement dans cette classe. Si vous utilisez svcutil.exe pour générer l’interface de contrat de service, vous devez implémenter cette classe vous-même. Le code suivant montre la classe de service WCF générée par le plug-in Add Adapter Service Reference.
namespace OracleDBBindingNamespace {
public class OracleDBBindingService : POLLINGSTMT_OperationGroup {
// CODEGEN: Generating message contract since the wrapper namespace (http://Microsoft.LobServices.OracleDB/2007/03/POLLINGSTMTAcctActivity)
// of message POLLINGSTMT does not match the default value (http://Microsoft.LobServices.OracleDB/2007/03)
public virtual void POLLINGSTMT(POLLINGSTMT request) {
throw new System.NotImplementedException("The method or operation is not implemented.");
}
}
}
Réception de l’opération POLLINGSTMT
Pour recevoir des données d’interrogation à partir de l’adaptateur Oracle Database
Utilisez le plug-in add adapter service reference plug-in ou svcutil.exe pour générer un contrat de service WCF (interface) et des classes d’assistance pour l’opération POLLINGSTMT. Pour plus d’informations, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution Oracle Database. Au minimum, vous devez définir la propriété de liaison PollingStatement lorsque vous vous connectez à l’adaptateur. Vous pouvez éventuellement spécifier un paramètre PollingId dans l’URI de connexion. Si vous utilisez le plug-in Add Adapter Service Reference, vous devez définir tous les paramètres de liaison nécessaires à votre configuration. Cela garantit qu’ils sont correctement définis dans le fichier de configuration généré.
Implémentez un service WCF à partir des classes d’interface et d’assistance générées à l’étape 1. La méthode POLLINGSTMT de cette classe peut lever une exception pour annuler la transaction d’interrogation, si une erreur est rencontrée lors du traitement des données reçues de l’opération POLLINGSTMT ; sinon, la méthode ne retourne rien. Vous devez attribuer la classe de service WCF comme suit :
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
Si vous avez utilisé le plug-in Add Adapter Service Reference pour générer l’interface, vous pouvez implémenter votre logique directement dans la méthode POLLINGSTMT de la classe OracleDBBindingService générée. Cette classe se trouve dans OracleDBBindingService.cs. Ce code dans cet exemple sous-classe la classe OracleDBBindingService .
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class PollingStmtService : OracleDBBindingService { public override void POLLINGSTMT(POLLINGSTMT request) { Console.WriteLine("\nNew Polling Records Received"); Console.WriteLine("Tx Id\tAccount\tAmount\tDate\t\t\tDescription"); for (int i = 0; i < request.POLLINGSTMTRECORD.Length; i++) { Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", request.POLLINGSTMTRECORD[i].TID, request.POLLINGSTMTRECORD[i].ACCOUNT, request.POLLINGSTMTRECORD[i].AMOUNT, request.POLLINGSTMTRECORD[i].TRANSDATE, request.POLLINGSTMTRECORD[i].DESCRIPTION); } } }
Si vous avez utilisé svcutil.exe pour générer l’interface, vous devez créer un service WCF qui implémente l’interface et implémenter votre logique dans la méthode POLLINGSTMT de cette classe.
Créez une instance du service WCF créé à l’étape 2.
// create service instance PollingStmtService pollingInstance = new PollingStmtService();
Créez un instance de System.ServiceModel.ServiceHost à l’aide du service WCF et d’un URI de connexion de base. L’URI de connexion de base ne peut pas contenir userinfoparams ou un query_string.
// Enable service host Uri[] baseUri = new Uri[] { new Uri("oracledb://Adapter") }; ServiceHost srvHost = new ServiceHost(pollingInstance, baseUri);
Créez un oracleDBBinding et configurez l’opération d’interrogation en définissant ses propriétés de liaison. Vous pouvez effectuer cette opération de manière explicite dans le code ou de manière déclarative dans la configuration. Au minimum, vous devez spécifier l’instruction d’interrogation et l’intervalle d’interrogation. Dans cet exemple, vous spécifiez les informations d’identification dans le cadre de l’URI. Vous devez donc également définir AcceptCredentialsInUri sur true.
// Create and configure a binding for the service endpoint. NOTE: binding // parameters are set here for clarity, but these are already set in the // the generated configuration file OracleDBBinding binding = new OracleDBBinding(); // The credentials are included in the connection URI, so set this property to true binding.AcceptCredentialsInUri = true; // Same as statement specified in Configure Adapter dialog box binding.PollingStatement = "SELECT * FROM ACCOUNTACTIVITY FOR UPDATE"; binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;"; // Be sure to set the interval long enough to complete processing before // the next poll binding.PollingInterval = 15; // Polling is transactional; be sure to set an adequate isolation level // for your environment binding.TransactionIsolationLevel = TransactionIsolationLevel.ReadCommitted;
Ajoutez un point de terminaison de service à l’hôte de service. Pour ce faire :
Utilisez la liaison créée à l’étape 5.
Spécifiez un URI de connexion qui contient des informations d’identification et, si nécessaire, un Id d’interrogation.
Spécifiez le contrat comme « POLLINGSTMT_OperationGroup ».
// Add service endpoint: be sure to specify POLLINGSTMT_OperationGroup as the contract Uri serviceUri = new Uri("oracledb://User=SCOTT;Password=TIGER@Adapter?PollingId=AcctActivity"); srvHost.AddServiceEndpoint("POLLINGSTMT_OperationGroup", binding, serviceUri);
Pour recevoir des données d’interrogation, ouvrez l’hôte de service. L’adaptateur retourne des données chaque fois que la requête retourne un jeu de résultats.
// Open the service host to begin polling srvHost.Open();
Pour mettre fin à l’interrogation, fermez l’hôte de service.
Important
L’adaptateur continue d’interroger jusqu’à ce que l’hôte de service soit fermé.
srvHost.Close();
Exemple
L’exemple suivant montre une requête d’interrogation qui s’exécute sur la table /SCOTT/ACCOUNTACTIVITY. L’instruction post-interrogation appelle une fonction Oracle qui déplace les enregistrements traités vers une autre table /SCOTT/ACCOUNTHISTORY. L’espace de noms de l’opération POLLINGSTMT est modifié en définissant le paramètre PollingId sur « AccountActivity » dans l’URI de connexion. Dans cet exemple, le service WCF pour l’opération POLLINGSTMT est créé en sous-classant la classe OracleDBBindingService générée ; Toutefois, vous pouvez implémenter votre logique directement dans la classe générée.
using System;
using System.Collections.Generic;
using System.Text;
// Add these three references to use the Oracle adapter
using System.ServiceModel;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
using microsoft.lobservices.oracledb._2007._03.POLLINGSTMTAcctActivity;
using OracleDBBindingNamespace;
namespace OraclePollingSM
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PollingStmtService : OracleDBBindingService
{
public override void POLLINGSTMT(POLLINGSTMT request)
{
Console.WriteLine("\nNew Polling Records Received");
Console.WriteLine("Tx Id\tAccount\tAmount\tDate\t\t\tDescription");
for (int i = 0; i < request.POLLINGSTMTRECORD.Length; i++)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", request.POLLINGSTMTRECORD[i].TID,
request.POLLINGSTMTRECORD[i].ACCOUNT,
request.POLLINGSTMTRECORD[i].AMOUNT,
request.POLLINGSTMTRECORD[i].TRANSDATE,
request.POLLINGSTMTRECORD[i].DESCRIPTION);
}
Console.WriteLine("\nHit <RETURN> to stop polling");
}
}
class Program
{
static void Main(string[] args)
{
ServiceHost srvHost = null;
// This URI is used to specify the address for the ServiceEndpoint
// It must contain credentials and the PollingId (if any) that was used to generate
// the WCF service callback interface
Uri serviceUri = new Uri("OracleDb://User=SCOTT;Password=TIGER@Adapter?PollingId=AcctActivity");
// This URI is used to initialize the ServiceHost. It cannot contain
// userinfoparms (credentials) or a query_string (PollingId); otherwise,
// an exception is thrown when the ServiceHost is initialized.
Uri[] baseUri = new Uri[] { new Uri("OracleDb://Adapter") };
Console.WriteLine("Sample started, initializing service host -- please wait");
// create an instanc of the WCF service callback class
PollingStmtService pollingInstance = new PollingStmtService();
try
{
// Create a ServiceHost with the service callback instance and a base URI (address)
srvHost = new ServiceHost(pollingInstance, baseUri);
// Create and configure a binding for the service endpoint. Note: binding
// parameters are set here for clarity but these are already set in the
// generated configuration file
//
// The following properties are set
// AcceptCredentialsInUri (true) to enable credentials in the connection URI for AddServiceEndpoint
// PollingStatement
// PostPollStatement calls PROCESS_ACTIVITY on Oracle. This procedure moves the queried records to
// the ACCOUNTHISTORY table
// PollingInterval (15 seconds)
// TransactionIsolationLevel
OracleDBBinding binding = new OracleDBBinding();
// The Credentials are included in the Connection Uri so set this property true
binding.AcceptCredentialsInUri = true;
// Same as statement specified in Configure Adapter dialog box
binding.InboundOperationType = InboundOperation.Polling;
binding.PollingStatement = "SELECT * FROM ACCOUNTACTIVITY FOR UPDATE";
binding.PostPollStatement = "BEGIN ACCOUNT_PKG.PROCESS_ACTIVITY(); END;";
// Be sure to set the interval long enough to complete processing before
// the next poll
binding.PollingInterval = 15;
// Polling is transactional, be sure to set an adequate isolation level
// for your environment
binding.TransactionIsolationLevel = TransactionIsolationLevel.ReadCommitted;
// Add service endpoint: be sure to specify POLLINGSTMT_OperationGroup as the contract
srvHost.AddServiceEndpoint("POLLINGSTMT_OperationGroup", binding, serviceUri);
Console.WriteLine("Opening the service host");
// Open the service host to begin polling
srvHost.Open();
// Wait to receive request
Console.WriteLine("\nPolling started. Returned records will be written to the console.");
Console.WriteLine("Hit <RETURN> to stop polling");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Exception :" + e.Message);
Console.ReadLine();
/* If there is an Oracle Error it will be specified in the inner exception */
if (e.InnerException != null)
{
Console.WriteLine("InnerException: " + e.InnerException.Message);
Console.ReadLine();
}
}
finally
{
// IMPORTANT: you must close the ServiceHost to stop polling
if (srvHost.State == CommunicationState.Opened)
srvHost.Close();
else
srvHost.Abort();
}
}
}
}
Voir aussi
Développer des applications Oracle Database à l’aide du modèle de service WCF