Nel precedente post abbiamo visto come creare una tabella per archiviare files veri e propri direttamente all'interno di una base di dati Oracle; oggi (come promesso), vediamo come utilizzare le classi della libreria ODP.NET (Oracle Data Provider for .NET) per la lettura dei dati presenti in un campo blob e per il successivo salvataggio di questi dati sul file system.
Prendendo spunto dalla tabella creata, questo il codice per la lettura e il salvataggio del file dalla base di dati al file system:

C#

using Oracle.DataAccess.Client;

using Oracle.DataAccess.Types;

public void Page_Load(Object sender, EventArgs e)
{
string strConn = "Data Source=Test;User Id=Test;Password=Test;";
string query = "SELECT fileName, file FROM provaBlob WHERE fileName='prova.xml'";
OracleConnection conn = null;
OracleCommand cmd = null;
try
{
using(conn = new OracleConnection(strConn))
{
using(cmd = new OracleCommand(query, conn))
{
OracleDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
OracleBlob blob = reader.GetOracleBlob(1);
string fileName = reader["fileName"]
CreateFile(fileName, blob);
}
reader.Close();
}
}
}
catch(Exception exe)
{ //Gestione eccezioni ... } }

private void CreateFile(OracleBlob blob, string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.CreateNew);
byte[] buffer = new byte[blob.Length];
int bytesRead = 0;
bytesRead = blob.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
fs.Write(buffer, 0, bytesRead);
bytesRead = blob.Read(buffer, 0, buffer.Length);
}
}

VB.NET
Imports Oracle.DataAccess.Client

Imports Oracle.DataAccess.Types;

Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

Dim strConn As String = "Data Source=Test;User Id=Test;Password=Test;"
Dim conn As New OracleConnection(strConn)
Dim query As String = "SELECT fileName, file FROM provaBlob WHERE fileName='prova.xml'"
Dim cmd As New OracleCommand(query, conn)
Try
conn.Open();
Dim reader As OracleDataReader = cmd.ExecuteReader()
While reader.Read()
Dim blob As OracleBlob = reader.GetOracleBlob(1)
Dim fileName As String = reader["fileName"]
CreateFile(fileName, blob);
End While
reader.Close();
conn.Close();
Catch ex As Exception
'Gestione eccezioni ... Finally
conn.Dispose()
cmd.Dispose()
End Try

End Sub

Private Sub CreateFile(ByVal blob As OracleBlob, ByVal fileName As String)

Dim fs As New FileStream(fileName, FileMode.CreateNew);
Dim buffer As Byte() = new byte(blob.Length);
Dim bytesRead As Integer = 0
bytesRead = blob.Read(buffer, 0, buffer.Length)
While bytesRead > 0
fs.Write(buffer, 0, bytesRead)
bytesRead = blob.Read(buffer, 0, buffer.Length)
End While

End Sub