Data FILESTREAM

Atribut úložiště FILESTREAM je určený pro binární data (BLOB) uložená ve sloupci varbinary(max) . Před fileSTREAMem se při ukládání binárních dat vyžadují speciální zpracování. Nestrukturovaná data, jako jsou textové dokumenty, obrázky a video, se často ukládají mimo databázi, což ztěžuje správu.

Poznámka:

Nainstalujte balíček NuGet Microsoft.Data.SqlClient, abyste mohli použít tento příklad. SqlFileStream vyžaduje systém Windows a integrované ověřování systému Windows.

Zadání atributu FILESTREAM ve varbinary(max) sloupci způsobí, že SQL Server uloží data do místního systému souborů NTFS místo do souboru databáze. I když je uložen samostatně, můžete použít stejné příkazy jazyka Transact-SQL, které jsou podporovány pro práci s daty uloženými varbinary(max) v databázi.

Podpora SQLClient pro FILESTREAM

Microsoft. Data.SqlClient podporuje čtení a zápis do dat FILESTREAM pomocí SqlFileStream třídy definované v Microsoft.Data.SqlTypes oboru názvů. SqlFileStream dědí z Stream třídy, která poskytuje metody pro čtení a zápis do datových proudů. Čtení z datového proudu přenáší data z datového proudu do datové struktury, jako je například pole bajtů. Zápis přenáší data z datové struktury do datového proudu.

Vytvoření tabulky SQL Serveru

Následující příkazy Jazyka Transact-SQL vytvoří tabulku s názvem employees a vloží řádek dat. Jakmile povolíte úložiště FILESTREAM, můžete tuto tabulku použít ve spojení s následujícími příklady kódu.

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

Příklad: Čtení, přepsání a vkládání dat FILESTREAM

Následující ukázka ukazuje, jak číst data ze FILESTREAM. Kód získá logickou cestu k souboru, nastaví FileAccess na Read a FileOptions na .SequentialScan Kód pak přečte bajty z SqlFileStream do vyrovnávací paměti. Bajty se pak zapíšou do okna konzoly.

Ukázka také ukazuje, jak zapisovat data do FILESTREAM, ve kterém jsou všechna existující data přepsána. Kód získá logickou cestu k souboru a vytvoří SqlFileStream, nastaví FileAccess na Write a FileOptions na SequentialScan. Jeden bajt se zapíše do SqlFileStreamsouboru a nahradí všechna data v souboru.

Ukázka také ukazuje, jak zapisovat data do FILESTREAM pomocí metody Seek, aby bylo možné připojit data na konec souboru. Kód získá logickou cestu k souboru a vytvoří SqlFileStream, nastaví FileAccess na ReadWrite a FileOptions na SequentialScan. Kód používá metodu Seek k posunu na konec souboru a k existujícímu souboru připojí jeden bajt.

using System;
using Microsoft.Data.SqlClient;
using Microsoft.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();
            }

        }
    }
}

Zdroje dokumentace k SQL Serveru

Kompletní dokumentace pro FILESTREAM se nachází v následujících částech dokumentace k SQL Serveru.

Téma Popis
FILESTREAM (SQL Server) Popisuje, kdy použít fileSTREAM úložiště a jak se integruje databázový stroj SQL Serveru se systémem souborů NTFS.
Vytváření klientských aplikací pro data FILESTREAM Popisuje funkce rozhraní API systému Windows pro práci s daty FILESTREAM.
FILESTREAM a další funkce SQL Serveru Poskytuje důležité informace, pokyny a omezení pro používání dat FILESTREAM s dalšími funkcemi SQL Serveru.

Viz také