Oggetti BFILE Oracle

Il provider di dati .NET Framework per Oracle include la classe OracleBFile, usata per i tipi di dati BFile Oracle.

Il tipo di dati BFILE Oracle è un tipo di dati LOB Oracle che contiene un riferimento ai dati binari con una dimensione massima di 4 gigabyte. Un BFILE di Oracle differisce da altri tipi di dati LOB Oracle in quanto i relativi dati vengono archiviati in un file fisico nel sistema operativo anziché nel server. Si noti che il tipo di dati BFILE fornisce l'accesso in sola lettura ai dati.

Altre caratteristiche di un tipo di dati BFILE che lo distinguono da un tipo di dati LOB sono:

  • Contiene dati non strutturati.

  • Supporta il chunking sul lato server.

  • Usa la semantica di copia di riferimenti. Ad esempio, se si esegue un'operazione di copia su un BFILE, viene copiato solo il localizzatore BFILE, ovvero un riferimento al file. I dati nel file non vengono copiati.

Il tipo di dati BFILE deve essere usato per fare riferimento a LOB di grandi dimensioni e pertanto non è pratico archiviarlo nel database. L'utilizzo di un tipo di dati BFILE provoca un sovraccarico su client, server e comunicazioni rispetto al tipo di dati LOB. È preferibile accedere a un BFILE se è necessario ottenere solo una quantità di dati limitata. Se è necessario ottenere l'intero oggetto, è opportuno accedere a LOB residenti nel database.

Ciascun oggetto OracleBFile non NULL è associato a due entità che definiscono la posizione del file fisico sottostante:

  1. Un oggetto DIRECTORY Oracle, che è un alias del database per una directory nel file system e

  2. Il nome del file fisico sottostante, che si trova nella directory associata all'oggetto DIRECTORY.

Esempio

Nell'esempio in C# seguente viene illustrato come creare un BFILE in una tabella Oracle, quindi come recuperarlo sotto forma di oggetto OracleBFile. Nell'esempio viene illustrato l'utilizzo dell'oggetto OracleDataReader e dei metodi OracleBFileSeek eRead. Notare che per usare questo esempio, è innanzitutto necessario creare sul server Oracle una directory denominata "c:\\bfiles" e un file denominato "MyFile.jpg".

using System;  
using System.IO;  
using System.Data;  
using System.Data.OracleClient;  
  
public class Sample  
{  
   public static void Main(string[] args)  
   {  
      OracleConnection connection = new OracleConnection(  
        "Data Source=Oracle8i;Integrated Security=yes");  
      connection.Open();  
  
      OracleCommand command = connection.CreateCommand();  
      command.CommandText =
        "CREATE or REPLACE DIRECTORY MyDir as 'c:\\bfiles'";  
      command.ExecuteNonQuery();  
      command.CommandText =
        "DROP TABLE MyBFileTable";  
      try {  
        command.ExecuteNonQuery();  
      }  
      catch {  
      }  
      command.CommandText =
        "CREATE TABLE MyBFileTable(col1 number, col2 BFILE)";  
      command.ExecuteNonQuery();  
      command.CommandText =
        "INSERT INTO MyBFileTable values ('2', BFILENAME('MyDir', " +  
        "'MyFile.jpg'))";  
      command.ExecuteNonQuery();  
      command.CommandText = "SELECT * FROM MyBFileTable";  
  
        byte[] buffer = new byte[100];  
  
      OracleDataReader reader = command.ExecuteReader();  
      using (reader) {  
          if (reader.Read()) {  
                OracleBFile bFile = reader.GetOracleBFile(1);  
                using (bFile) {  
                  bFile.Seek(0, SeekOrigin.Begin);  
                  bFile.Read(buffer, 0, 100);  
              }  
          }  
      }  
  
      connection.Close();  
   }  
  
}  

Vedi anche