Effectuer des opérations sur des tables avec des types de données volumineux dans Oracle Database à l’aide du modèle de service WCF
Cette section contient des informations sur l’appel des opérations ReadLOB et UpdateLOB à partir du modèle de service WCF. Les opérations ReadLOB et UpdateLOB sont exposées pour les tables et les vues qui contiennent des colonnes métier ; c’est-à-dire les colonnes utilisées pour stocker les données oracle de grands objets (LOB). Pour obtenir une vue d’ensemble des types de données LOB Oracle pris en charge par l’adaptateur Microsoft BizTalk pour Oracle Database et des opérations ReadLOB et UpdateLOB, consultez Opérations sur les tables et les vues qui contiennent des données métier dans Oracle Database.
Important
Les colonnes de données métier peuvent contenir de grandes quantités de données, jusqu’à 4 gigaoctets (Go). Une limitation importante de l’utilisation d’un client WCF pour fonctionner sur des colonnes métier est que le modèle de service WCF prend uniquement en charge la diffusion en continu des données sur l’opération ReadLOB, et non sur l’opération UpdateLOB. Cela est dû au fait que WCF exige que pour que la diffusion en continu fonctionne à partir du modèle de service, le paramètre à diffuser en continu doit être le seul paramètre dans sa direction. L’opération UpdateLOB a deux autres paramètres IN (un nom de colonne et un filtre de ligne) en plus des données métier ; Pour cette raison, la diffusion en continu n’est pas prise en charge dans le modèle de service WCF. Par conséquent, si vous mettez à jour une colonne métier avec une grande quantité de données, vous pouvez utiliser le modèle de canal WCF. Pour plus d’informations sur l’utilisation du modèle de canal WCF pour diffuser en continu des données métier à l’aide de l’opération UpdateLOB, consultez Streaming Oracle LOB Data Types by Using the WCF Channel Model.
À propos des exemples utilisés dans cette rubrique
Les exemples de cette rubrique utilisent la table /SCOTT/CUSTOMER. Cette table contient une colonne BLOB nommée PHOTO. Un script pour générer cette table est fourni avec les exemples sdk. Pour plus d’informations sur les exemples de KIT de développement logiciel (SDK), consultez Exemples dans le Kit de développement logiciel (SDK).
Classe de client WCF
L’exemple suivant montre les signatures de méthode pour une classe de client WCF générée pour les opérations ReadLOB et UpdateLOB sur la table /SCOTT/CUSTOMER.
public partial class SCOTTTableCUSTOMERClient : System.ServiceModel.ClientBase<SCOTTTableCUSTOMER>,
SCOTTTableCUSTOMER
{
public System.IO.Stream ReadLOB(string LOB_COLUMN, string FILTER);
public void UpdateLOB(string LOB_COLUMN, string FILTER, byte[] Stream);
}
Notes
Notez que ReadLOB renvoie un flux de données, mais que UpdateLOB ne fonctionne pas sur un flux.
Appel des opérations ReadLOB et UpdateLOB
Les méthodes ReadLOB et UpdateLOB ne peuvent fonctionner que sur une seule colonne métier dans une seule ligne de base de données. Vous définissez les paramètres suivants pour identifier la colonne/la ligne cible.
Paramètre | Définition |
---|---|
LOB_COLUMN | Nom de la colonne cible dans la ligne identifiée par le paramètre FILTER ; par exemple, « PHOTO ». |
FILTER | Le contenu d’une clause WHERE d’instruction SQL SELECT qui spécifie la ligne cible ; par exemple, « NAME='Kim Ralls' ». Le filtre doit spécifier une seule ligne. Si le filtre correspond à plusieurs lignes : - ReadLOB retourne des données métier pour la première ligne correspondante. - UpdateLOB lève une exception. |
Notes
Le flux retourné par ReadLOB ne prend pas en charge Seek. Cela signifie que les propriétés telles que Length ne sont pas non plus prises en charge.
Attention
L’opération UpdateLOB doit être effectuée dans une étendue de transaction. En outre, la propriété de liaison UseAmbientTransaction doit avoir la valeur true avant d’effectuer l’opération UpdateLOB .
Le code suivant montre comment utiliser un client WCF pour mettre à jour la colonne BLOB PHOTO dans la table /SCOTT/CUSTOMER à partir d’un fichier et lire les nouvelles données de colonne dans un fichier. Vous trouverez un exemple complet dans les exemples sdk. Pour plus d’informations sur les exemples de KIT de développement logiciel (SDK), consultez Exemples dans le Kit de développement logiciel (SDK).
using System;
using System.Collections.Generic;
using System.Text;
using System.Transaction;
// Include for file streaming
using System.IO;
// Add WCF, WCF LOB Adapter SDK, and Oracle Database adapter namepaces
using System.ServiceModel;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
// Include this namespace for the WCF channel model
using System.ServiceModel.Channels;
// Include this namespace for the WCF LOB Adapter SDK and Oracle Database adapter exceptions
using Microsoft.ServiceModel.Channels.Common;
using CustomerTablens = microsoft.lobservices.oracledb._2007._03;
namespace OracleLobOpsSnippetSM
{
class Program
{
static void Main(string[] args)
{
try
{
OracleDBBinding binding = new OracleDBBinding();
binding.UseAmbientTransaction = true; //set this to true for UpdateLOB operation
EndpointAddress endpointAddress = new EndpointAddress("oracleDB://ADAPTER");
using (SCOTTTableCUSTOMERClient customerTableClient =
new SCOTTTableCUSTOMERClient(binding, endpointAddress))
{
customerTableClient.ClientCredentials.UserName.UserName = "SCOTT";
customerTableClient.ClientCredentials.UserName.Password = "TIGER";
// Open the client to read the LOB data back
customerTableClient.Open();
// Add a photo to the customer record
using (FileStream fs = new FileStream("SamplePhoto.jpg", FileMode.Open))
{
Console.WriteLine("Updating photo");
int count = 0;
byte[] photo = new byte[fs.Length];
while ((count += fs.Read(photo, count, (int) (((fs.Length-count)>4096)? 4096:fs.Length-count))) \< fs.Length) ;
// UpdateLOB operation must be performed within a transaction scope
using(TransactionScope tx = new TransactionScope())
{
customerTableClient.UpdateLOB("PHOTO", "NAME='Kim Ralls'", photo);
Console.WriteLine("Photo updated");
tx.Complete();
}
}
// Read the data back and store it to another file
using (FileStream fs = new FileStream("PhotoCopy.jpg", FileMode.Create))
{
Console.WriteLine("Reading photo data");
Stream photoStream = customerTableClient.ReadLOB("PHOTO", "NAME='Kim Ralls'");
Console.WriteLine("Photo data read -- writing to PhotoCopy.jpg");
int count;
int length = 0;
byte[] buffer = new byte[4096];
while ((count = photoStream.Read(buffer, 0, 4096)) > 0)
{
fs.Write(buffer, 0, count);
length+=count;
}
Console.WriteLine("{0} bytes written to PhotoCopy.jpg", length);
}
}
Console.WriteLine("Photo updated and read back -- Hit <RETURN> to end");
Console.ReadLine();
}
catch (Exception ex)
{
// handle exception
Console.WriteLine("Exception caught: " + ex.Message);
}
}
}
}
Voir aussi
Développer des applications de base de données Oracle à l’aide du modèle de service WCF