Sdílet prostřednictvím


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:

Abyste mohli pracovat s daty FILESTREAM pomocí SqlClient, musíte nainstalovat rozhraní .NET Framework 3.5 SP1 (nebo novější).

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

Rozhraní .NET Framework Zprostředkovatel dat pro SQL Server System.Data.SqlClientpodporuje čtení a zápis do dat FILESTREAM pomocí SqlFileStream třídy definované v System.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 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 vyhledání na konec souboru a k existujícímu souboru připojí jeden bajt.

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();
            }

        }
    }
}

Další ukázku najdete v tématu Ukládání a načítání binárních dat do sloupce datového proudu souboru.

Prostředky 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é