Delen via


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 SqlFileStreambestand 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.

Zie ook