Share via


FILESTREAM-gegevens

ADO.NET downloaden

Het FILESTREAM-opslagkenmerk is bedoeld voor binaire gegevens (BLOB) die zijn opgeslagen in een varbinary(max)-kolom. Voordat FILESTREAM werd geïntroduceerd, was er voor het opslaan van binaire gegevens speciale verwerking vereist. Ongestructureerde gegevens, zoals tekstdocumenten, afbeeldingen en video, worden vaak buiten de database opgeslagen, waardoor het moeilijk te beheren is.

Opmerking

U moet .NET Framework 3.5 SP1 (of hoger) of .NET Core installeren om te werken met FILESTREAM-gegevens met behulp van SqlClient.

Als u het KENMERK FILESTREAM opgeeft in een varbinary(max)-kolom, worden de gegevens 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 varbinaire(max) gegevens die zijn opgeslagen in de database.

SqlClient-ondersteuning voor FILESTREAM

De Microsoft SqlClient-gegevensprovider voor SQL Server ondersteunt Microsoft.Data.SqlClienthet lezen en schrijven naar 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 met de volgende codevoorbeelden. De koppelingen naar resources in SQL Server Books Online bevinden zich aan het einde van dit artikel.

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 verkrijgt het logische pad naar het bestand en stelt FileAccess in op Read, en FileOptions op 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 SqlFileStream, waarbij FileAccess op Write en FileOptions op SequentialScan wordt ingesteld. 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 de SqlFileStream, stelt de FileAccess in op ReadWrite en de 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 Microsoft.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;Encrypt=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();
            }

        }
    }
}

Zie Binaire gegevens opslaan en ophalen in een bestandsstroomkolom voor een ander voorbeeld.

Bronnen in SQL Server Books Online

De volledige documentatie voor FILESTREAM bevindt zich in de volgende secties in SQL Server Books Online.

Article Description
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.

Volgende stappen