Az Oracle .NET-keretrendszer adatszolgáltatója tartalmazza az OracleBFile osztályt, amely az Oracle-adattípus BFile kezelésére szolgál.
Az Oracle BFILE adattípus egy Oracle LOB adattípus, amely legfeljebb 4 gigabájt méretű bináris adatokra mutató hivatkozást tartalmaz. Az Oracle BFILE abban különbözik a többi Oracle LOB-adattípustól , hogy az adatok fizikai fájlban vannak tárolva az operációs rendszerben, nem pedig a kiszolgálón. Vegye figyelembe, hogy a BFILE adattípus írásvédett hozzáférést biztosít az adatokhoz.
A BFILE adattípus egyéb jellemzői, amelyek megkülönböztetik a LOB adattípustól, a következők:
Strukturálatlan adatokat tartalmaz.
Támogatja a kiszolgálóoldali adattömb-készítést.
Hivatkozásmásolási szemantikát használ. Ha például másolási műveletet hajt végre egy BFILE-on, a program csak a BFILE keresőt (amely a fájlra mutató hivatkozás) másolja. A fájlban lévő adatok másolása nem történik meg.
A BFILE adattípust nagy méretű, ezért az adatbázisban való tárolásra nem célszerű hivatkozni. A BFILE adattípus és a LOB adattípus használata esetén további ügyfél-, kiszolgáló- és kommunikációs többletterhelések jelentkeznek. Hatékonyabb a BFILE elérése, ha csak kis mennyiségű adatot kell beszereznie. Ha a teljes objektumot le kell szereznie, hatékonyabb az adatbázis-rezidens LOB-k elérése.
Minden nem NULL értékű OracleBFile objektum két olyan entitáshoz van társítva, amelyek meghatározzák a mögöttes fizikai fájl helyét:
Oracle DIRECTORY-objektum, amely a fájlrendszer egy könyvtárának adatbázis-aliasa, és
A mögöttes fizikai fájl fájlneve, amely a CÍMTÁR-objektumhoz társított könyvtárban található.
Példa
Az alábbi C#-példa bemutatja, hogyan hozhat létre BFILE-t egy Oracle-táblában, majd hogyan kérdezheti le OracleBFile-objektum formájában. A példa az objektum és az OracleDataReader OracleBFile Keresési és Olvasási metódusok használatát mutatja be. Vegye figyelembe, hogy a minta használatához először létre kell hoznia egy "c:\bfiles" nevű könyvtárat és egy "MyFile.jpg" nevű fájlt az Oracle-kiszolgálón.
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();
}
}