Dati FILESTREAMFILESTREAM Data

L'attributo di archiviazione FILESTREAM è per i dati (BLOB) binari archiviati in una colonna varbinary(max).The FILESTREAM storage attribute is for binary (BLOB) data stored in a varbinary(max) column. Prima di FILESTREAM, l'archiviazione dei dati binari richiedeva una gestione speciale.Before FILESTREAM, storing binary data required special handling. I dati non strutturati, come documenti di testo, immagini e video, sono spesso archiviati fuori dal database e questo ne rende complessa la gestione.Unstructured data, such as text documents, images and video, is often stored outside of the database, making it difficult to manage.

Nota

Per usare i dati FILESTREAM con SqlClient, è necessario installare .NET Framework 3.5 SP1 (o versione successiva).You must install the .NET Framework 3.5 SP1 (or later) to work with FILESTREAM data using SqlClient.

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.Specifying the FILESTREAM attribute on a varbinary(max) column causes SQL Server to store the data on the local NTFS file system instead of in the database file. Sebbene vengano archiviati separatamente, è possibile usare le stesse istruzioni Transact-SQLTransact-SQL supportate per l'uso di dati varbinary(max) archiviati nel database.Although it is stored separately, you can use the same Transact-SQLTransact-SQL statements that are supported for working with varbinary(max) data that is stored in the database.

Supporto di SqlClient per FILESTREAMSqlClient Support for FILESTREAM

Il .NET Framework.NET Framework Provider di dati per SQL Server System.Data.SqlClient, supporta la lettura e scrittura di dati FILESTREAM usando la SqlFileStream classe definita nel System.Data.SqlTypes dello spazio dei nomi.The .NET Framework.NET Framework Data Provider for SQL Server, System.Data.SqlClient, supports reading and writing to FILESTREAM data using the SqlFileStream class defined in the System.Data.SqlTypes namespace. SqlFileStream eredita dalla classe Stream che fornisce metodi per la lettura e la scrittura nei flussi di dati.SqlFileStream inherits from the Stream class, which provides methods for reading and writing to streams of data. La lettura da un flusso comporta il trasferimento dei dati dal flusso in una struttura di dati, ad esempio una matrice di byte.Reading from a stream transfers data from the stream into a data structure, such as an array of bytes. La scrittura comporta il trasferimento dei dati dalla struttura di dati in un flusso.Writing transfers the data from the data structure into a stream.

Creazione di una tabella SQL ServerCreating the SQL Server Table

Le istruzioni Transact-SQLTransact-SQL seguenti consentono di creare una tabella denominata employees e di inserire una riga di dati.The following Transact-SQLTransact-SQL statements creates a table named employees and inserts a row of data. Dopo avere abilitato l'archiviazione FILESTREAM, è possibile usare questa tabella insieme agli esempi di codice seguenti.Once you have enabled FILESTREAM storage, you can use this table in conjunction with the code examples that follow. I collegamenti alle risorse nella documentazione Online di SQL Server si trovano alla fine di questo argomento.The links to resources in SQL Server Books Online are located at the end of this topic.

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: lettura, sovrascrittura e inserimento di dati FILESTREAMExample: Reading, Overwriting, and Inserting FILESTREAM Data

Nell'esempio seguente viene illustrato come leggere i dati da FILESTREAM.The following sample demonstrates how to read data from a FILESTREAM. Il codice consente di ottenere il percorso logico del file, impostando FileAccess su Read e FileOptions su SequentialScan.The code gets the logical path to the file, setting the FileAccess to Read and the FileOptions to SequentialScan. Tramite il codice vengono quindi letti i byte da SqlFileStream nel buffer.The code then reads the bytes from the SqlFileStream into the buffer. I byte vengono infine scritti nella finestra della console.The bytes are then written to the console window.

Nell'esempio seguente viene illustrato come scrivere dati in un oggetto FILESTREAM nel quale vengono sovrascritti tutti i dati esistenti.The sample also demonstrates how to write data to a FILESTREAM in which all existing data is overwritten. Il codice consente di ottenere il percorso logico del file e di creare SqlFileStream, impostando FileAccess su Write e FileOptions su SequentialScan.The code gets the logical path to the file and creates the SqlFileStream, setting the FileAccess to Write and the FileOptions to SequentialScan. Un singolo byte viene scritto in SqlFileStream, sostituendo tutti i dati nel file.A single byte is written to the SqlFileStream, replacing any data in the file.

