Condividi tramite


Completare le operazioni sulle tabelle con tipi di dati di grandi dimensioni in Oracle Database usando il modello di servizio WCF

Questa sezione contiene informazioni su come richiamare le operazioni ReadLOB e UpdateLOB dal modello di servizio WCF. Le operazioni ReadLOB e UpdateLOB vengono visualizzate per tabelle e viste che contengono colonne LOB; ovvero colonne utilizzate per archiviare dati LOB (Oracle Large Object). Per una panoramica dei tipi di dati LOB Oracle supportati dall'adapter Microsoft BizTalk per Oracle Database e delle operazioni ReadLOB e UpdateLOB, vedere Operazioni su tabelle e viste contenenti dati LOB in Oracle Database.

Importante

Le colonne di dati LOB possono contenere grandi quantità di dati, fino a 4 gigabyte (GB). Una limitazione significativa dell'uso di un client WCF per operare sulle colonne LOB è che il modello di servizio WCF supporta solo lo streaming di dati nell'operazione ReadLOB, non nell'operazione UpdateLOB. Poiché WCF richiede che lo streaming funzioni dal modello di servizio, il parametro da trasmettere deve essere l'unico parametro nella direzione. L'operazione UpdateLOB ha altri due parametri IN (un nome di colonna e un filtro di riga) oltre ai dati LOB; per questo motivo, lo streaming non è supportato nel modello di servizio WCF. Pertanto, se si aggiorna una colonna LOB con una grande quantità di dati, è possibile usare il modello di canale WCF. Per altre informazioni su come usare il modello di canale WCF per trasmettere dati LOB tramite l'operazione UpdateLOB, vedere Streaming dei tipi di dati LOB Oracle tramite il modello di canale WCF.

Informazioni sugli esempi usati in questo argomento

Gli esempi in questo argomento usano la tabella /SCOTT/CUSTOMER. Questa tabella contiene una colonna BLOB denominata PHOTO. Uno script per generare questa tabella viene fornito con gli esempi dell'SDK. Per altre informazioni sugli esempi dell'SDK, vedere Esempi nell'SDK.

Classe client WCF

Nell'esempio seguente vengono illustrate le firme del metodo per una classe client WCF generata per le operazioni ReadLOB e UpdateLOB nella tabella /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);  
}  

Nota

Si noti che ReadLOB restituisce un flusso di dati, ma updateLOB non opera su un flusso.

Richiamo delle operazioni ReadLOB e UpdateLOB

Entrambi i metodi ReadLOB e UpdateLOB possono funzionare solo su una singola colonna LOB in una singola riga di database. Impostare i parametri seguenti per identificare la colonna/riga di destinazione.

Parametro Definizione
LOB_COLUMN Nome della colonna di destinazione all'interno della riga identificata dal parametro FILTER; ad esempio "PHOTO".
FILTER Contenuto di una clausola WHERE dell'istruzione SQL SELECT che specifica la riga di destinazione; ad esempio "NAME='Kim Ralls'". Il filtro deve specificare una sola riga. Se il filtro corrisponde a più righe:

- ReadLOB restituisce i dati LOB per la prima riga corrispondente.
- UpdateLOB genera un'eccezione.

Nota

Il flusso restituito da ReadLOB non supporta Seek. Ciò significa che le proprietà come Length non sono supportate.

Attenzione

L'operazione UpdateLOB deve essere eseguita all'interno di un ambito di transazione. Inoltre, la proprietà di associazione UseAmbientTransaction deve essere impostata su true prima di eseguire l'operazione UpdateLOB .

Il codice seguente illustra come usare un client WCF per aggiornare la colonna BLOB PHOTO nella tabella /SCOTT/CUSTOMER da un file e leggere nuovamente i dati della nuova colonna in un file. È possibile trovare un esempio completo negli esempi dell'SDK. Per altre informazioni sugli esempi dell'SDK, vedere Esempi nell'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);  
            }  
        }  
    }  
}  

Vedere anche

Sviluppare applicazioni di database Oracle usando il modello di servizio WCF