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.
Nota |
---|
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. |
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. |
|
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. |
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)