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:
Um objeto DIRECTORY da Oracle, que é um alias de banco de dados para um diretório no sistema de arquivos, e
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();
}
}