Dela via


FILESTREAM-data

FILESTREAM-lagringsattributet är för binära data (BLOB) som lagras i en varbinary(max) kolumn. Före FILESTREAM krävde lagring av binära data särskild hantering. Ostrukturerade data, till exempel textdokument, bilder och video, lagras ofta utanför databasen, vilket gör det svårt att hantera.

Kommentar

Du måste installera .NET Framework 3.5 SP1 (eller senare) för att arbeta med FILESTREAM-data med hjälp av SqlClient.

Om du anger attributet FILESTREAM i en varbinary(max) kolumn kan SQL Server lagra data i det lokala NTFS-filsystemet i stället för i databasfilen. Även om den lagras separat kan du använda samma Transact-SQL-instruktioner som stöds för att arbeta med varbinary(max) data som lagras i databasen.

SqlClient-stöd för FILESTREAM

.NET Framework-dataprovidern för SQL Server stöder System.Data.SqlClientläsning och skrivning till FILESTREAM-data med hjälp av klassen SqlFileStream som definierats i System.Data.SqlTypes namnområdet. SqlFileStream ärver från Stream klassen, vilket ger metoder för att läsa och skriva till dataströmmar. Läsning från en ström överför data från strömmen till en datastruktur, till exempel en matris med byte. När du skriver överförs data från datastrukturen till en dataström.

Skapa SQL Server-tabellen

Följande Transact-SQL-uttryck skapar en tabell med namnet employees och infogar en rad med data. När du har aktiverat FILESTREAM-lagring kan du använda den här tabellen tillsammans med de kodexempel som följer.

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

Exempel: Läsa, skriva över och infoga FILESTREAM-data

Följande exempel visar hur du läser data från en FILESTREAM. Koden hämtar den logiska sökvägen till filen och anger FileAccess till Read och FileOptions till SequentialScan. Koden läser sedan byteen från SqlFileStream till bufferten. Byte skrivs sedan till konsolfönstret.

Exemplet visar också hur du skriver data till en FILESTREAM där alla befintliga data skrivs över. Koden hämtar den logiska sökvägen till filen och skapar SqlFileStreaminställningen FileAccess , till Write och FileOptions till SequentialScan. En enda byte skrivs till SqlFileStreamoch ersätter alla data i filen.

Exemplet visar också hur du skriver data till en FILESTREAM med hjälp av metoden Sök för att lägga till data i slutet av filen. Koden hämtar den logiska sökvägen till filen och skapar SqlFileStreaminställningen FileAccess , till ReadWrite och FileOptions till SequentialScan. Koden använder metoden Sök för att söka till slutet av filen och lägger till en enda byte till den befintliga filen.

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

        }
    }
}

Ett annat exempel finns i Så här lagrar och hämtar du binära data i en filströmskolumn.

SQL Server-dokumentresurser

Den fullständiga dokumentationen för FILESTREAM finns i följande avsnitt i SQL Server-dokumenten.

Område beskrivning
FILESTREAM (SQL Server) Beskriver när du ska använda FILESTREAM-lagring och hur den integrerar SQL Server Database Engine med ett NTFS-filsystem.
Skapa klientprogram för FILESTREAM-data Beskriver Funktionerna i Windows API för att arbeta med FILESTREAM-data.
FILESTREAM och andra SQL Server-funktioner Innehåller överväganden, riktlinjer och begränsningar för att använda FILESTREAM-data med andra funktioner i SQL Server.

Se även