Nell'esempio viene illustrato anche come scrivere i dati in un oggetto FILESTREAM usando il metodo Seek per aggiungere i dati alla fine del file.The sample also demonstrates how to write data to a FILESTREAM by using the Seek method to append data to the end of the file. Il codice consente di ottenere il percorso logico del file e di creare SqlFileStream, impostando FileAccess su ReadWrite e FileOptions su SequentialScan.The code gets the logical path to the file and creates the SqlFileStream, setting the FileAccess to ReadWrite and the FileOptions to SequentialScan. Nel codice viene usato il metodo Seek per cercare la fine del file e viene aggiunto un singolo byte al file esistente.The code uses the Seek method to seek to the end of the file, appending a single byte to the existing file.

using System;  
using System.Data.SqlClient;  
using System.Data.SqlTypes;  
using System.Data;  
using System.IO;  

namespace FileStreamTest  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("server=(local);integrated security=true;database=myDB");  
            ReadFilestream(builder);  
            OverwriteFilestream(builder);  
            InsertFilestream(builder);  

            Console.WriteLine("Done");  
        }  

        private static void ReadFilestream(SqlConnectionStringBuilder connStringBuilder)  
        {  
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))  
            {  
                connection.Open();  
                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);  

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

                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  
                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Read, FileOptions.SequentialScan, allocationSize: 0))  
                        {  
                            // Read the contents as bytes and write them to the console  
                            for (long index = 0; index < fileStream.Length; index++)  
                            {  
                                Console.WriteLine(fileStream.ReadByte());  
                            }  
                        }  
                    }  
                }  
                tran.Commit();  
            }  
        }  

        private static void OverwriteFilestream(SqlConnectionStringBuilder connStringBuilder)  
        {  
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))  
            {  
                connection.Open();  

                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);  

                SqlTransaction tran = connection.BeginTransaction(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  
                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write, FileOptions.SequentialScan, allocationSize: 0))  
                        {  
                            // Write a single byte to the file. This will  
                            // replace any data in the file.  
                            fileStream.WriteByte(0x01);  
                        }  
                    }  
                }  
                tran.Commit();  
            }  
        }  

        private static void InsertFilestream(SqlConnectionStringBuilder connStringBuilder)  
        {  
            using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))  
            {  
                connection.Open();  

                SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);  

                SqlTransaction tran = connection.BeginTransaction(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;  

                        using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.ReadWrite, FileOptions.SequentialScan, allocationSize: 0))  
                        {  
                            // Seek to the end of the file  
                            fileStream.Seek(0, SeekOrigin.End);  

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

        }  
    }  
}

Per un altro esempio, vedere come archiviare e recuperare dati binari in una colonna del flusso di file.For another sample, see How to store and fetch binary data into a file stream column.

Risorse nella documentazione online di SQL ServerResources in SQL Server Books Online

Nelle sezioni seguenti nella documentazione Online di SQL Server si trova la documentazione completa per FILESTREAM.The complete documentation for FILESTREAM is located in the following sections in SQL Server Books Online.

ArgomentoTopic DescrizioneDescription
Progettazione e implementazione di archiviazione FILESTREAMDesigning and Implementing FILESTREAM Storage Vengono forniti collegamenti alla documentazione relativa a FILESTREAM e ad argomenti correlati.Provides links to FILESTREAM documentation and related topics.
Panoramica di FILESTREAMFILESTREAM Overview Viene descritto quando usare l'archiviazione FILESTREAM e come questa consente l'integrazione del Motore di database di SQL Server con un file system NTFS.Describes when to use FILESTREAM storage and how it integrates the SQL Server Database Engine with an NTFS file system.
Introduzione all'archiviazione FILESTREAMGetting Started with FILESTREAM Storage 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.Describes how to enable FILESTREAM on an instance of SQL Server, how to create a database and a table to stored FILESTREAM data, and how to manipulate rows containing FILESTREAM data.
Utilizzo dell'archiviazione FILESTREAM nelle applicazioni ClientUsing FILESTREAM Storage in Client Applications Vengono descritte le funzioni dell'API Win32 per l'uso dei dati FILESTREAM.Describes the Win32 API functions for working with FILESTREAM data.
FILESTREAM e altre funzionalità di SQL ServerFILESTREAM and Other SQL Server Features Vengono illustrate considerazioni, linee guida e limitazioni per l'uso di dati FILESTREAM con le altre funzionalità di SQL Server.Provides considerations, guidelines and limitations for using FILESTREAM data with other features of SQL Server.

Vedere ancheSee Also

Tipi di dati SQL Server e ADO.NETSQL Server Data Types and ADO.NET
Recupero e modifica di dati in ADO.NETRetrieving and Modifying Data in ADO.NET
Sicurezza dell'accesso di codice e ADO.NETCode Access Security and ADO.NET
Dati binari e con valori elevati SQL ServerSQL Server Binary and Large-Value Data
Provider gestiti ADO.NET e Centro per sviluppatori di set di datiADO.NET Managed Providers and DataSet Developer Center