Oracle BFILEs

O provedor de dados .NET Framework para Oracle inclui a classe OracleBFile, que é usada para trabalhar com os tipos de dados Oracle BFile.

O tipo de dados Oracle BFILE é uma categoria Oracle LOB que contém uma referência a dados binários com tamanho máximo de 4 gigabytes. Um Oracle BFILE difere de outros tipos de dados Oracle LOB porque seus dados são armazenados em um arquivo físico no sistema operacional, não no servidor. Observe que o tipo de dados BFILE fornece acesso do tipo somente leitura aos dados.

Outras características de um tipo de dados BFILE que o distinguem de um tipo de dados LOB é que ele:

  • Contém dados não estruturados.

  • Dá suporte a agrupamento do lado do servidor.

  • Usa semântica de cópia de referência. Por exemplo, se você executar uma operação de cópia em um BFILE, somente o localizador de BFILE (que é uma referência para o arquivo) será copiado. Os dados no arquivo não são copiados.

O tipo de dados BFILE deve ser usado para referenciar LOBs de tamanho grande e que por isso, seu armazenamento no banco de dados não é prático. Há mais sobrecarga de cliente, servidor e comunicação quando se usa um tipo de dados BFILE em comparação com o tipo de dados LOB. Se você só precisar de uma pequena quantidade de dados, é mais eficiente acessar um BFILE. Será mais eficiente acessar LOBs residentes em banco de dados se você precisar obter o objeto inteiro.

Cada objeto OracleBFile non-NULL está associado a duas entidades que definem o local do arquivo físico subjacente:

  1. Um objeto DIRECTORY da Oracle, que é um alias de banco de dados para um diretório no sistema de arquivos, e

  2. O nome de arquivo do arquivo físico subjacente, que está localizado no diretório associado ao objeto DIRECTORY.

Exemplo

O exemplo de C# a seguir demonstra como você pode criar um BFILE em uma tabela Oracle e recuperá-lo na forma de um objeto OracleBFile. O exemplo demonstra o uso do objeto OracleDataReader e do objeto OracleBFile Seek e Read. Observe que, para usar este exemplo, você deve primeiro criar um diretório chamado "c:\\bfiles" e um arquivo chamado "MyFile.jpg" no servidor Oracle.

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();  
   }  
  
}  

Confira também