Oracle BFILEs
.NET Framework-dataprovidern för Oracle innehåller OracleBFile klassen som används för att arbeta med Oracle-datatypen BFile .
Oracle BFILE-datatypen är en Oracle LOB-datatyp som innehåller en referens till binära data med en maximal storlek på 4 gigabyte. Oracle BFILE skiljer sig från andra Oracle LOB-datatyper eftersom dess data lagras i en fysisk fil i operativsystemet i stället för på servern. Observera att BFILE-datatypen ger skrivskyddad åtkomst till data.
Andra egenskaper hos en BFILE-datatyp som skiljer den från en LOB-datatyp är att den:
Innehåller ostrukturerade data.
Stöder segmentering på serversidan.
Använder referenskopieringssemantik. Om du till exempel utför en kopieringsåtgärd på en BFILE kopieras endast BFILE-positioneraren (som är en referens till filen). Data i filen kopieras inte.
BFILE-datatypen bör användas för att referera till LOB som är stora och därför inte praktiskt att lagra i databasen. Mer klient-, server- och kommunikationskostnader ingår när du använder en BFILE-datatyp jämfört med LOB-datatypen . Det är mer effektivt att komma åt en BFILE om du bara behöver hämta en liten mängd data. Det är mer effektivt att få åtkomst till databasbaserade lob-platser om du behöver hämta hela objektet.
Varje OracleBFile-objekt som inte är NULL associeras med två entiteter som definierar platsen för den underliggande fysiska filen:
Ett Oracle DIRECTORY-objekt, som är ett databasalias för en katalog i filsystemet, och
Filnamnet på den underliggande fysiska filen, som finns i katalogen som är associerad med DIRECTORY-objektet.
Exempel
I följande C#-exempel visas hur du kan skapa en BFILE i en Oracle-tabell och sedan hämta den i form av ett OracleBFile-objekt . Exemplet visar hur du använder objekt- OracleDataReader och OracleBFile Seek- och Read-metoderna. Observera att om du vill använda det här exemplet måste du först skapa en katalog med namnet "c:\\bfiles" och filen med namnet "MyFile.jpg" på Oracle-servern.
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();
}
}