Dati FILESTREAM in SQL Server 2008 (ADO.NET)

In SQL Server 2008 viene introdotto l'attributo di archiviazione FILESTREAM per i dati binari (BLOB) archiviati in una colonna varbinary(max). In SQL Server è sempre stato possibile archiviare i dati binari, ma per il loro utilizzo era necessaria una gestione speciale. I dati non strutturati, come documenti di testo, immagini e video, sono spesso archiviati fuori dal database e questo ne rende complessa la gestione.

NotaNota

Per utilizzare i dati FILESTREAM con SqlClient, è necessario installare .NET Framework 3.5 SP1 (o versione successiva).

Se si specifica l'attributo FILESTREAM in una colonna varbinary(max), in SQL Server i dati vengono archiviati nel file system NTFS locale anziché nel file di database. Sebbene vengano archiviati separatamente, è possibile utilizzare le stesse istruzioni Transact-SQL supportate per l'utilizzo di dati varbinary(max) archiviati nel database.

Supporto di SqlClient per FILESTREAM

Il provider di dati .NET per SQL Server, System.Data.SqlClient, supporta la lettura e la scrittura nei dati FILESTREAM utilizzando la classe SqlFileStream definita nello spazio dei nomi System.Data.SqlTypes. SqlFileStream eredita dalla classe System.IO.Stream che fornisce metodi per la lettura e la scrittura nei flussi di dati. La lettura da un flusso comporta il trasferimento dei dati dal flusso in una struttura di dati, ad esempio una matrice di byte. La scrittura comporta il trasferimento dei dati dalla struttura di dati in un flusso.

Creazione di una tabella SQL Server

Le istruzioni Transact-SQL seguenti consentono di creare una tabella denominata employees e di inserire una riga di dati. Dopo avere abilitato l'archiviazione FILESTREAM, è possibile utilizzare questa tabella insieme agli esempi di codice seguenti. I collegamenti alle risorse della documentazione online di SQL Server 2008 sono disponibili alla fine di questo argomento.

CREATE TABLE employees
(
  EmployeeId INT  NOT NULL  PRIMARY KEY,
  Photo VARBINARY(MAX) FILESTREAM  NULL,
  RowGuid UNIQUEIDENTIFIER  NOT NULL  ROWGUIDCOL
  UNIQUE DEFAULT NEWID()
)
GO
Insert into employees
Values(1, 0x00, default)
GO

Esempio di lettura di dati FILESTREAM

Nel frammento di codice seguente viene illustrato come leggere i dati da FILESTREAM. Il codice consente di ottenere il percorso logico del file, impostando FileAccess su Read e FileOptions su SequentialScan. Tramite il codice vengono quindi letti i byte da SqlFileStream nel buffer. I byte vengono infine scritti nella finestra della console.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();
    SqlCommand command = new SqlCommand("", connection);

    SqlTransaction tran = connection.BeginTransaction(
       System.Data.IsolationLevel.ReadCommitted);
    command.Transaction = tran;

    command.CommandText = 
        "select Top(1) Photo.PathName(), " 
        + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Get the pointer for the file
            string path = reader.GetString(0);
            byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

            // Create the SqlFileStream
            FileStream fileStream = new SqlFileStream(path,
            (byte[])reader.GetValue(1),
                FileAccess.Read,
                FileOptions.SequentialScan, 0);

            // Read the contents as bytes and write them to the console
            for (long index = 0; index < fileStream.Length; index++)
            {
                Console.Write(fileStream.ReadByte());
            }
            fileStream.Close();
        }
    }
    tran.Commit();
}

Esempio di sovrascrittura di dati FILESTREAM

Nel frammento di codice seguente viene illustrato come scrivere dati in un oggetto FILESTREAM nel quale vengono sovrascritti tutti i dati esistenti. Il codice consente di ottenere il percorso logico del file e di creare SqlFileStream, impostando FileAccess su Write e FileOptions su SequentialScan. Un singolo byte viene scritto in SqlFileStream, sostituendo tutti i dati nel file.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();

    SqlCommand command = new SqlCommand("", connection);
    command.CommandText = "select Top(1) Photo.PathName(), "
    + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";

    SqlTransaction tran = connection.BeginTransaction(
        System.Data.IsolationLevel.ReadCommitted);
    command.Transaction = tran;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Get the pointer for file 
            string path = reader.GetString(0);
            byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

            // Create the SqlFileStream
            FileStream fileStream = new SqlFileStream(path,
                (byte[])reader.GetValue(1),
                FileAccess.Write,
                FileOptions.SequentialScan, 0);

            // Write a single byte to the file. This will
            // replace any data in the file.
            fileStream.WriteByte(0x01);

            fileStream.Close();
        }
    }
    tran.Commit();
}

Esempio di inserimento di dati FILESTREAM

Nell'esempio seguente viene illustrato come scrivere i dati in un oggetto FILESTREAM utilizzando il metodo Seek per aggiungere i dati alla fine del file. Il codice consente di ottenere il percorso logico del file e di creare SqlFileStream, impostando FileAccess su ReadWrite e FileOptions su SequentialScan. Nel codice viene utilizzato il metodo Seek per cercare la fine del file e viene aggiunto un singolo byte al file esistente.

using (SqlConnection connection = new SqlConnection(
    connStringBuilder.ToString()))
{
    connection.Open();

    SqlCommand command = new SqlCommand("", connection);
    command.CommandText = "select Top(1) Photo.PathName(), "
    + "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";

    SqlTransaction tran = connection.BeginTransaction(
        System.Data.IsolationLevel.ReadCommitted);
    command.Transaction = tran;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Get the pointer for file
            string path = reader.GetString(0);
            byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

            FileStream fileStream = new SqlFileStream(path,
                (byte[])reader.GetValue(1),
                FileAccess.ReadWrite,
                FileOptions.SequentialScan, 0);

            // Seek to the end of the file
            fs.Seek(0, SeekOrigin.End);

            // Append a single byte 
            fileStream.WriteByte(0x01);
            fileStream.Close();
        }
    }
    tran.Commit();
}

Risorse nella documentazione online di SQL Server

La documentazione completa per FILESTREAM è disponibile nelle sezioni seguenti della documentazione online di SQL Server 2008.

Argomento

Descrizione

Progettazione e implementazione di un'archiviazione FILESTREAM

Vengono forniti collegamenti alla documentazione relativa a FILESTREAM e ad argomenti correlati.

Panoramica di FILESTREAM

Viene descritto quando utilizzare l'archiviazione FILESTREAM e come questa consente l'integrazione del Motore di database di SQL Server con un file system NTFS.

Introduzione all'archiviazione FILESTREAM

Viene descritto come abilitare FILESTREAM in un'istanza di SQL Server, come creare un database e una tabella per archiviare i dati FILESTREAM e come modificare le righe che contengono dati FILESTREAM.

Utilizzo dell'archiviazione FILESTREAM nelle applicazioni client

Vengono descritte le funzioni dell'API Win32 per l'utilizzo dei dati FILESTREAM.

Utilizzo di FILESTREAM con altre funzionalità di SQL Server

Vengono illustrate considerazioni, linee guida e limitazioni per l'utilizzo di dati FILESTREAM con le altre funzionalità di SQL Server.

Vedere anche

Concetti

Sicurezza dall'accesso di codice e ADO.NET

Altre risorse

Tipi di dati SQL Server e ADO.NET

Recupero e modifica di dati in ADO.NET

Dati binari e con valori di grandi dimensioni SQL Server (ADO.NET)