BFILE в Oracle
Поставщик данных .NET Framework для Oracle содержит класс OracleBFile, который используется для работы с типом данных Oracle BFile.
Тип данных Oracle BFILE — это бизнес-тип Oracle, содержащий ссылку на двоичные данные с максимальным размером 4 гигабайта. Oracle BFILE отличается от других типов данных Oracle LOB в том, что его данные хранятся в физическом файле в операционной системе, а не на сервере. Обратите внимание, что тип данных BFILE предоставляет доступ только для чтения к данным.
Другие характеристики типа данных BFILE , отличающие его от бизнес-типа данных, являются следующими:
содержит неструктурированные данные;
поддерживает обработку данных на сервере в виде фрагментов;
использует ссылочную семантику копирования. Например, при выполнении операции копирования в BFILE копируется только указатель BFILE (который является ссылкой на файл). Данные файла не копируются.
Тип данных BFILE должен использоваться для ссылок на бизнес-объекты, которые имеют большой размер, и поэтому не является практическим для хранения в базе данных. Дополнительные затраты на клиент, сервер и обмен данными участвуют при использовании типа данных BFILE по сравнению с бизнес-типом данных. Более эффективно получить доступ к BFILE , если требуется получить только небольшой объем данных. Доступ к большим объектам, хранящимся в базе данных, эффективнее, если нужно получить весь объект целиком.
Каждый объект OracleBFile, отличный от NULL, связан с двумя сущностями, определяющими расположение базового физического файла:
Объект Oracle DIRECTORY, который является псевдонимом базы данных для каталога в файловой системе.
Имя файла базового физического файла, расположенного в каталоге, связанном с объектом DIRECTORY.
Пример
В следующем примере C# показано, как создать BFILE в таблице Oracle, а затем получить его в виде объекта OracleBFile . В примере демонстрируется использование OracleDataReader объекта и методов OracleBFile Seek и Read . Обратите внимание, что для использования этого примера необходимо сначала создать каталог с именем c:\\bfiles и файл с именем "MyFile.jpg" на сервере 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();
}
}