FILESTREAM-gegevens
Het FILESTREAM-opslagkenmerk is bedoeld voor binaire gegevens (BLOB) die zijn opgeslagen in een varbinary(max)
kolom. Voordat FILESTREAM binaire gegevens worden opgeslagen, is speciale verwerking vereist. Ongestructureerde gegevens, zoals tekstdocumenten, afbeeldingen en video, worden vaak buiten de database opgeslagen, waardoor het moeilijk te beheren is.
Notitie
U moet .NET Framework 3.5 SP1 (of hoger) installeren om te kunnen werken met FILESTREAM-gegevens met behulp van SqlClient.
Als u het kenmerk FILESTREAM opgeeft in een varbinary(max)
kolom, worden de gegevens in SQL Server opgeslagen in het lokale NTFS-bestandssysteem in plaats van in het databasebestand. Hoewel deze afzonderlijk wordt opgeslagen, kunt u dezelfde Transact-SQL-instructies gebruiken die worden ondersteund voor het werken met varbinary(max)
gegevens die zijn opgeslagen in de database.
SqlClient-ondersteuning voor FILESTREAM
De .NET Framework-gegevensprovider voor SQL Server ondersteunt System.Data.SqlClienthet lezen en schrijven van FILESTREAM-gegevens met behulp van de SqlFileStream klasse die is gedefinieerd in de System.Data.SqlTypes naamruimte. SqlFileStream
neemt over van de Stream klasse, die methoden biedt voor het lezen en schrijven naar gegevensstromen. Als u gegevens uit een stroom leest, worden gegevens uit de stroom overgedragen naar een gegevensstructuur, zoals een matrix van bytes. Het schrijven draagt de gegevens van de gegevensstructuur over in een stroom.
De SQL Server-tabel maken
Met de volgende Transact-SQL-instructies maakt u een tabel met de naam Werknemers en voegt u een rij met gegevens in. Zodra u FILESTREAM-opslag hebt ingeschakeld, kunt u deze tabel gebruiken in combinatie met de volgende codevoorbeelden.
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
Voorbeeld: FILESTREAM-gegevens lezen, overschrijven en invoegen
In het volgende voorbeeld ziet u hoe u gegevens kunt lezen uit een FILESTREAM. De code haalt het logische pad naar het bestand op, waarbij de FileAccess
instelling op Read
en op FileOptions
SequentialScan
. De code leest vervolgens de bytes van de SqlFileStream in de buffer. De bytes worden vervolgens naar het consolevenster geschreven.
Het voorbeeld laat ook zien hoe u gegevens schrijft naar een FILESTREAM waarin alle bestaande gegevens worden overschreven. De code haalt het logische pad naar het bestand op en maakt het SqlFileStream
, het instellen van en FileAccess
Write
het FileOptions
op SequentialScan
. Eén byte wordt naar het SqlFileStream
bestand geschreven, waarbij alle gegevens in het bestand worden vervangen.
In het voorbeeld ziet u ook hoe u gegevens naar een FILESTREAM schrijft met behulp van de methode Seek om gegevens toe te voegen aan het einde van het bestand. De code haalt het logische pad naar het bestand op en maakt het SqlFileStream
, het instellen van en FileAccess
ReadWrite
het FileOptions
op SequentialScan
. De code maakt gebruik van de methode Zoeken om naar het einde van het bestand te zoeken, waarbij één byte wordt toegevoegd aan het bestaande bestand.
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("...");
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();
}
}
}
}
Zie Binaire gegevens opslaan en ophalen in een bestandsstroomkolom voor een ander voorbeeld.
SQL Server-documentatiebronnen
De volledige documentatie voor FILESTREAM bevindt zich in de volgende secties van de SQL Server-documenten.
Onderwerp | Beschrijving |
---|---|
FILESTREAM (SQL Server) | Beschrijft wanneer u FILESTREAM-opslag gebruikt en hoe de SQL Server Database Engine wordt geïntegreerd met een NTFS-bestandssysteem. |
Clienttoepassingen maken voor FILESTREAM-gegevens | Beschrijft de Windows API-functies voor het werken met FILESTREAM-gegevens. |
FILESTREAM- en andere SQL Server-functies | Biedt overwegingen, richtlijnen en beperkingen voor het gebruik van FILESTREAM-gegevens met andere functies van SQL Server. |